Relro

Support HackTricks

Relro

RELRO significa Relocation Read-Only, y es una característica de seguridad utilizada en binarios para mitigar los riesgos asociados con los sobrescrituras de GOT (Global Offset Table). Hay dos tipos de protecciones RELRO: (1) Partial RELRO y (2) Full RELRO. Ambos reordenan la GOT y BSS de los archivos ELF, pero con diferentes resultados e implicaciones. Específicamente, colocan la sección GOT antes de la BSS. Es decir, GOT está en direcciones más bajas que BSS, lo que hace imposible sobrescribir las entradas de GOT al desbordar variables en la BSS (recuerda que escribir en memoria ocurre de direcciones más bajas a más altas).

Desglosemos el concepto en sus dos tipos distintos para mayor claridad.

Partial RELRO

Partial RELRO adopta un enfoque más simple para mejorar la seguridad sin afectar significativamente el rendimiento del binario. Partial RELRO hace que la .got sea de solo lectura (la parte no-PLT de la sección GOT). Ten en cuenta que el resto de la sección (como la .got.plt) sigue siendo escribible y, por lo tanto, es susceptible a ataques. Esto no impide que la GOT sea abusada por vulnerabilidades de escritura arbitraria.

Nota: Por defecto, GCC compila binarios con Partial RELRO.

Full RELRO

Full RELRO aumenta la protección al hacer que toda la GOT (tanto .got como .got.plt) y la sección .fini_array sean completamente de solo lectura. Una vez que el binario se inicia, todas las direcciones de función se resuelven y se cargan en la GOT, luego, la GOT se marca como de solo lectura, lo que efectivamente previene cualquier modificación durante el tiempo de ejecución.

Sin embargo, la desventaja de Full RELRO está en términos de rendimiento y tiempo de inicio. Debido a que necesita resolver todos los símbolos dinámicos al inicio antes de marcar la GOT como de solo lectura, los binarios con Full RELRO habilitado pueden experimentar tiempos de carga más largos. Este costo adicional de inicio es la razón por la cual Full RELRO no está habilitado por defecto en todos los binarios.

Es posible ver si Full RELRO está habilitado en un binario con:

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

Bypass

Si Full RELRO está habilitado, la única forma de eludirlo es encontrar otra manera que no necesite escribir en la tabla GOT para obtener ejecución arbitraria.

Ten en cuenta que la GOT de LIBC es generalmente Partial RELRO, por lo que puede ser modificada con una escritura arbitraria. Más información en Targetting libc GOT entries.

Support HackTricks

Last updated