201105 owasp fuzzing interpretera php
TRANSCRIPT
$ whoami
STUDENT
2010 2011
GSoC STUDENT
WSPÓŁPRACUJĘ Z
MATEUSZ KOCIELSKIhttp://shm.nation.pl/http://digitalsun.pl/[email protected]
PUBLIKACJE
PROJEKTY
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
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)
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?
Automat idealny
● Wczytuję inny program● Znajduję WSZYSTKIE błędy● Generuję ładny kolorowy raport
JAK GO ZBUDOWAĆ?
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)
NIE JEST ŹLE!
● Możemy budować automaty „prawie” idealne (takie, które się czasem mylą)
… a co najważniejsze ...
● Możemy czuć się potrzebni!!!
RODZAJE ANALIZ
ANALIZA STATYCZNA
● Badamy statyczne obiekty
● Przykład:
Analizujemy źródła w poszukiwaniu wywołań printf, w których ciąg formatujący
pochodzi od użytkownika.
ANALIZA DYNAMICZNA
● Badamy działające obiekty
● Przykład:
Podpinamy się pod wywołania funkcji malloc(), free() i badamy czy program nie próbuje zwolnić dwa razy tej samej
pamięci.
ANALIZA STATYCZNA
● clang● splint● klocwork● lint ● …
ANALIZA DYNAMICZNA
● Valgrind● dmalloc● SPIKE● ...
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ń?
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
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
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...
JĘZYK PHP
● Wsparcie dla popularnych serwerów HTTP● apache, apache2, thttpd● cgi, fcgi● cli
CIEKAWOSTKA
● for(;!$x;); - 11 znaków● PHP 5.3.6 with Suhosin-Patch (cli) (built: Apr 18
2011 11:14:25)
$ php -d max_execution_time=1 bla.php 2> /dev/null
*** glibc detected *** php: double free or corruption (fasttop): 0x093cf758 ***
PHP popularność
● 25% httpd apache deklaruje, że używa PHP● z tego 25% używa patcha Suhosin
25%<
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
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 :-))
JAK DZIAŁA MINERVA?
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
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)
CZYLI
0.001DAY
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);
[…]
JAK GO WYKORZYSTAĆ?
● Do próby unieruchomienia serwera● Do zrzucenia sobie shella● Do zmuszenia httpd, żeby serwował treść, którą
sobie życzymy!
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?
PLAN ATAKU
socket_connect()
SHELLCODE
HOOKS
EVIL HANDLER
POTENCJALNE PROBLEMY
● ASLR● SSP● PIE● Skąd wziąć adres ar_rputs i tablicy _hooks?
DEMO
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
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)
Q&A