1 PRZEPEŁNIENIE BUFORA B u f f e r O v e r f l o wWSIZ „Copernicus” 6 ZINF, Łukasz Rajzer, nr indeksu 1749
2 B u f f e r O v e r f l o w WprowadzenieBuffer Overflow – ogólna definicja Struktura pamięci Zasada działania włamującego Przykłady podatnych kodów Wskazówki dla programistów
3 Bufor programu Program komputerowy składa sie kodu, który korzysta ze zmiennych zapisanych w różnych miejscach pamięci. Podczas wykonywania sie programu zmiennym przydzielana jest pamięć, a jej ilość zależy od rodzaju informacji, które ma przechowywać zmienna. Na przykład dane typu Short Integer zajmują niewiele miejsca w pamięci RAM, natomiast dane Long Integer zajmują go więcej. Istnieją różne rodzaje zmiennych, a każdy rodzaj może potrzebować innej ilości pamięci. Przestrzeń zarezerwowana w pamięci dla zmiennej jest używana do przechowywania informacji niezbędnych do wykonywania sie programu. Program przechowuje w tym obszarze pamięci zawartość zmiennej i w razie potrzeby pobiera ja stamtąd. Ta wirtualna przestrzeń nazywana jest buforem.
4 Zapowiedź problemu //syslog_test_1_c #include
5 B u f f e r O v e r f l o w Definicja ogólnaPrzepełnienie bufora (ang. Buffer overflow) polega na nieplanowanej przez twórcę ingerencji w bufor programu; podanie większej ilości danych przekraczających tablicę – wydzielony obszar pamięci zostaje nadpisany nadmiarowymi informacjami. Nadpisanie pamięci może nieść skutek zmiany wartości zmiennych, jak i adresu powrotów funkcji. W najgorszym przypadku ataku dane nadmiarowe są nowymi instrukcjami, umożliwiającymi napastnikowi sterowaniem pracą procesora.
6 Stos po wywołaniu funkcji
7 Zaatakowany program
8 Hasło – sam sobie ustalę //password.c #include
9 * Przepełnienie stertySterta (ang. heap) nazywamy obszar pamięci dynamicznie przydzielonej aplikacji w celu przechowywania w niej zmiennych. W ataku przepełnienia sterty haker u siłuje zmienić zawartość takich zmiennych, jak hasła, nazwy plików oraz identyfikatory UID znajdujące się na stercie. Jaka jest różnica miedzy przepełnieniem bufora a przepełnieniem sterty? W przypadku przepełnienia bufora zmiana zawartości adresu powrotu znajdującego się na stosie oznacza próbę wykonania określonych instrukcji maszynowych. W przypadku przepełnienia sterty zmiana zawartości zmiennych dynamicznych oznacza próbę podniesienia poziomu uprawnień w systemie. Programy stosujące przepełnienie sterty wykorzystują błędy formatów oraz atakują funkcje malloc( ) i free( ).
10 Shellcode Shellcode - anglojęzyczny zlepek słów shell (powłoka) oraz code (kod) oznaczający prosty, niskopoziomowy program odpowiedzialny za wywołanie powłoki systemowej w ostatniej fazie wykorzystywania wielu błędów zabezpieczeń przez exploity.
11 Zapobieganie przepełnieniom buforaSprawdzanie wielkości danych przed umieszczeniem ich w buforze. Użycie funkcji ograniczających liczbę i (lub) format wprowadzanych znaków. Unikanie niebezpiecznych funkcji języka C, takich jak scanf( ), strcpy( ), strcat( ), getwd( ), gets( ), strcmp( ), sprintf( ). Bezpieczniejsze: JAVA, .NET. Funkcja systemu operacyjnego DEP (Data Execution Prevention) NX-bit (AMD), XD-bit (Intel) Narzędzia analizujące kod, chroniące stos
12 Literatura Strażnik bezpieczeństwa danych - Cyrus Peikari, Anton Chuvakin; Hellion 2005 (tyt. oryg. Security Warrior) Buffer Overflow Attacks - Detect, Exploit, Prevent – James C. Foster; Syngress 2005 Problem przepełnienia bufora – Piotr Kubowicz – opracowanie problemu