Relro

Support HackTricks

Relro

RELRO sta per Relocation Read-Only, ed è una funzione di sicurezza utilizzata nei binari per mitigare i rischi associati agli overwrite della GOT (Global Offset Table). Ci sono due tipi di protezioni RELRO: (1) Partial RELRO e (2) Full RELRO. Entrambi riordinano la GOT e la BSS dai file ELF, ma con risultati e implicazioni diverse. Specificamente, pongono la sezione GOT prima della BSS. Cioè, GOT si trova a indirizzi più bassi rispetto alla BSS, rendendo quindi impossibile sovrascrivere le voci della GOT sovrascrivendo variabili nella BSS (ricorda che la scrittura in memoria avviene da indirizzi più bassi verso indirizzi più alti).

Analizziamo il concetto nei suoi due tipi distinti per chiarezza.

Partial RELRO

Partial RELRO adotta un approccio più semplice per migliorare la sicurezza senza influire significativamente sulle prestazioni del binario. Partial RELRO rende la .got di sola lettura (la parte non-PLT della sezione GOT). Tieni presente che il resto della sezione (come la .got.plt) è ancora scrivibile e, quindi, soggetto ad attacchi. Questo non impedisce alla GOT di essere abusata da vulnerabilità di scrittura arbitraria.

Nota: Per impostazione predefinita, GCC compila i binari con Partial RELRO.

Full RELRO

Full RELRO aumenta la protezione rendendo l'intera GOT (sia .got che .got.plt) e la sezione .fini_array completamente di sola lettura. Una volta che il binario inizia, tutti gli indirizzi delle funzioni vengono risolti e caricati nella GOT, quindi, la GOT viene contrassegnata come di sola lettura, impedendo effettivamente qualsiasi modifica durante l'esecuzione.

Tuttavia, il compromesso con Full RELRO è in termini di prestazioni e tempo di avvio. Poiché deve risolvere tutti i simboli dinamici all'avvio prima di contrassegnare la GOT come di sola lettura, i binari con Full RELRO abilitato potrebbero sperimentare tempi di caricamento più lunghi. Questo sovraccarico aggiuntivo all'avvio è il motivo per cui Full RELRO non è abilitato per impostazione predefinita in tutti i binari.

È possibile vedere se Full RELRO è abilitato in un binario con:

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

Bypass

Se il Full RELRO è abilitato, l'unico modo per bypassarlo è trovare un altro modo che non richieda di scrivere nella tabella GOT per ottenere un'esecuzione arbitraria.

Nota che il GOT di LIBC è solitamente Partial RELRO, quindi può essere modificato con una scrittura arbitraria. Maggiori informazioni in Targetting libc GOT entries.

Support HackTricks

Last updated