Bardzo dużo ludzi pokłada w łatce PaX nadzieje na to, że zabezpieczy ich on przed niewykrytymi jeszcze błędami. Uniemożliwi tak powszechne kiedyś, i wciąż jeszcze ataki typu buffer overflow. PaX jest także częścią takich łatek jak grsecurity, czy trusted Debian, Hardened Gentoo, części tej łatki są także wykorzystane w OpenBSD.
Do tej pory PaX wiernie chronił przed tego typu błędami. (Nie)stety zgodnie z odwieczną zasadą bezpieczeństwa, iż wszystko jest dziurawe, tylko nie wszystkie dziury zostały odkryte, PaX doczekał się momentu w którym to zaufanie zostało nadszarpnięte dosyć mocno.
5 Marca 2005 roku, ktoś zgłosił na BugTraq-u błąd w PaXie. Pełen raport o błędzie nie został jeszcze opublikowany, jednak z poprawek można wywnioskować co się stało.
Dla tych którzy chcą się szybko ochronić przed błędem, autor raportu poleca załatanie PaXa, oraz wykonanie (po wcześniejszym zapoznaniu się z dokumentacją, i zdaniu sobie sprawy z tego co to robi):
echo "0 0" > /proc/sys/vm/pagetable_cache
Jedną z technik wykorzystywanych przez PaX jest VMA mirroring (nie będę tłumaczył terminów angielskich). Kod PaXa próbuje ochronić nas przed wykonywaniem niechcianego kodu, oddzielając segmenty danych i kodu w pamięci kernela. Oraz przez oznaczenie segmentu kodu, jako tylko do wykonywania i czytania. Rozwiązuje to prosty problem, który sprawia iż jakikolwiek błąd w oprogramowaniu, który możnaby wykorzystać nadpisująć bufor (buffer overflow) nie ma prawa bytu.
Po zabezpieczeniu PaXem exploit próbujący dopisać kawałek kodu w pamięci wykonywalnej, nie jest w stanie tego zrobić. Aplikacja po prostu generuje wyjątek (i o ile go nie obsłuży), jest zabijana. Proste, i chroni nas przed błędami. Prawda ? (pomijam możliwość zDoSowania systemu w ten sposób, chroni nas to przed niechcianymi użytkownikami z UID 0 🙂 ).
Problemem są tylko segmenty zawierające inne dane, a które muszą znajdować się w pamięci wykonywalnej. Na przykład ciągi tekstowe (strings), i inne stałe dane. Dane te są „kopiowane” (w rzeczywistości mmapowane) przez PaX do pamięci wykonywalnej, podczas ładowania aplikacji.
Taka wirtualna strona w której te dane są przechowywane, nazywa się VMA. I tu właśnie leżał problem. Z poprawek (tak jak mówiłem, dokładny opis błędu nie został jeszcze opublikowany) wynika, że PaX niezbyt poprawnie ochraniał ten właśnie obszar pamięci.
Podsumowując, wychodzi na to że nie należy ufać nawet takim mechanizmom które przez lata ochraniały nas przed niewykrytymi jeszcze dziurami w oprogramowaniu. Należy zawsze pamiętać, że nie ma idealnego mechanizmu obronnego zarówno w oprogramowaniu, jak i w sprzęcie. Oraz iż należy korzystać z jak największej ilości takich mechanizmów. Byle nie przesadzić w drugą stronę, zawsze należy pamiętać o tym że system który zabezpieczamy ma służyć do czegoś więcej niż do ogrzewania pomieszczeń, i nabijania rachunków za prąd.
Disklajmer: Autor nie spędził zbyt dużo czasu nad analizą poprawki, i część wniosków oparł na dyskusji wśród ludzi analizujących ten błąd, bądź też na informacji publicznie dostępnej z innych źródeł.
Archiwalny news dodany przez użytkownika: gj.
Kliknij tutaj by zobaczyć archiwalne komentarze.