Praktyczne spojrzenie na luki bezpieczeństwa jądra Windows

Podobne dokumenty
UNIX: architektura i implementacja mechanizmów bezpieczeństwa. Wojciech A. Koszek dunstan@freebsd.czest.pl Krajowy Fundusz na Rzecz Dzieci

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Architektura systemu komputerowego. Działanie systemu komputerowego. Przerwania. Obsługa przerwań (Interrupt Handling)

Działanie systemu operacyjnego

Działanie systemu operacyjnego

Działanie systemu operacyjnego

Przegląd technik wirtualizacji i separacji w nowoczesnych systemach rodziny UNIX

Działanie systemu operacyjnego

Mikroinformatyka. Wielozadaniowość

Przegląd technik wirtualizacji i separacji w nowoczesnych systemach rodziny UNIX

Architektura systemu komputerowego

ZASADY PROGRAMOWANIA KOMPUTERÓW

Architektura i administracja systemów operacyjnych

Projekt TrustedBSD jako klucz do bezpieczeństwa systemu FreeBSD

Bezpieczeństwo jądra Windows, lub jak zabić system dwoma instrukcjami. Mateusz "j00ru" Jurczyk SEConference 2013 Kraków

U M L. System operacyjny Linux zagnieżdżony w zewnętrznym systemie operacyjnym (Linux)

1. Tworzenie nowego projektu.

Wybrane zagadnienia elektroniki współczesnej

Budowa systemów komputerowych

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

Przepełnienie bufora. Trochę historii Definicja problemu Mechanizm działania Przyczyny Źródła (coś do poczytania)

Architektura komputerów

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Zarządzanie pamięcią operacyjną

Systemy operacyjne system przerwań

Technologie informacyjne (2) Zdzisław Szyjewski

Zarządzanie pamięcią operacyjną

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

Programowanie niskopoziomowe

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

System komputerowy. System komputerowy

Komputery przemysłowe i systemy wbudowane

Zarządzanie pamięcią w systemie operacyjnym

Zarządzanie zasobami pamięci

Tworzenie sterowników dla FreeBSD. Michał Hajduk

Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Jądro systemu operacyjnego

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Struktury. Przykład W8_1

architektura komputerów w. 8 Zarządzanie pamięcią

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

SYLABUS DOTYCZY CYKLU KSZTAŁCENIA realizacja w roku akademickim 2016/2017

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

System operacyjny MACH

Jak Windows zarządza pamięcią?

Lab 9 Podstawy Programowania

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Wykład 7. Zarządzanie pamięcią

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Przegląd dostępnych hypervisorów. Jakub Wojtasz IT Solutions Architect

Podstawy informatyki. System operacyjny. dr inż. Adam Klimowicz

Architektura komputerów

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Systemy operacyjne. Systemy operacyjne. Systemy operacyjne. Program wykładów. Strona WWW przedmiotu: Program ćwiczeń projektowych

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

dr inż. Jarosław Forenc

Linux Kernel III. Character devices

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Programowanie w asemblerze Środowiska 64-bitowe

Internet Security Multi-Device PL Box 2-Device 1Year KL1941PBBFS

Schematy zarzadzania pamięcia

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Urządzenia peryferyjne RS-232 oprogramowanie pod WINDOWS. Wykład 3

Systemy operacyjne III

WINDOWS NT. Diagram warstw systemu Windows NT

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Wykład 4: Klasy i Metody

Wstęp do informatyki. System komputerowy. Magistrala systemowa. Architektura komputera. Cezary Bolek

Jadro monolityczne vs. mikrojadro. Mikrojadro. Olga Kowalczuk. 9 grudnia 2008

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Struktura systemów komputerowych

Magistrala systemowa (System Bus)

Programowanie Współbieżne

1) Czym jest architektura systemu Windows 7 i jak się ją tworzy? 2) Jakie są poszczególne etapy uruchomienia systemu Windows 7?

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.1

Kurs Zaawansowany S7. Spis treści. Dzień 1

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Mikroinformatyka. Tryb wirtualny

Technologia informacyjna. Urządzenia techniki komputerowej

Systemy operacyjne. wykład dr Marcin Czarnota laboratorium mgr Radosław Maj

Komunikacja między sterownikami przez protokół ADS

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Architektura systemów informatycznych

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wykład 2. Struktury systemów komputerowych. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

EXSO-CORE - specyfikacja

Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:

Wskaźniki. Programowanie Proceduralne 1

Transkrypt:

Hispasec Praktyczne spojrzenie na luki bezpieczeństwa jądra Windows o podatnościach ring-0 słów kilka Mateusz j00ru Jurczyk SEConference, Kraków 2010

2 Plan prezentacji Tryb jądra co to jest? Punkt widzenia aplikacji użytkownika Punkt widzenia napastnika Bezpieczeństwo jądra Podział pamięci wirtualnej Komunikacja modułów o różnych uprawnieniach Wektory ataku Miejsca występowania potencjalnych luk Pytania

3 Kilka słów o mnie Mateusz j00ru Jurczyk Reverse Engineer @ Hispasec Pentester / Bughunter Vexillium (http://vexillium.org/) Autor bloga technicznego (http://j00ru.vexillium.org)

4

5 Architektura Jeden z poziomów uprzywilejowania kodu Intel x86 Dysponuje najwyższymi możliwymi uprawnieniami Wyłączając mechanizmy wirtualizacji Wykorzystywany przez rdzeń systemu operacyjnego Obsługa dostępnego sprzętu Tworzenie odpowiedniego środowiska pracy dla aplikacji użytkownika

6 W praktyce jądro w ring-0 Zarządza dostępnymi zasobami komputera Planuje i rozdziela czas procesora pomiędzy zadania Zarządza pamięcią fizyczną oraz mechanizmem stronicowania Zapewnia prawidłową obsługę i dostęp do zewnętrznych urządzeń

7 W praktyce jądro w ring-0 Udostępnia interfejs komunikacji jądra z zadaniami Pozwala programom na wykonywanie określonych przez jądro operacji w systemie Nadzoruje każdy istotny ruch, wykonywany przez aplikację Operuje na ogromnej ilości danych dostarczanych przez uruchomione aplikacje oraz aktywne urządzenia

8 Punkt widzenia aplikacji użytkownika???

Punkt widzenia napastnika 9

10

11 Podział pamięci wirtualnej Całkowita powierzchnia 4GB podzielona na dwie części

12 Podział pamięci wirtualnej Dolne obszary pamięci Przechowują dane (kod, informacje) danego procesu Regularnie zmieniają swoją postać (context switch) Dostępne z każdego poziomu uprzywilejowania Mogą zostać tymczasowo zapisane na dysk twardy (plik stronicowania)

13 Podział pamięci wirtualnej Pamięć aplikacji zawiera Obraz wykonywalny programu Obrazy wykonywalne bibliotek zewnętrznych Stosy oraz sterty procesu Struktury systemowe Thread Environment Block System Environment Block KUSER_SHARED_DATA Prywatne dane programu

14 Podział pamięci wirtualnej Wysokie obszary pamięci Nie ulegają zmianie w kontekście różnych procesów Mogą, ale nie muszą zostać oznaczone jako PAGEABLE Są współdzielone pomiędzy wszystkimi modułami jądra w systemie Chronione przed odczytem i zapisem z poziomu user-mode (całkowity brak dostępu)

15 Podział pamięci wirtualnej Pamięć jądra zawiera: Obraz wykonywalny jądra Obrazy wykonywalne pozostałych sterowników Stosy kernel-mode Sterty (kernel memory pools) Wewnętrzne listy i struktury jądra, opisujące obecny stan systemu

16 Podział pamięci wirtualnej Konkluzje Kod z uprawnieniami ring-3 nie ma bezpośredniego dostępu do wysokich obszarów Jeśli system jest bezpieczny, kod użytkownika nie nadpisze krytycznych struktur jądra Wniosek kod działający w kernel-mode może bezgranicznie ufać strukturom, umieszczonym w pamięci jądra

17 Podział pamięci wirtualnej Jedyny sposób, aby nadpisać pamięć trybu jądra z user-mode zrobić to za pomocą aktywnego modułu jądra Stąd problem bezpieczeństwa luki pozwalają na wykonywanie niedozwolonych operacji przez sterowniki, w imieniu aplikacji użytkownika

18 Pamięć wirtualna context switch 1. Wątek 01 procesu A zostaje uruchomiony 2. Wątek 02 procesu B zostaje uruchomiony zmiana kontekstu pamięci 3. Wątek 01 procesu B zostaje uruchomiony brak zmiany kontekstu Wniosek Context switch następuje jedynie w obrębie pamięci użytkownika, jeśli aktualny i kolejny wątek należą do różnych procesów

19 O wyjątkach słów kilka Tryb użytkownika Dwa mechanizmy obsługi wyjątków Structured Exception Handling Vectored Exception Handling Nieobsłużony wyjątek crash aplikacji Brak wpływu na stabilność całego systemu Tryb jądra Jeden mechanizm obsługi wyjątków Structured Exception handling Nieobsłużony wyjątek Blue Screen of Death oraz załamanie pracy systemu Bardziej ogólnie luka typu Denial of Service (najczęściej lokalna)

Wyjątek aplikacji 20

Wyjątek jądra 21

22

23 Komunikacja z modułami jądra Wywołania systemowe (ang. system calls) Przerwania systemowe (ang. interrupts) IOCTL (ang. Device Input and Output Control) Urządzenia fizyczne hardware

24 Wywołania systemowe Zbiór kilkuset funkcji jądra systemu, wywoływane z user-mode Odpowiedzialne za wykonywanie (prawie) wszystkich operacji w imieniu programu Obsługiwane przez dwa moduły ntoskrnl.exe (wywołania bazowe) win32k.sys (wywołania graficzne) Przykładowe funkcjonalności Pliki Rejestr Procesy, wątki Informacje o systemie

25 Wywołania systemowe Często hookowane (!) Malware Uprawnione programy AV Cel monitorowanie i filtracja danych przepływających pomiędzy aplikacją a jądrem Dwie metody wywołania Stary INT 0x2e (wciąż wspierany!) Nowy instrukcja SYSENTER / SYSCALL

26 ntoskrnl.exe vs win32k.sys Jądro systemu Blisko 300 wywołań systemowych Numery identyfikacyjne <= 0x1000 Dobrze usystematyzowane nazewnictwo funkcji Używane przez każdy istniejący w systemie proces Sterownik graficzny Ponad 600 wywołań systemowych Numery identyfikacyjne > 0x1000 Słaba systematyka nazw Używane wyłącznie przez procesy korzystające z trybu graficznego

27 Przerwania systemowe Zbiór pięciu przerwań, których może użyć aplikacja KiGetTickCount (0x2a) KiCallbackReturn (0x2b) KiRaiseAssertion (0x2c) KiDebugService (0x2d) KiSystemService (0x2e) Wywoływane instrukcją int, parametryzowane za pomocą rejestrów ogólnego przeznaczenia

28 IRP / IOCTL Udokumentowane metody komunikacji ze sterownikami Wyłącznie posiadającymi globalną nazwę, np. \Global\MyDriver Pozwalają na wykonywanie zapytań i odbieranie odpowiedzi w formie buforów we/wy I/O request packet Device Input and Output Control Otwieranie CreateFile CreateFile Odczyt Zapis ReadFile WriteFile DeviceIoControl

29 Wnioski Zarówno rdzeń systemu, jak większość dodatkowych sterowników operuje na dużej ilości danych z zewnątrz Co więcej, istnieje wiele sposobów komunikacji z jądrem a więc wiele potencjalnych luk

30 Wnioski Wszystkie moduły jądra mają równe uprawnienia Zachwianie bezpieczeństwa dowolnego z nich umożliwia wykonanie ataku na cały system

31

32 Pułapki trybu jądra Brak zaufania do otrzymywanych danych Adresy wirtualne (wskaźniki) Struktury kontrolowane przez użytkownika Wartości zwracane przez wewnętrzne funkcje Zasada nie zakładać nic o wartościach, nad którymi nie mamy kontroli

33 Pułapka pierwsza pamięć wirtualna Dostęp do pamięci Konieczność weryfikacji zakresu adresu Funkcje ProbeForRead i ProbeForWrite Obszar user-mode Nieistniejąca strona (Access Violation) Nieprawidłowe uprawnienia strony (Access Violation) Błędne wyrównanie (?) Dynamiczna zawartość pamięci (Race Condition)

34 Weryfikacja adresu Aplikacja użytkownika nigdy nie powinna używać adresu jądra jako argumentu wywołania W przeciwnym wypadku: Bufor wejściowy Memory Disclosure, potraktowanie sekretnych danych jądra jako informacji wejściowych Bufor wyjściowy Write-what-where, wykonanie zapisu pod adres jądra, zawierający krytyczne dane

35 NTSTATUS IOCTLHandler( PVOID InBuffer, PVOID OutBuffer, ULONG InBufferSize, ULONG OutBufferSize ) { struct OBJECT obj; Weryfikacja adresu if((struct OBJECT*)InBuffer->dwSize > 8) return STATUS_INFO_LENGTH_MISMATCH; /* */ } memcpy(&obj,inbuffer,inbuffersize); return STATUS_SUCCESS;

36 Weryfikacja adresu Sprawdzenie rozmiaru bufora (buffer overflow)

37 Weryfikacja adresu { struct OBJECT obj; if(inbuffersize!= sizeof(struct OBJECT)) return STATUS_INVALID_PARAMETER; if((struct OBJECT*)InBuffer->dwSize > 8) return STATUS_INFO_LENGTH_MISMATCH; /* */ } memcpy(&obj,inbuffer,inbuffersize); return STATUS_SUCCESS;

38 Weryfikacja adresu Wstępne wywołanie ProbeForRead / ProbeForWrite (zakres adresu)

39 Weryfikacja adresu { struct OBJECT obj; if(inbuffersize!= sizeof(struct OBJECT)) return STATUS_INVALID_PARAMETER; ProbeForRead(InBuffer,InBufferSize,sizeof(BYTE)); if((struct OBJECT*)InBuffer->dwSize > 8) return STATUS_INFO_LENGTH_MISMATCH; /* */ } memcpy(&obj,inbuffer,inbuffersize); return STATUS_SUCCESS;

40 Weryfikacja adresu Ograniczenie kodu operującego na wskaźniku znacznikami try{} except(){} (race condition)

41 Weryfikacja adresu { struct OBJECT obj; try { if(inbuffersize!= sizeof(struct OBJECT)) return STATUS_INVALID_PARAMETER; ProbeForRead(InBuffer,InBufferSize,sizeof(BYTE)); if((struct OBJECT*)InBuffer->dwSize > 8) return STATUS_INFO_LENGTH_MISMATCH; /* */ } memcpy(&obj,inbuffer,inbuffersize); } except(exception_execute_handler) { } return GetExceptionCode(); return STATUS_SUCCESS;

42 Weryfikacja adresu Kopiowanie zawartości bufora do pamięci jądra (race conditon)

43 Weryfikacja adresu { struct OBJECT obj; try { if(inbuffersize!= sizeof(struct OBJECT)) return STATUS_INVALID_PARAMETER; ProbeForRead(InBuffer,InBufferSize,sizeof(BYTE)); memcpy(&obj,inbuffer,inbuffersize); if(obj.dwsize > 8) return STATUS_INFO_LENGTH_MISMATCH; } /* */ } except(exception_execute_handler) { return GetExceptionCode(); } return STATUS_SUCCESS;

44 Pamięć wirtualna c.d. Niezainicjalizowane wskaźniki zagrożeniem? Domyślnie wskazują na pierwszą stronę pamięci użytkownika (NULL = 0x0000000) Nieświadome użycie adresu zerowego powoduje pobranie danych zaufanych danych od użytkownika

45 Nieinicjalizowane wskaźniki Microsoft Windows Kernel NULL Pointer Dereference Local Privilege Escalation Vulnerability BID: 36939 (Windows 2000-Vista) BID: 36624 (Windows 2000-Vista) Microsoft Windows SMB Null Pointer Remote Denial of Service Vulnerability BID: 38051 (Windows XP Seven)

46 Błędne wskaźniki c.d. NTSTATUS(*DispatchRoutine)(VOID); NTSTATUS IOCTLHandler() { DispatchRoutine = RealFunction; return STATUS_SUCCESS; } NTSTATUS SecondHandler() { return DispatchRoutine(); }

47 Błędne wskaźniki po raz ostatni Czy adres zerowy może wystąpić w innej sytuacji, niż niezainicjalizowana zmienna? TAK! Przykład: ExAllocatePool zwracająca NULL w przypadku błędu alokacji Brak weryfikacji zwróconego adresu nieświadome odwołania do pamięci użytkownika

48 Błędne wskaźniki po raz ostatni Kiedy alokacja się nie powiedzie? Rozmiar pożądanego obszaru pamięci przekracza rozmiar obszaru jądra, np. ExAllocatePool(0xDEADBEEF); Jądro nie dysponuje wystarczającą ilością wolnego miejsca sytuacja zapełnionej sterty Został wyczerpany limit pamięci dla konkretnego procesu pool quota

49 Błędne wskaźniki po raz ostatni Wniosek Nigdy nie zakładajmy, że dynamiczna alokacja kończy się powodzeniem każdy wynik rezerwacji miejsca powinien być weryfikowany W przeciwnym wypadku operujemy na obszarach pamięci kontrolowanych przez użytkownika

50 Błędne wskaźniki po raz ostatni NTSTATUS IOCTLHandler( PVOID InBuffer, PVOID OutBuffer, ULONG InBufferSize, ULONG OutBufferSize ) { BYTE* Pointer = ExAllocatePool(PagedPool,InBufferSize); memcpy(pointer,decryptionkey,16); // klucz prywatny return DecryptData(InBuffer,InBufferSize,Pointer); }

51 Problemy z liczbami całkowitymi Integer overflow Jedna z najczęściej spotykanych klas błędów Polega na przepełnieniu wartości zmiennej całkowitoliczbowej Niezwykle istotne w przypadku obliczania rozmiaru bufora (alokacja dynamiczna) Przyczyna: potencjalnie dowolna operacja arytmetyczna

52 Problemy z liczbami całkowitymi Przykład: UINT a = 0x20000000; UINT b = 0x38000000; BYTE* Buffer = ExAllocatePool(a+b*4); for( UINT i=0;i<a;i++ ) Buffer[i] = A ;

53 Problemy z liczbami całkowitymi Funkcja ExAllocatePool została wywołana a z argumentem 0 (zero) Alokacja powiodła się został zarejestrowany najmniejszy możliwy rozmiar alokacji 8 bajtów W pętli wypełniającej bufor danymi następuje przepełnienie

54 Problemy z liczbami całkowitymi Wariacje popularnych błędów 8/16-bit integer wrap alokacja przy użyciu dolnych bitów rozmiaru

55 Problemy z liczbami całkowitymi NTSTATUS IOCTLHandler() { const DWORD Size = 0x123456; BYTE* Pointer; Pointer = ExAllocatePool(PagedPool,(WORD)Size); if(pointer == NULL) return STATUS_INSUFFICIENT_RESOURCES; } memset(pointer,0,size); return STATUS_SUCCESS;

56 Problemy z liczbami całkowitymi Wariacje popularnych błędów 8/16-bit integer wrap alokacja przy użyciu dolnych szesnastu bitów rozmiaru Off-by-one

57 Problemy z liczbami całkowitymi NTSTATUS IOCTLHandler() { static BYTE Buffer[256]; UINT i; for( int i=0;i<=sizeof(buffer);i++ ) Buffer[i] = A ; } return STATUS_SUCCESS;

58 Problemy z liczbami całkowitymi Wariacje popularnych błędów 8/16-bit integer wrap alokacja przy użyciu dolnych szesnastu bitów rozmiaru Off-by-one Wyjątki procesora działania arytmetyczne Dzielenie przez zero Dzielenie INT_MIN przez -1 Brak weryfikacji poprawności indeksu tablicy

59 Problemy z liczbami całkowitymi NTSTATUS IOCTLHandler( LPDWORD InBuffer ULONG InBufferSize) { DWORD Table[4096]; UINT i; /* walidacja bufora wejściowego */ for( i=0;i<inbuffersize/sizeof(dword);i++ ) { Table[InBuffer[i]]++; } } return STATUS_SUCCESS;

60 Przepełnienia bufora Oparte o pamięć stosu W dzisiejszych czasach praktycznie niespotykane Powody Zabezpieczenia stosu (/GS) Używanie bezpiecznych funkcji obsługi tekstu strcpy_s, wcscpy_s, _mbscpy_s Chociaż kiedyś się zdarzały Microsoft Windows Kernel Message Handling Buffer Overflow Vulnerability BID: 7370 (Windows 2000 Windows XP SP1)

61 Przepełnienie bufora Oparte o pamięć sterty Bardzo często spotykane Powody Łatwość wykorzystania brak ochrony sterty Wewnętrzna struktura podobna do sterty user-mode Konsekwencja popularnego integer overflow

62 Przepełnienie bufora Oparte o pamięć sterty c.d. Poprawne wykorzystanie 4-byte write-whatwhere condition Po nadpisaniu arbitrary code execution

63 Przepełnienie bufora Oparte o pamięć sterty c.d. Dlaczego tak łatwo? Całkowity brak zabezpieczeń w mechanizmie Kernel Pools włącznie z Windows Vista Windows 7 po raz pierwszy wprowadzono weryfikację o nazwie Safe Unlinking, zapobiegającej większości ataków

64

65 Uwagi końcowe Jądro Windows cel ataku Możliwość przejęcie całkowitej kontroli nad systemem Mnogość metod wymiany informacji potencjalnych furtek dla napastnika Różnorodność możliwych ataków Poziom weryfikacji danych i wskaźników wejściowych Poziom właściwej synchronizacji Poziom logiki konkretnych mechanizmów jądra

66 Uwagi końcowe Dziesiątki modułów otwartych na komunikację z aplikacją użytkownika Każdy z nich potencjalnym zagrożeniem a zwłaszcza STEROWNIKI FIRM TRZECICH

67 Uwagi końcowe Pojawienie się niespodziewanego wyjątku w trybie ring-0 załamanie pracy systemu A więc prosty atak typu DoS Szczególne niebezpieczne w przypadku systemów serwerowych

68 Uwagi końcowe Konieczna ostrożność przy każdej operacji Działanie arytmetyczne Odwołanie do pamięci użytkownika Odwołanie do tablicy o niekontrolowanym indeksie Sprawdzanie zwracanych wartości Alokacja pamięci ExAllocatePool Brak jednego z powyższych wysoce prawdopodobne zagrożenie dla systemu

69 Pytania Dziękuję za uwagę! Q & A E-mail: j00ru.vx@gmail.com Tech blog: http://j00ru.vexillium.org/