SMAP to funkcja bezpieczeństwa wprowadzona do jądra Linux w 2012 r. przez firmę Intel.3 Polega ona na uczynieniu stron przestrzeni użytkownika niedostępnymi, gdy proces znajduje się w przestrzeni jądra. Tę funkcję włącza się, ustawiając dwudziesty pierwszy bit rejestru CR4 na on
Ta funkcja znacznie komplikuje sprawy, gdy ładunek ROP znajduje się na stronach pamięci trybu użytkownika; jednak ponieważ wszystkie gadżety z naszego poprzedniego exploita znajdują się w przestrzeni jądra, SMAP nie powstrzyma nas przed eskalacją uprawnień! Potwierdźmy to, uruchamiając run4.sh (który włącza funkcję łagodzenia exploitów SMAP) i nasz poprzedni exploit (exploit3):
SMAP skomplikuje sprawy w bardziej ograniczonych sytuacjach, w których potrzebujemy mmap do zbudowania fałszywego stosu w przestrzeni adresowej trybu użytkownika, a następnie użycia gadżetu stack pivot do przygotowania bardziej złożonego łańcucha ROP. Najczęstszą metodą osiągnięcia obejścia SMEP i SMAP było nadużywanie funkcji native_write_cr4 do ustawienia bitów 20 i 21 na wyłączone z rejestru CR4. Jednak począwszy od wersji jądra 5.3,4 CR4 jest przypinane podczas rozruchu, a funkcja native_write_cr4 teraz ponownie ustawia bity SMAP i SMEP, jeśli rejestr CR4 został zmodyfikowany. Nie należy tego uważać za funkcję łagodzącą ROP (taką jak Control Flow Integrity), ale raczej za usunięcie szybkiego, jednorazowego zwycięstwa dla autorów exploitów jądra. Istnieje duże prawdopodobieństwo, że systemy produkcyjne mają wiele modułów jądra i sterowników urządzeń zapewniających wiele przydatnych gadżetów do osiągnięcia tego samego celu. Tak jest w przypadku funkcji ghh_seek wbudowanej w nasze jądro jako przykładu. Jeśli rozmontujesz funkcję ghh_seek, powinieneś zobaczyć kod przeznaczony do innych celów:
Jednakże 3-bajtowa, niespójna interpretacja tych kodów operacji skutkuje bardzo użytecznym gadżetem do modyfikacji rejestru CR4:
Dopóki możemy wykorzystywać i łączyć istniejący kod w gadżetach ROP wpływających na rejestr CR4, ominięcie funkcji łagodzenia nadużyć SMEP i SMAP pozostanie możliwe. Mimo że ominęliśmy już SMAP w naszym poprzednim exploicie, nie chcemy przegapić okazji, aby pokazać, jak ominąć SMAP, modyfikując rejestr CR4 za pomocą gadżetu, który znaleźliśmy dzięki niezrównanej interpretacji tych kodów operacji. Ten nowy exploit będzie o wiele bardziej złożony, ponieważ zbudujemy fałszywy stos w przestrzeni adresowej użytkownika za pomocą mmap, a następnie użyjemy gadżetu stack pivot, aby wykonać łańcuch ROP, który zbudowaliśmy, aby eskalować uprawnienia. Wprowadzimy następujące zmiany do naszego exploita:
W punkcie (1) zaczynamy od przypisania rdi wartości 0x6B0, co jest równoważne z ustawieniem bitów rc4 na 20 i 21 (0000000000011010110000). W punkcie (2) gadżet modyfikuje rc4, a my dodajemy dwa rets, aby upewnić się, że stos pozostanie wyrównany. W punkcie (3) wskakujemy do rax na adres naszego fałszywego stosu, 0xc0d30000, ponieważ aby wskoczyć do naszego fałszywego stosu, użyliśmy gadżetu stack pivot mov esp, eax. Zanim nasz ładunek zostanie wysłany, tworzymy nasz fałszywy stos mmap (5) o długości 0x2000 bajtów, zaczynając od przesunięcia c0d2f000. Powodem tego jest zapewnienie wystarczającej ilości miejsca, jeśli stos będzie musiał się rozrosnąć. Skompilujmy i wykonajmy nasz nowy exploit:
Doskonale! Potwierdziliśmy, że możliwe jest nadpisanie cr4 za pomocą ROP