Biztonságos programozás Puffer túlcsordulásos támadások

Hasonló dokumentumok
Interrupt kezelés Debugger. Debugger működése. Megszakítás és nyomkövetés. Izsó Tamás szeptember 19. Izsó Tamás Debugger működése/ 1

Stack Vezérlés szerkezet Adat 2.

Biztonságos programozás Puffer túlcsordulásos támadások

PE/COFF fájl formátum

Bevezetés Alapfogalmak Jog

Biztonságos programozás Puffer túlcsordulásos támadások

A hibát az alábbi Python program segítségével tudjuk előidézni:

Pénzügyi algoritmusok

Programok működése dióhéjban

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás C++ -ban 2007/7

Dr. Schuster György október 14.

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Architektúra, megszakítási rendszerek

Programozás alapjai. 10. előadás

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

A 32 bites x86-os architektúra regiszterei

Intel x86 utasításkészlet + disassembler működése

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

Programozási nyelvek Java

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Digitális rendszerek. Utasításarchitektúra szintje

Paraméter átadás regisztereken keresztül

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

Assembly. Iványi Péter

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Rootkitek. Előadó: Barta Csaba

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Adatelérés és memóriakezelés

Operációs rendszerek III.

Programozás 5. Dr. Iványi Péter

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Programozás II gyakorlat. 6. Polimorfizmus

Máté: Assembly programozás

Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

Aritmetikai utasítások I.

Assembly Címzési módok. Iványi Péter

Operációs rendszerek. Az NT folyamatok kezelése

Kivételek, kivételkezelés a C++ nyelvben

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Hírközlő rendszerek biztonsága laboratórium Számítógépes rendszerek sebezhetőségének vizsgálata

Intel x86 utasításkészlet

Java programozási nyelv 9. rész Kivételkezelés

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C++ programozási nyelv Konstruktorok-destruktorok

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Informatika terméktervezőknek

Globális operátor overloading

Kivételkezelés a C++ nyelvben Bevezetés

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Operációs rendszerek. Folyamatok kezelése a UNIX-ban

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Processzorok Utasításszintű Kezelése tavasz

Programozás C++ -ban

Programozás C++ -ban 2007/4

C++ programozási nyelv

Virtuális memóriakezelés Védelem. Memória védelem. Intel X86. Izsó Tamás október 1. Izsó Tamás Memória védelem/ 1

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

Bevezetés, a C++ osztályok. Pere László

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Utolsó módosítás:

1. Alapok. Programozás II

.NET (Dot-NET) #1 (Bevezetés)

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Java IX. telkezelés a Java-ban

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Programozási Nyelvek: C++

Információs Technológia

Java és web programozás

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Java IX. telkezelés a Java-ban

OOP #14 (referencia-elv)

Bevezetés a számítástechnikába

Programozási nyelvek Java

HARDVERKÖZELI PROGRAMOZÁS1

3. Osztályok II. Programozás II

Megszakítások és kivételek

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Számítógép Architektúrák

Objektumorientált programozás C# nyelven

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

Programozás II. 4. Dr. Iványi Péter

Programozás 6. Dr. Iványi Péter

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Konkurens TCP Szerver

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás I gyakorlat. 10. Stringek, mutatók

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Virtuális memóriakezelés Védelem. Memória védelem. Intel x68. Izsó Tamás október 18. Izsó Tamás Memória védelem/ 1

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Java és web programozás

Átírás:

Biztonságos programozás Puffer túlcsordulásos támadások Intel x68 Izsó Tamás 2015. október 5. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 1

Section 1 Puffer túlcsordulás sebezhetőség elleni védelem Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 2

Hogyan tovább? Mit tegyünk? Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 3

Kanári (más néven stack süti) Tegyünk a stackre egy értéket, és visszatérés előtt ellenőrizzünk, hogy nem írta-e valaki felül. Ezt az értéket nevezzük kanárinak, vagy stack sütinek. Kanári típusa: Konstans. Nem sokat ér. Terminátor. Konstans, de olyan értéket tartalmaz, amit nem lehet bevinni. Például string puffer esetén 0-át. Véletlen. Egy mestersüti van, de minden program indításkor más az értéke. A függvényenkénti azonos értékek gyengítheti a védelem erősségét. Véletlen + xor. Minden hívásnál más az értéke, mivel a véletlen értékkel és a stack címével kizáró vagy műveletet végzünk. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 4

Kanárit tartalmazó stack képe 0 "AAAA" ESP "AAAA" ESP "AAAA" "AAAA" "AAAA" "BBBB" "AAAA" "AAAA" "AAAA" "BBBB" CCCC CANARY mentett EBP Cím CCCC DDDD mentett EBP visszatérési cím visszatérési cím paraméter 1 paraméter 1 paraméter 2 paraméter 2 main stack keret main stack keret Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 5

Visual Studio /GS+ Visual Studio a /GS+ opció esetén használ kanárit (stack sütit). Ez az alapértelmezés, letíltása /GS-. Példaprogram a jól ismert authenticate függvény: 21 int authenticate(char *username, char *password) { 22 int authenticated; 23 char buffer[1024]; 24 25 authenticated = verify_password(username, password); 26 if(authenticated == 0) { 27 sprintf(buffer, 28 "password is incorrect for user %s\n", 29 username); 30 log("%s", buffer); 31 } 32 33 return authenticated; 34 } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 6

Visual Studio kanárija i n t authenticate ( char username, char password ) { 004114A0 55 push ebp 004114A1 8B EC mov ebp, esp 004114A3 81 EC 48 04 00 00 sub esp,448h 004114A9 A1 00 70 41 00 mov eax, dword ptr [ security_cookie (417000h ) ] 004114AE 33 C5 xor eax, ebp 004114B0 89 45 FC mov dword ptr [ ebp 4],eax 004114B3 53 push ebx 004114B4 56 push esi 004114B5 57 push edi i n t authenticated ; char b u f f e r [1024] ; k i h a g y o t t sorok 004114FF 5F pop edi 00411500 5E pop esi 00411501 5B pop ebx 00411502 8B 4D FC mov ecx, dword ptr [ ebp 4] 00411505 33 CD xor ecx, ebp 00411507 E8 1C FB FF FF c a l l @ILT+35( @ security_check_cookie@4 ) (411028h ) 0041150C 8B E5 mov esp, ebp 0041150E 5D pop ebp 0041150F C3 r e t Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 7

Hogyan keletkezik a mester süti érték Windows 2003 esetén: #include < s t d i o. h> #include <windows. h> i n t main ( ) { FILETIME f t ; unsigned i n t Cookie =0; unsigned i n t tmp =0; unsigned i n t p t r =0; LARGE_INTEGER perfcount ; GetSystemTimeAsFileTime (& f t ) ; Cookie = f t. dwhighdatetime ^ f t. dwlowdatetime ; Cookie = Cookie ^ GetCurrentProcessId ( ) ; Cookie = Cookie ^ GetCurrentThreadId ( ) ; Cookie = Cookie ^ GetTickCount ( ) ; QueryPerformanceCounter (& perfcount ) ; p t r = ( unsigned i n t )& perfcount ; tmp = ( p t r +1) ^ p t r ; Cookie = Cookie ^ tmp ; p r i n t f ( " Cookie : %.8X \ n ", Cookie ) ; return 0; } Illusztráció! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 8

Stack süti megkerülése Ha a stack süti konstans értékű, akkor triviális. Ha a puffer után van értékes adat, amit felül lehet írni, anélkül hogy sérülne a stack süti, akkor sem ér semmit ez a védelem. A mi példánkban a int authenticated változó továbbra is támadható 993 karakteres jelszó megadással. Ha a fordító átrendezte volna a stack-en a két változót, akkor ezt nem tehettük volna meg. Kiszámítjuk a processzhez tartozó mester sütit, bár nem valószínű, hogy minden adat a kezünkbe van. Újabb módszer alkalmazása. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 9

Section 2 SEH Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 10

Interrupt és kivételkezelés Interrupt és kivételdobás események megszakítják a processzor utasítás végrehajtásnak normális folyamatát. Az interrupt lehet szinkron, és aszinkron. Aszinkron interrupt esetén a processzor képes az utasítás végrehajtás ismétlésére. A megszakítást mindig az operációs rendszer kapja el és továbbítja. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 11

Hibakezelés C-ben #include < s t d i o. h> #include <Windows. h> void TestExceptions ( ) { i n t a, b=10; p r i n t f ( " T r i g g e r i n g SEH exception \ n " ) ; a = b / 0; } i n t main ( ) { t r y { TestExceptions ( ) ; } except ( GetExceptionCode ( ) == EXCEPTION_INT_DIVIDE_BY_ZERO? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { p r i n t f ( " Hiba lekezelve \ n " ) ; } p r i n t f ( " Nincs hibakezelés \ n " ) ; TestExceptions ( ) ; return 0; } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 12

try és except nem szabványos C nyelvi elem EXCEPTION_EXECUTE_HANDLER itt kezeljük le a megszakítást. EXCEPTION_CONTINUE_SEARCH következő regisztrált megszakításkezelő keresése. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 13

_EXCEPTION_RECORD-ban az ExceptionCode EXCEPTION_ACCESS_VIOLATION EXCEPTION_DATATYPE_MISALIGNMENT EXCEPTION_BREAKPOINT EXCEPTION_SINGLE_STEP EXCEPTION_ARRAY_BOUNDS_EXCEEDED EXCEPTION_FLT_DENORMAL_OPERAND EXCEPTION_FLT_DIVIDE_BY_ZERO EXCEPTION_FLT_INEXACT_RESULT EXCEPTION_FLT_INVALID_OPERATION EXCEPTION_FLT_OVERFLOW EXCEPTION_FLT_STACK_CHECK EXCEPTION_FLT_UNDERFLOW EXCEPTION_INT_DIVIDE_BY_ZERO EXCEPTION_INT_OVERFLOW EXCEPTION_PRIV_INSTRUCTION EXCEPTION_IN_PAGE_ERROR EXCEPTION_ILLEGAL_INSTRUCTION EXCEPTION_NONCONTINUABLE_EXCEPTION EXCEPTION_STACK_OVERFLOW EXCEPTION_INVALID_DISPOSITION EXCEPTION_GUARD_PAGE EXCEPTION_INVALID_HANDLE EXCEPTION_POSSIBLE_DEADLOCK Illusztráció! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 14

Strukturált exception handler SEH regisztráció kivételkezelő függvény címe 0xFFFFFFFF Egyéb adatok kivételkezelő függvény címe előző kivételkezelő regisztráció FS:[0] Kivételkezelő regisztráció Thread Information Block kivételkezelő függvény címe előző kivételkezelő regisztráció EXCEPTION_DISPOSITION cdecl _except_handler ( struct _EXCEPTION_RECORD *_ExceptionRecord, void * _EstablisherFrame, struct _CONTEXT *_ContextRecord, void * _DispatcherContext ) {............... } stack Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 15

Exception rekord 11 struct EXCEPTION_REGISTRATION_FIELD 12 { 13 struct EXCEPTION_REGISTRATION_FIELD* prev; 14 pexcept_handler handler; 15 }; 19 struct EXCEPTION_REGISTRATION_FIELD* pregister=0; 20 struct EXCEPTION_REGISTRATION_FIELD* prev=0; Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 16

Exception handler függvény 22 EXCEPTION_DISPOSITION cdecl my_except_handler( 23 struct _EXCEPTION_RECORD *ExceptionRecord, 24 void * EstablisherFrame, 25 struct _CONTEXT *ContextRecord, 26 void * DispatcherContext ) 27 { 28 unsigned i; 29 30 printf( "Megszakitaskezelo fut...\n" ); 31 32 // Hiba kijavítása 33 ContextRecord->Eax = (int)&adat; 34 35 // Megszakítást okozó utasítás megismétlése 36 return ExceptionContinueExecution; 37 } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 17

Exception handler regisztrálása Illusztráció! 42 // Stack-be felépítjük a láncolást 43 asm 44 { 45 sub ESP, 8 46 mov dword ptr pregister,esp 47 mov EAX,FS:[0] 48 mov dword ptr prev,eax 49 } 50 51 pregister->handler = my_except_handler; 52 pregister->prev = prev; 53 54 // TIB-be regisztráljuk a hibakezelőnket 55 asm 56 { 57 mov EAX, dword ptr pregister 58 mov FS:[0],EAX 59 } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 18

Exception kikényszerítése Illusztráció! 61 // megpróbálunk a 0-ás cimen lévő adatot 62 // felülírni 63 asm 64 { 65 mov EAX,0 66 mov [EAX], 2 67 } 68 69 printf( "Hiba utan %d\n", adat ); Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 19

Exception handler megszüntetése Illusztráció! 71 asm 72 { 73 mov eax,[esp] 74 mov FS:[0], EAX 75 add esp, 8 76 } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 20

Stack keret SEH-vel 0 ESP buffer Cím Következő SEH SEH függvény mentett EBP visszatérési cím paraméter 1 paraméter 2 EBP main stack keret Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 21

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: 70ff1300 0a104000 80ff1300 b1134000 (SEH lánc) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: 70ff1300 0a104000 80ff1300 b1134000 (SEH lánc) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: 70ff1300 0a104000 80ff1300 b1134000 (SEH lánc) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: 70ff1300 0a104000 80ff1300 b1134000 (SEH lánc) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: 70ff1300 0a104000 80ff1300 b1134000 (SEH lánc) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

Exception handler működése és átverése 0013fb44: ntdll!rtlconvertulongtolargeinteger+a0 (77d1ef10) 0013ff30: kiserlet1!ilt+5(_my_except_handler)+0 (0040100a) 0013ff70: kiserlet1!_except_handler4+0 (00402720) } SEH lánc @ILT+5(_my_except_handler): 0040100A: E9 11000000 jmp my_except_handler (401020h) 0040100F CC int 3 EXCEPTION_DISPOSITION cdecl my_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { 00401020: 55 push ebp <<< Itt tartunk 00401021: 8B EC mov ebp,esp 00401023: 51 push ecx printf( "Megszakitaskezelo fut...\n" ); pop edi pop esi ret 0:000> d esp 0013fb30: f2ee9977 30fc1300 30ff1300 4cfc1300 (exception handler paraméterek) 0:000> d 13ff30 0013ff30: EB069090 10011339 80ff1300 b1134000 (SEH lánc) jmp $+8; nop; nop; Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 22

SEH exploit 1 Előző kivételt adminisztráló blokkra mutató pointer struct EXCEPTION_REGISTRATION_FIELD prev; átírása ugró utasítással jmp $+8; nop; nop;! 2 Kivételkezelő függvénypointer átírása egy olyan címmel, ahol pop reg3; pop reg3; ret; vagy ezzel ekvivalens utasítás van. (Például add esp,8; ret.) 3 Kivételdobás kikényszerítése. Általában ez automatikusan megtörténik, ha elrontjuk a stack tartalmát. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 23

Exception kikényszerítése 21 int authenticate(char *username, char *password) { 22 int authenticated; 23 char buffer[1024]; 24 try 25 { 26 27 authenticated = verify_password(username, password); 28 if(authenticated == 0) { 29 sprintf(buffer, 30 "password is incorrect for user %s\n", 31 username); 32 log("%s", buffer); 33 } 34 } A puffer túlcsordulás miatt az authenticate függvény mielőtt visszatérne az sprintf -be kivételt dob! Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 24

SEH shellcode a.exe 1001 A 4 B -a 909006eb -a 10011339 1 nop -f shellcode.bin 10 X sehauthenticate.exe Cím 0 "AAAA" "AAAA" "AAAA" "AAAA" "BBBB" EB069090 10011339 nop shell code ESP jmp $+8; nop; nop pop esi; pop edi; ret; main stack keret Max Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 25

C++ kivételkezelés sebezhetősége Figyelem Windows alatt a C++ kivételkezelése nem szükségszerűen, de a Visual Studio esetén biztosan a SEH-re épül. Blokk strukturált nyelveknél a kivételkezelés az objektumok destruktorainak a meghívása miatt bonyolult. Ugyanakkor a fent leírt elvek alapján puffer-túlcsordulás esetén a C++ program támadható. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 26

C++ objektum modell class Point { p u b l i c : Point ( i n t x ) ; v i r t u a l ~ Point ( ) ; int X ( ) const ; s t a t i c i n t Count ( ) ; v i r t u a l void P r i n t ( ) const ; Illusztráció! protected : i n t x ; s t a t i c i n t _count ; } ; Point : : Point ( i n t x ) : x ( x ) { _count ++; } Point : : ~ Point ( ) { _count ; } i n t Point : : X ( ) const { return x ; } i n t Point : : Count ( ) { return _count ; } void Point : : P r i n t ( ) const { p r i n t f ( "%d ", x ) ; } i n t Point : : _count = 0; i n t main ( ) { i n t n ; Point p1 ( 4 ) ; n = Point : : Count ( ) ; / / s t a t f v. hívás demo return 0; } Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 27

Lehetséges C++ objektum modell Illusztráció! Point virtuális tábla vptr Point type info int x Point pt; void Point::Print(Point* this) static int Point:: _count Point::~Point(Point* this) static int Point:: Count() int Point::X( Point* this) Point::Point(Point* this, int x) Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 28

Támadás megvalósítása I Előfeltétel: A virtuális függvényt tartalmazó objektum a stack-en legyen. Stringgel tudjuk a memóriát felülírni (csak a string vége tartalmaz nullát). Támadás megvalósítása: A shellcode-ot a puffer elejére helyezzük. Írjuk felül a virtuális függvénytáblára mutató pointert is. A stack címe Windows alatt 0-val végződik, ezért a stringet lezáró 0 pont a virtuális függvény táblára mutató pointer utolsó byte legyen (Little-Endian) 1. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 29

Támadás megvalósítása II A pufferbe hozzunk létre egy ál virtuális függvénytáblát. Hogyan tudjuk a shellcode-ot megcímezni, ha 0-val kezdődő értéket nem tudunk az ál virtuális táblába bevinni? Nézzük meg mely regiszterek mutatnak a stack-re. A jmp esp megoldáshoz hasonlóan keressünk megfelelő utasítás sorozatot a betöltött dll-ekben, és ezzel a címmel töltsük fel a virtuális függvénytáblát. (Csak az a cím jó amelyben nincs 0 byte). Várjuk, amig a program meg nem hívja a virtuális függvényt. Származtatás esetén a destruktornak illik virtuálisnak lenni. 1 Linux vagy bináris adatokat tartalmazó puffer esetén ezzel nem kell törődni. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 30

Stack süti megkerülése Futtassuk le a shellcode-unkat mielőtt a rendszer ellenőrizné a kanári értéket. Ez SEH exploit estén teljesül. Ez ellen a kanári nem véd. Másik lehetőség a virtuális függvénytábla átírása. Mi van, ha a függvény nem használ kivételkezelő rutint, és nincs benne virtuális függvényt tartalmazó objektum sem. Nagy valószínűséggel a megelőző stack keretekben van kivételt regisztráló bejegyzés, amit át tudunk írni. Lásd David Litchfield: Defeating the Stack Based Buffer Overflow Prevention Mechanism of Microsoft Windows 2003 Server cikkét. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 31

Safe SEH A stack sütit legegyszerűbben SEH exploit segítségével kerülhetjük meg. Akadályozzuk meg, hogy kivételdobás esetén bármely címen lévő utasítást meg lehessen hívni. A cél, hogy csak a szabályosan regisztrált kivételkezelőket lehessen meghívni. Visual Studioban a linkernek a /SAFESEH:yes paramétert kell megadni. Ez az alapértelmezés. Letiltása /SAFESEH:no Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 32

Safe SEH átverése I Ha az alkalmazás és néhány dll /SAFESEH:no-val volt linkelve, akkor az előzőekben megismert pop, pop, ret-es technika működik. https://www.google.com/patents/us7480919 Safe exceptions szabadalom tartalmazza a biztonságos strukturált kivételkezelés működését. A szabadalom gondoskodik olyan object kódok együtt működéséről is, amelyek egy részét még még nem a Safe SEH figyelembevételével fordították. A.sxdata szegmens tárolja a regisztrált kivételkezelő függvények címét. Ha a kód /SAFESEH:no-val készült, akkor nincs ilyen szegmens. Ezért futásnál az exception dispatcher annyit tud megnézni, hogy az kivételkezelő függvény címe ne legyen az aktuális stack keretben. Az érvényes stack intervallumot az TEB-ben az FS:[4] és Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 33

Safe SEH átverése II FS[8] érték tartalmazzák. Ezen kívül eső címen lévő kód hívható. Hasonló okok miatt a nem module címterébe eső kód is hívható. Minden adat, ami gépi utasításként is értelmezhető az egyben kód is. A heap-en lévő mp3 fájl tartalmára is rá lehet adni a vezérlést. A heap-pel az a baj, hogy a megfelelő adat címét nem mindig tudjuk előre. A Load Configuration Directory-t nem tartalmazó kódszegmens utasítása is hívható. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 34

Data Execution Prevention (DEP) I Korlátozzuk le a stack-et úgy, hogy ott ne lehessen kódot futtatni. Ehhez hardware támogatásra van szükség. Szegmens védelemmel ez megoldható, de akkor sérül a flat memória modell. Lap védelemmel lehet megoldani, de ez csak a későbbi Intel processzorokban lett megvalósítva (manapság már alig lehet találni olyan PC-t amelyik nincs erre felkészítve). Első DEP-es Windows rendszerek Windows XP Service Pack 2; Windows XP Tablet PC Edition 2005; Windows Server 2003 Service Pack 1; Újabbak értelemszerűen tudják. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 35

Data Execution Prevention (DEP) II Üzemmódok: Optin futtatni lehet a nem DEP kompatibilis programokat, de egy listán meg lehet adni a melyek DEP kompatibilis módba fussanak. Önkicsomagoló exe program például futtat kódot a stacken. OptOut Általában a windows szerverekben az az alapértelmezés, hogy minden program DEP kompatibilis. Amelyek nem, azokat kell kivétel listára tenni. Boot beállítások: AlwaysOn minden processz DEP védett, nincs kivétel. AlwaysOff egyik processz sem DEP védett. Izsó Tamás Biztonságos programozás Puffer túlcsordulásos támadások/ 36