Teraz podniesiemy poprzeczkę i ominiemy szeroko stosowane funkcje łagodzenia eksploatowania jądra SMEP i KPTI. Funkcja łagodzenia eksploatowania SMEP korzysta z nowoczesnego mechanizmu architektury procesora, który zapobiega pobieraniu kodu znajdującego się w przestrzeni adresowej pamięci trybu użytkownika podczas pracy na wysokich poziomach uprawnień (Ring 0). Gdy SMEP jest włączony, skierowanie rejestru RIP na kod znajdujący się w przestrzeni adresowej pamięci trybu użytkownika spowoduje „oops jądra” i przerwanie zadania powodującego problem. Tę funkcję włącza się, ustawiając dwudziesty bit rejestru CR4 na on
Można sprawdzić, czy funkcja SMEP jest włączona w systemie docelowym, odczytując plik /proc/cpuinfo:
KPTI (Kernel Page-Table Isolation) to funkcja bezpieczeństwa, która zapewnia lepszą izolację między przestrzeniami pamięci w trybie użytkownika i trybie jądra, w celu obrony przed obejściami KASLR i innymi lukami w zabezpieczeniach wycieków pamięci, takimi jak Meltdown. Minimalny zestaw pamięci jądra jest obecny na izolowanych stronach pamięci w trybie użytkownika, aby uniknąć wycieków pamięci jądra niezbędnych w typowych łańcuchach eksploatacji jądra. Jądro Linux korzysta z KPTI od wersji 4.15. Możesz potwierdzić, czy funkcja KPTI jest włączona w systemie docelowym, uruchamiając komunikaty debugowania jądra:
KPTI (Kernel Page-Table Isolation) to funkcja bezpieczeństwa, która zapewnia lepszą izolację między przestrzeniami pamięci w trybie użytkownika i trybie jądra, w celu obrony przed obejściami KASLR i innymi lukami w zabezpieczeniach wycieków pamięci, takimi jak Meltdown. Minimalny zestaw pamięci jądra jest obecny na izolowanych stronach pamięci w trybie użytkownika, aby uniknąć wycieków pamięci jądra niezbędnych w typowych łańcuchach eksploatacji jądra. Jądro Linux korzysta z KPTI od wersji 4.15. Możesz potwierdzić, czy funkcja KPTI jest włączona w systemie docelowym, uruchamiając komunikaty debugowania jądra:
- Musimy przekazać wartość zwróconą przez wywołanie prepare_kernel_cred(0) do funkcji commit_creds, co oznacza, że musimy znaleźć sposób na skopiowanie wartości z rax do rdi. Oto pierwszy interesujący gadżet, jaki znajdziemy:
Problem polega na tym, że najpierw musimy się upewnić, że rdi i rdx mają tę samą wartość, aby uniknąć warunkowego skoku w jne 0x3b7945. Aby rozwiązać tę przeszkodę, znaleźliśmy następujące dwa gadżety:
Problem polega na tym, że najpierw musimy się upewnić, że rdi i rdx mają tę samą wartość, aby uniknąć warunkowego skoku w jne 0x3b7945. Aby rozwiązać tę przeszkodę, znaleźliśmy następujące dwa gadżety:
Zmodyfikujmy nasze skrypty, aby dodać te gadżety, a następnie skompilujmy i uruchommy nasz exploit, który powinien wyglądać tak:
Mamy to! Teraz włączmy SMAP i zobaczmy, jak ta redukcja exploitów może na nas wpłynąć.