Relro
Relro
RELRO oznacza Relocation Read-Only i jest funkcją zabezpieczeń stosowaną w plikach binarnych w celu złagodzenia ryzyka związanego z nadpisywaniem GOT (Global Offset Table). Istnieją dwa rodzaje ochrony RELRO: (1) Partial RELRO i (2) Full RELRO. Oba rodzaje reorganizują GOT i BSS z plików ELF, ale z różnymi wynikami i implikacjami. Konkretnie, umieszczają sekcję GOT przed BSS. To znaczy, że GOT znajduje się pod niższymi adresami niż BSS, co uniemożliwia nadpisywanie wpisów GOT przez przepełnianie zmiennych w BSS (pamiętaj, że zapis do pamięci odbywa się od niższych do wyższych adresów).
Rozłóżmy koncepcję na dwa odrębne typy dla jasności.
Partial RELRO
Partial RELRO przyjmuje prostsze podejście do zwiększenia bezpieczeństwa bez znaczącego wpływu na wydajność binariów. Partial RELRO sprawia, że .got jest tylko do odczytu (część nie-PLT sekcji GOT). Pamiętaj, że reszta sekcji (jak .got.plt) jest nadal zapisywalna i, w związku z tym, podatna na ataki. To nie zapobiega nadużywaniu GOT z wrażliwości na dowolne zapisy.
Uwaga: Domyślnie GCC kompiluje pliki binarne z Partial RELRO.
Full RELRO
Full RELRO zwiększa ochronę, czyniąc całą GOT (zarówno .got, jak i .got.plt) oraz sekcję .fini_array całkowicie tylko do odczytu. Gdy plik binarny się uruchamia, wszystkie adresy funkcji są rozwiązywane i ładowane w GOT, a następnie GOT jest oznaczany jako tylko do odczytu, co skutecznie zapobiega jakimkolwiek modyfikacjom w czasie wykonywania.
Jednak kompromis związany z Full RELRO dotyczy wydajności i czasu uruchamiania. Ponieważ musi rozwiązać wszystkie dynamiczne symbole podczas uruchamiania przed oznaczeniem GOT jako tylko do odczytu, pliki binarne z włączonym Full RELRO mogą doświadczać dłuższych czasów ładowania. Ten dodatkowy narzut przy uruchamianiu to powód, dla którego Full RELRO nie jest domyślnie włączony we wszystkich plikach binarnych.
Można sprawdzić, czy Full RELRO jest włączony w pliku binarnym za pomocą:
Bypass
Jeśli Full RELRO jest włączony, jedynym sposobem na obejście go jest znalezienie innej metody, która nie wymaga zapisu w tabeli GOT, aby uzyskać dowolne wykonanie.
Zauważ, że GOT LIBC jest zazwyczaj Partial RELRO, więc może być modyfikowany za pomocą dowolnego zapisu. Więcej informacji w Targetting libc GOT entries.
Last updated