Fuzzing (automatizált sérülékenység felderítés) Előadók: Barta Csaba Major Marcell
Tartalom • • • • •
Definíció és egyszerű példák Történeti áttekintés Hol állunk most? Saját fejlesztésű eszközök Eredmények
Egy kis assembly…J 7C801000 ADC EAX,5D7C91A4 7C801005 FICOM DWORD PTR DS:[EAX+90D6827C] 7C80100B JL SHORT kernel32.7C800FE1 7C80100D ADD EAX,43D7C91 7C801012 XCHG EAX,ECX 7C801013 JL SHORT kernel32.7C801012 7C801015 FCOM QWORD PTR DS:[EAX+90DFDC7C] 7C80101B JL SHORT kernel32.7C800FA5 7C80101D FIST WORD PTR DS:[EAX+937C287C] 7C801023 JL SHORT kernel32.7C801066 7C801025 LOOPDE SHORT kernel32.7C800FB7 7C801027 JL SHORT <&ntdll.NlsMbCodePageTag> 7C801029 IN EAX,90 7C80102B JL SHORT kernel32.7C801017 7C80102D OUT 90,AL 7C80102F JL SHORT kernel32.7C80100A 7C801031 IN EAX,90 7C801033 JL SHORT kernel32.7C800FD6 7C801035 XOR DL,BYTE PTR DS:[ECX+90D8E37C] 7C80103B JL SHORT kernel32.7C800FC3 7C80103D AAD 90 7C80103F JL SHORT kernel32.7C801017 7C801041 ADC DL,BYTE PTR DS:[EAX+92AE7E7C] 7C801047 JL SHORT kernel32.7C80101B 7C801049 XCHG EAX,ECX 7C80104B JL SHORT kernel32.7C8010A7 7C80104D ADD EDX,DWORD PTR DS:[ECX+9701067C] 7C801053 JL SHORT kernel32.7C80108F 7C801055 AND EAX,E1FE7C90 7C80105A NOP 7C80105B JL SHORT kernel32.7C801099 7C80105D FST QWORD PTR DS:[EAX+90D9F47C] 7C801063 JL SHORT kernel32.7C801021 7C801065 OUT 90,EAX
7C801067 JL SHORT kernel32.7C80103F 7C801069 SALC 7C80106A NOP 7C80106B JL SHORT kernel32.7C8010AA 7C80106D STI 7C80106E NOP 7C80106F JL SHORT kernel32.7C8010E7 7C801071 OR DWORD PTR DS:[ECX+933C777C],EDX 7C801077 JL SHORT <&ntdll.NtCreateFile> 7C801079 OR DL,BYTE PTR DS:[ECX+9130C67C] 7C80107F JL SHORT <&ntdll.CsrClientCallServer> 7C801081 FCOM QWORD PTR SS:[EBP+97C0107C] 7C801087 JL SHORT kernel32.7C8010D5 7C801089 LOCK NOP 7C80108B JL SHORT kernel32.7C801026 7C80108D ADC DL,BYTE PTR DS:[EAX+9135917C] 7C801093 JL SHORT kernel32.7C80101F 7C801095 INC EDI 7C801096 XCHG EAX,ECX 7C801097 JL SHORT kernel32.7C8010E3 7C801099 ADC DL,BYTE PTR DS:[EDX+92ED497C] 7C80109F JL SHORT kernel32.7C801031 7C8010A1 CMP BYTE PTR DS:[ECX+9141B17C],DL 7C8010A7 JL SHORT <&ntdll.RtlEqualUnicodeString> 7C8010A9 INC EBX 7C8010A9 INC EBX 7C8010AA XCHG EAX,ECX 7C8010AB JL SHORT <&ntdll.RtlTimeToTimeFields> 7C8010AD LOOPDNE SHORT kernel32.7C80103F
Definíció és egyszerű példák
Mi is a „Fuzzing”? - Rövid definíció Fuzzing: Szoftvertesztelési módszer, amely a bemenetek folyamatos változtatásával vizsgálja, hogy a szoftver mennyire van felkészítve a „nem várt” adatok kezelésére. Alapvetően BlackBox jellegű megközelítés (csak a bemenetek helye és típusa ismert).
Hogyan működik: példa BMP formátum: header mezők BMP fájl méret
Szélesség
Header mérete Bitmap start offset
Magasság
Egyszerű teszt esetek unsigned int-re: • 0xFFFFFFFF • 0x00000000 • Érték +/- 1
Hogyan működik: példa HTTP válasz mezők HTTP/1.0 200 OK Expires: Fri, 12 Sep 2008 07:48:43 GMT Cache-Control: max-age=400 Content-Type: application/x-shockwave-flash Accept-Ranges: bytes Last-Modified: Thu, 29 May 2008 11:39:19 GMT Content-Length: 66079 Date: Fri, 12 Sep 2008 07:42:03 GMT Server: lighttpd/1.4.13 Age: 1 … Connection: keep-alive
Tartalom típusa
Tartalom méret
Egyszerű teszt esetek stringre: • Üres (\0) • AAAAA x 65534 • %08x.%08x.%08x.%08x.%08x
Teszteset generálási módszerek • Előre generált teszteseteket – PROTOS Test Suite
• Véletlenszerűen generált tesztesetek – /dev/urandom
• Mutációs eljárással generált tesztesetek – Az eredeti (működő) bemenet véletlenszerű módosítása
• Séma, vagy leírás alapján generált teszteseteket – Valamilyen leírónyelv alapján generált tesztesetek
• Evolúciós megközelítés – Genetikus algoritmus, populáció: tesztesetek
Rövid történeti áttekintés 1989 – Fuzzing születése : Barton Miller professzor (University of Wisconsin-Madison) operációs rendszerek és alkalmazások automatikus tesztelése
1999 – PROTOS Test Suite (University of Oulu) megjelenése
2002 – A Microsoft támogatást ad a PROTOS fejlesztőinek – SPIKE (David Aitel) megjelenése (nyílt forráskódú projekt)
SPIKE Blokk alapú megközelítés • Konstans/változó • Típus • Hossz értékek automatikusak s_binary_block_size_halfword_bigendian_variable("connectpacket"); s_block_start("connectpacket"); s_binary("01 02 03 04"); s_block_end("connectpacket");
0x04
0x01 02 03 04
Rövid történeti áttekintés/2 2003 – A PROTOS fejlesztői elindítják az első ismert kereskedelmi fuzzer eszköz (DEFENSICS Test Suites) fejlesztését a Codenomicon cég berkein belül
2005 – Több eszköz is napvilágot lát • FileFuzz • SPIKEFile • notSPIKEFile
FileFuzz
Rövid történeti áttekintés/3 2006 – ActiveX fuzzerek megjelenése • COMRaider (David Zimmer) • AxMan (H.D. Moore)
– BH 2006 - Sidewinder (Embleton, Sparks, Cunningham) Evolúciós megközelítés: a fuzzer tanulhat a múltbeli inputokból, code-coverage -> fitness • – az eredményeket nem publikálták
– BH2006 – Win32 IPC fuzzer(Jesse Burns)
2007 – BH2007 – Grey-box testing (Demott, J., Enbody, R., Punch, W.) Genetikus algoritmus, forráskód nélkül -> pstalker – BH2007 –Fuzzbox (David Thiel) – médiafurmátum fuzzer
COMRaider
Mire használható • A bemenetek ellenőrzéséért, kezeléséért és feldolgozásáért felelős kódrészletek hibáinak felderítésére – API – Kommunikációs protokoll – Webalkalmazás (SQL injekció) Felhasználói bemenet
Alkalmazás Bemenet ellenőrzés Feldolgozás
Adatbázis kezelő
Mire használható/2 • Az olyan kimeneteket előállító kódrészletek tesztelésére, amelyekben megjelenik, vagy valamilyen módon felhasználódik a bemenet – Webalkalmazás (XSS) Felhasználói bemenet Kimenet
Alkalmazás Bemenet ellenőrzés
Hálózati komm.
Feldolgozás
Kimenet előállítás
Mire használható/3 • Fuzzer által „észrevett” hibák lehetnek: – Buffer overflow – Integer overflow – Format string sérülékenység – Memóriakezelési hibák (pl.: ellenőrizetlen allokáció) – XSS, SQL injekció – DoS (végtelen ciklus)
Mire nem használható A fuzzer nem ismeri a célpont logikai felépítését és működését, emiatt nem alkalmas többek között: – A logikailag rossz működés felismerésére (pl.: rossz oldal jelenik meg a web alkalmazásban) – Az olyan funkciók felismerésére, amelyeket a program rendeltetésszerű használata során nem hív meg a felhasználó (backdoor) – A hozzáférés ellenőrzési rendszer hibás működésének felismerésére
Fuzzer keretrendszerek • Előnyei – Általános megoldás – Többféle célpont ellen bevethető – Bővíthető – Újrafelhasználható elemeket biztosít
• Hátrányai – Mindig létezik olyan célpont amelyhez nem használható – Speciális ellenőrző kódok
Fuzzer keretrendszerek/2 • Peach – GUI – Python – Moduláris (generator, transformer, publisher) – COM/DCOM, RPC támogatás
• Fusil the fuzzer – Python library – Process indítás (memória, körny. változók) – Kliens/szerver architektúra – Figyeli a tesztelt program állapotát
Peach
Hol állunk most?
Csoportosítás a célpont és fuzzer helye szerint • Lokális – Állományformátum fuzzerek – Parancssor (commandline) fuzzerek – Környezeti változó fuzzerek
• Távoli – Protokoll fuzzerek – Kiszolgáló és kliens alkalmazás fuzzerek
• Memóriarezidens (programkód módosításon alapuló) megoldások – Bemenet-módosító ciklus beszúrás – Pillanatkép készítés és visszaállítás
Bemenetet módosító ciklus beszúrás
bemenet_fogad() feldolgoz_1()
call feldolgoz()
feldolgoz_2()
feldolgoz_3()
Bemenetet módosító ciklus beszúrás bemenet_fogad() Ugrás ide bemenetmódosítás után Ugrás a feldolgozó függvény elé
call feldolgoz() Ugrás a módosító ciklusra
Bemenet módosító ciklus Ugrás a módosító ciklusra
feldolgoz_1()
feldolgoz_2()
feldolgoz_3()
main: call bemenet_fogad() call feldolgoz() jmp mod_ciklus ------------------------mod_ciklus: … jmp [call feldolgoz()]
Bemenetet módosító ciklus beszúrás
Pillanatkép készítés és visszaállítás bemenet_fogad()
call feldolgoz()
feldolgoz_1()
feldolgoz_2()
feldolgoz_3()
Pillanatkép készítés és visszaállítás bemenet_fogad()
Pillanatkép készítés (debugger breakpoint) Memória módosítás a bemenetet tároló területen
call feldolgoz() Pillanatkép visszaállítás (debugger breakpoint)
feldolgoz_1()
feldolgoz_2()
feldolgoz_3()
Pillanatkép készítés és visszaállítás Breakpoint kezelés
Kivétel kezelés
Egy jó fuzzer-rel szemben támasztott követelmények • Reprodukálhatóság – A tesztesetek bármikor megismételhetőek
• Újra felhasználhatóság – A legenerált tesztesetek, vagy az azokat generáló kód más célpont ellen is felhasználható
• Dokumentálhatóság – A tesztesetek bevitelekor keletkező hibák, illetve azok körülményeinek minél részletesebb dokumentálása – Magának a fuzzer-nek a részletes dokumentációja
• Hibadetektálás!!! – A tesztesetek bevitelekor keletkező hibák detektálása, esetleg automatikus vizsgálata
• Flexibilitás és bővíhetőség – Bővítmények készítésének és használatának lehetősége – Részletes, sok részletre kiterjedő konfigurálhatóság
Hibadetektálás
Hibadetektálás/2 • Talán a legfontosabb követelmény • Automatizált esetben nem hagyatkozhatunk az emberi logikára • A fuzzer-nek kell felismerni a hiba előfordulását • Folyamatos, ciklikus ellenőrzésekre van szükség
Hibadetektálás/3 Egyszerű megoldások • Naplóállomány, eseménynapló figyelés • „Polling” (hálózati esetekben) [folyamatos csatlakozási próbálkozások]
Hibadetektálás/4 Egyszerű megoldások • Futó folyamatok listájának figyelése
Hibadetektálás/5 Egyszerű megoldások • Megjelenő dialógusablakok figyelése
Hibadetektálás/6 Egyszerű megoldások • Jellemző hibajelentő (bug reporting) folyamatok figyelése
Hibadetektálás/7 Egyszerű megoldások • Külső debugger használata
Hibadetektálás/8 Bonyolultabb megoldások • Beépített debugger használata (állandó kivétel figyelés, és kezelés / Windows Debugging API, PTrace/) • Fuzzer tracking (a célpont nyomon követése assembly szinten) – utasítás, ciklus, függvény, vagy eljárás meghívásának figyelése, naplózása
• Dynamic Binary Instrumentation használata – Valgrind, PIN
Saját fejlesztésű eszközök FuzzIT BrowserWave
Saját fejlesztésű eszközök FuzzIT – Állományformátum fuzzer
BrowserWave – Böngésző fuzzer
FuzzIT • Besorolás – Lokális, állományformátum fuzzer
• Teszteset generálási módszer – Séma, vagy leírás alapján generált tesztesetek
• Programozási nyelv – Perl
• Platformok – Microsoft Windows – Linux
• XML alapú leírónyelv az állományformátumokhoz – Kezelt adatreprezentációk (encoder és decoder plugin-ek) – Formátumleírásba ágyazható kódrészletek
• Egyszerű parancssori kezelhetőség
FuzzIT/2
Generálás közben meghívott kód
FuzzIT/3
DEMO
BrowserWave Besorolás – Távoli, kiszolgáló/kliens alkalmazás fuzzer
Teszteset generálási módszer (pluginek) – Séma, vagy leírás alapján generált tesztesetek – Véletlenszerű tesztesetek – Mutáción alapuló teszteset generálás
Programozási nyelv(ek) – Perl – Python – C#
BrowserWave/2 Architektúra HTTP/TCP
Szerver
Kliens Ablak figyelő
Plugin1 Plugin2 ...
Processz figyelő Debugger
D
eb
ug
gi
ng
AP I
W M ind es ow sa i n ge g s
P TC
Browser
BrowserWave/3 Platformok Szerver – Microsoft Windows – Linux
Kliens – Microsoft Windows (elsődleges platform) – Microsoft Windows Mobile (5,6) – Linux
BrowserWave/4 Fontosabb tulajdonságok • Pluginekkel bővíthető (perl) • Hibadetektálás – Folyamat és folyamatlista figyelés – Beépített debugger (Python) – Dialógusablakok figyelés – Jellemző hibajelentő (bugreporting) folyamatok indulásának figyelése
• Dokumentálás – Szerver, kliens, debugger (crash) naplók – Futás után a legenerált tesztesetek és naplók tömörítése
BrowserWave/5 FuzzIT modul meghívása HTML generálás
BrowserWave/6 „Támogatott” böngészők • • • • • • • •
Microsoft Internet Explorer (6,7, Mobile) Mozilla Firefox (2,3, Minimo) Opera, (Windows, Linux, Windows Mobile) Apple Safari Maxthon Browser (1,2) KDE Konqueror Gnome Epiphany Google Chrome
BrowserWave/7
DEMO
Eredmények avagy akik rá”fuzz”tak
Fuzzit FuzzIT ACDSee
1
Gimp
>30
IrfanView
2
BrowserWave BrowserWave
Fuzzing közben…
Apple Safari
5
Perl
6
Mozilla Firefox
2
ActiveSync
1
1
PGP
1
Internet Explorer Mobile Google Chrome
1
Kérdések - Válaszok
Rövid összefoglalás • • • •
Fuzzing története és működése Jelenlegi eszközök Saját fejlesztések Eredmények
Elérhetőségek Barta Csaba
[email protected]
Major Marcell
[email protected]