3. Plan wykładu
● Automatyczne wyszukiwanie błędów
● Analiza statyczna, analiza dynamiczna
● Krótki wstęp do fuzzingu
● Język PHP
● Minerva
● Wykorzystywanie podatności intepretera
●
● Przyszłość projektu
4. Automatyczne wyszukiwanie błędów
● Dlaczego automatycznie?
● Jesteśmy leniwi...
● Niskie koszty (koszt napisania + analiza
znalezionych podatności)
● Oszczędność czasu (lub innych zasobów)
5. REWELACJA
...ale...
●...czy automat potrafi tyle ile człowiek?
●…czy da się taki automat zbudować?
Jeżeli tak, to jak?
●….czy to wszystko oznacza, że
przestaniemy być potrzebni?
6. Automat idealny
● Wczytuję inny program
● Znajduję WSZYSTKIE błędy
● Generuję ładny kolorowy raport
8. NIEROZSTRZYGALNOŚĆ
● Istnieją problemy nierozstrzygalne
(tzn. takie, których nie można
rozwiązać przy pomocy algorytmu)
● Problem stopu (czy dany program
się zatrzymuje?)
●Bazując na teorii mocy można się
szybko przekonać o tym, że Turing
ma rację
●Redukcja naszego problemu do
problemu stopu ALAN TURING (1912-1954)
9. NIE JEST ŹLE!
● Możemy budować automaty „prawie” idealne (takie, które
się czasem mylą)
… a co najważniejsze ...
● Możemy czuć się potrzebni!!!
10. RODZAJE ANALIZ
ANALIZA STATYCZNA ANALIZA DYNAMICZNA
● Badamy statyczne ● Badamy działające
obiekty obiekty
● Przykład: ● Przykład:
Analizujemy źródła w Podpinamy się pod
poszukiwaniu wywołań wywołania funkcji
printf, w których malloc(), free() i
ciąg formatujący badamy czy program
pochodzi od nie próbuje zwolnić
użytkownika. dwa razy tej samej
pamięci.
13. FUZZING
● Metoda analizy dynamicznej polegająca na
karmieniu programu losowymi danymi i badaniu
jego zachowania (np. przy użyciu innych
narzędzi analizy dynamicznej)
● Dobrym wyznacznikiem tego, że dzieje się coś
złego może być naruszenie ochrony pamięci
● Metodę zaproponował prof. Barton Miller
● Jak przeszukiwać wykładniczą przestrzeń?
14. JAK ZAPRZYJAŹNIĆ SIĘ Z
FUZZINGIEM?
● Uwierzyć, że działa!
● Dobrym dowodem są fuzzery napisane przez
DigitalDwarf.be (pokonały m.in.. OpenBSD, irssi...)
● Nauczyć się teorii prawdopodobieństwa
● Użyć mądrej metody generowania danych:
● Algorytmy ewolucyjne
● Gramatyki bezkontekstowe
● Więzy
● Whitebox fuzzing
15. JĘZYK PHP
[…] PHP - obiektowy, skryptowy język
programowania zaprojektowany do
generowania stron internetowych w czasie
rzeczywistym […]
źródło: Wikipedia
„PHP jest prawie tak ekscytujący jak
szczoteczka do zębów. Używasz go
codziennie, odwala za ciebie robotę,
jest prostym narzędziem, więc? Kto
chciałby poczytać o szczoteczkach?”
Rasmus Lerdorf
16. JĘZYK PHP
● Dynamicznie typowany
● Każda funkcja ma jakiś typ:
● string * int → string
● str_repeat(55, "foo"); → PHP Warning: str_repeat()
expects parameter 2 to be long, string given in - on
line...
17. JĘZYK PHP
● Wsparcie dla popularnych serwerów HTTP
● apache, apache2, thttpd
● cgi, fcgi
● cli
19. PHP popularność
25%<
● 25% httpd apache deklaruje, że używa PHP
● z tego 25% używa patcha Suhosin
20. MINERVA
● Fuzzer interpretera PHP
● Licencja BEERWARE
● Napisany w PYTHONIE
● Łatwa konfiguracja
● Duża elastyczność
(możliwe dokładanie
własnych funkcji)
● Oficjalna wersja 1.0
21. POPRZEDNIE PRÓBY
FUZZOWNIA INERPETERA
● Fusil, Lixam
● Weź losową ilość losowych danych i zaaplikuj do
losowej funkcji
● PFF
● Na podstawie dostarczonego szablonu zbuduj
losowe wywołania (typy ograniczone do napisów i
liczb)
● Powyższe fuzzery miały swoje 5 minut chwały:
● Lixam znalazł jednego buffer overflowa...
● ...a w PFF znaleziono błąd :-))
23. CO UDAŁO SIĘ ZNALEŹĆ?
● Use-after-free (sqlite)
● Double free (imap)
● Integer overflow (calendar)
● Buffer overrun (mbstring)
● ...inne (fnmatch, stream x 2, openssl)
● …i wiele (jeszcze) nieopublikowanych błędów
24. JAK WYKORZYSTAĆ BŁĘDY W
INTEPRETERZE
● Błędy związane z zarządzniem pamięcią (use-
after-free, double free)
● PHP ma własny alokator pamięci, który jest
zorganizowany w kolejki FIFO przechowujące
kawałki pamięci o danej wielkości
● Alokator ma zabezpieczenia... ale standardowo są
one wyłączone (ze względu na narzut czasowy)
26. STACK BUFFER OVERFLOW W
MODULE SOCKET
● błąd w funkcji socket_create:
● W obsłudze socketów typu AF_UNIX
[…]
memcpy(&s_un.sun_path, addr, addr_len);
[…]
27. JAK GO WYKORZYSTAĆ?
● Do próby unieruchomienia serwera
● Do zrzucenia sobie shella
● Do zmuszenia httpd, żeby serwował treść, którą
sobie życzymy!
28. SZCZEGÓŁY ATAKU
● Dziękuję n1x0nowi i s1m0nowi za pomoc w
przygotowaniu działającego exploita
● Jak zmusić Apache do serwowania własnej
treści?
● ap_run_handler() → _hooks()
● Sam złośliwy uchwyt może zawierać tylko
wywołanie funkcji ap_rputs()
● Musimy zadbać o „normalny” powrót do
interpretera PHP (zend_try, zend_catch
wykorzystuje long/set_jmp)
● Skąd wziąć pamięć na własny uchwyt?
32. Jak się zabezpieczyć?
● Wyłączyć moduł socket w PHP
● Naprawić błąd (dołożyć warunek sprawdzający
czy nie próbujemy skopiować zbyt wiele
pamięci)
● SSP posiadające __memcpy_chk eliminuje
problem
● Użyć disabled_functions
33. CO DALEJ?
●PHP jest językiem obiektowym (aktualnie Minerva w żaden
sposób z tego nie korzysta)
Generowanie bardziej skomplikowanych programów
●
Pomiar pokrycia kodu przy pomocy gcov
●
Obsługa innych języków (MinervaJS)
●
Przetestowanie modułów FTP, MySQL itp.
●
Przeprojektowanie (OCaml)
●