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

201105 OWASP Fuzzing interpretera PHP

May 29, 2015

Download

Documents

Logicaltrust pl
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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