Relro

Support HackTricks

Relro

RELRO significa Relocation Read-Only, e é um recurso de segurança usado em binários para mitigar os riscos associados a GOT (Global Offset Table) sobrescritas. Existem dois tipos de proteções RELRO: (1) Partial RELRO e (2) Full RELRO. Ambos reordenam a GOT e BSS de arquivos ELF, mas com resultados e implicações diferentes. Especificamente, eles colocam a seção GOT antes da BSS. Ou seja, GOT está em endereços mais baixos do que BSS, tornando impossível sobrescrever entradas de GOT ao transbordar variáveis na BSS (lembre-se de que a escrita na memória acontece de endereços mais baixos para mais altos).

Vamos dividir o conceito em seus dois tipos distintos para clareza.

Partial RELRO

Partial RELRO adota uma abordagem mais simples para aumentar a segurança sem impactar significativamente o desempenho do binário. Partial RELRO torna a .got somente leitura (a parte não-PLT da seção GOT). Tenha em mente que o restante da seção (como a .got.plt) ainda é gravável e, portanto, sujeito a ataques. Isso não impede que a GOT seja abusada por vulnerabilidades de escrita arbitrária.

Nota: Por padrão, o GCC compila binários com Partial RELRO.

Full RELRO

Full RELRO aumenta a proteção ao tornar toda a GOT (tanto .got quanto .got.plt) e a seção .fini_array completamente somente leitura. Uma vez que o binário é iniciado, todos os endereços de função são resolvidos e carregados na GOT, então, a GOT é marcada como somente leitura, efetivamente impedindo quaisquer modificações durante a execução.

No entanto, a desvantagem do Full RELRO está em termos de desempenho e tempo de inicialização. Como precisa resolver todos os símbolos dinâmicos na inicialização antes de marcar a GOT como somente leitura, binários com Full RELRO habilitado podem experimentar tempos de carregamento mais longos. Essa sobrecarga adicional na inicialização é a razão pela qual o Full RELRO não é habilitado por padrão em todos os binários.

É possível verificar se o Full RELRO está habilitado em um binário com:

readelf -l /proc/ID_PROC/exe | grep BIND_NOW

Bypass

Se o Full RELRO estiver habilitado, a única maneira de contorná-lo é encontrar outra forma que não precise escrever na tabela GOT para obter execução arbitrária.

Note que o GOT da LIBC geralmente é Partial RELRO, então pode ser modificado com uma escrita arbitrária. Mais informações em Targetting libc GOT entries.

Support HackTricks

Last updated