201105 owasp fuzzing interpretera php

34
Minerva Fuzzing interpretera PHP Mateusz Kocielski [email protected] OWASP, 23 maja 2011, Kraków

Upload: logicaltrust-pl

Post on 29-May-2015

920 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 201105 OWASP Fuzzing interpretera PHP

MinervaFuzzing interpretera PHP

Mateusz [email protected]

OWASP, 23 maja 2011, Kraków

Page 2: 201105 OWASP Fuzzing interpretera PHP

$ whoami

STUDENT

2010 2011

GSoC STUDENT

WSPÓŁPRACUJĘ Z

MATEUSZ KOCIELSKIhttp://shm.nation.pl/http://digitalsun.pl/[email protected]

PUBLIKACJE

PROJEKTY

Page 3: 201105 OWASP Fuzzing interpretera PHP

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

Page 4: 201105 OWASP Fuzzing interpretera PHP

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)

Page 5: 201105 OWASP Fuzzing interpretera PHP

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?

Page 6: 201105 OWASP Fuzzing interpretera PHP

Automat idealny

● Wczytuję inny program● Znajduję WSZYSTKIE błędy● Generuję ładny kolorowy raport

Page 7: 201105 OWASP Fuzzing interpretera PHP

JAK GO ZBUDOWAĆ?

Page 8: 201105 OWASP Fuzzing interpretera PHP

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)

Page 9: 201105 OWASP Fuzzing interpretera PHP

NIE JEST ŹLE!

● Możemy budować automaty „prawie” idealne (takie, które się czasem mylą)

… a co najważniejsze ...

● Możemy czuć się potrzebni!!!

Page 10: 201105 OWASP Fuzzing interpretera PHP

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.

Page 11: 201105 OWASP Fuzzing interpretera PHP

ANALIZA STATYCZNA

● clang● splint● klocwork● lint ● …

Page 12: 201105 OWASP Fuzzing interpretera PHP

ANALIZA DYNAMICZNA

● Valgrind● dmalloc● SPIKE● ...

Page 13: 201105 OWASP Fuzzing interpretera PHP

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ń?

Page 14: 201105 OWASP Fuzzing interpretera PHP

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

Page 15: 201105 OWASP Fuzzing interpretera PHP

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

Page 16: 201105 OWASP Fuzzing interpretera PHP

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...

Page 17: 201105 OWASP Fuzzing interpretera PHP

JĘZYK PHP

● Wsparcie dla popularnych serwerów HTTP● apache, apache2, thttpd● cgi, fcgi● cli

Page 18: 201105 OWASP Fuzzing interpretera PHP

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 ***

Page 19: 201105 OWASP Fuzzing interpretera PHP

PHP popularność

● 25% httpd apache deklaruje, że używa PHP● z tego 25% używa patcha Suhosin

25%<

Page 20: 201105 OWASP Fuzzing interpretera PHP

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

Page 21: 201105 OWASP Fuzzing interpretera PHP

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 :-))

Page 22: 201105 OWASP Fuzzing interpretera PHP

JAK DZIAŁA MINERVA?

Page 23: 201105 OWASP Fuzzing interpretera PHP

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

Page 24: 201105 OWASP Fuzzing interpretera PHP

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)

Page 25: 201105 OWASP Fuzzing interpretera PHP

CZYLI

0.001DAY

Page 26: 201105 OWASP Fuzzing interpretera PHP

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);

[…]

Page 27: 201105 OWASP Fuzzing interpretera PHP

JAK GO WYKORZYSTAĆ?

● Do próby unieruchomienia serwera● Do zrzucenia sobie shella● Do zmuszenia httpd, żeby serwował treść, którą

sobie życzymy!

Page 28: 201105 OWASP Fuzzing interpretera PHP

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?

Page 29: 201105 OWASP Fuzzing interpretera PHP

PLAN ATAKU

socket_connect()

SHELLCODE

HOOKS

EVIL HANDLER

Page 30: 201105 OWASP Fuzzing interpretera PHP

POTENCJALNE PROBLEMY

● ASLR● SSP● PIE● Skąd wziąć adres ar_rputs i tablicy _hooks?

Page 31: 201105 OWASP Fuzzing interpretera PHP

DEMO

Page 32: 201105 OWASP Fuzzing interpretera PHP

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

Page 33: 201105 OWASP Fuzzing interpretera PHP

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)

Page 34: 201105 OWASP Fuzzing interpretera PHP

Q&A