Page 1


Bezpieczne programowanie. Aplikacje hakeroodporne Autor: Jacek Ross ISBN: 978-83-246-2405-8 Format: 158×235, stron: 312

WyobraŸ sobie sytuacjê, w której poœwiêcasz mnóstwo czasu na stworzenie nowego, ciekawego rozwi¹zania w œwiecie informatyki. Kosztuje Ciê to wiele dni i nocy ogromnego wysi³ku. Dok³adnie w momencie opuszczenia Twojego bezpiecznego komputera, udostêpniony œwiatu, Twój pomys³ zostaje wystawiony na ciê¿k¹ próbê – w sieci dzia³aj¹ krakerzy, którzy za wszelk¹ cenê bêdê próbowali z³amaæ Twoje zabezpieczenia lub wykorzystaæ luki w Twojej aplikacji. Jak tego unikn¹æ? Jak tworzyæ oprogramowanie odporne na ich ataki? Proste i przejrzyste odpowiedzi na podobnie skomplikowane pytania znajdziesz w³aœnie w tej ksi¹¿ce! Podczas lektury poznasz zagro¿enia, na jakie nara¿ony jest programista, oraz proste sposoby utrudniania krakerom zadania. Dodatkowo zdobêdziesz wiedzê na temat metod szyfrowania danych i wyznaczania sygnatur. Jednak, co najwa¿niejsze, zobaczysz, jak wykorzystaæ tê wiedzê w praktyce! W publikacji „Bezpieczne programowanie. Aplikacje hakeroodporne” znajdziesz równie¿ sporo ciekawych informacji na temat zabezpieczania aplikacji sieciowych oraz zaawansowane metody, gwarantuj¹ce podniesienie bezpieczeñstwa Twojego produktu do wysokiego poziomu. To jeszcze nie wszystko! W kolejnych rozdzia³ach autor prezentuje sposoby ochrony przed debugerami, patenty na bezpieczne tworzenie kodu na platformie .NET oraz psychologiczne aspekty tworzenia hakeroodpornych aplikacji! • Przegl¹d zagro¿eñ, rodzaje oszustw i naruszeñ bezpieczeñstwa • Zabezpieczenie programu przy u¿yciu numeru seryjnego • Dostêpne na rynku systemy zabezpieczania aplikacji • Algorytmy szyfruj¹ce • Tworzenie skrótów wiadomoœci • Wykorzystanie szyfrowania przy zabezpieczaniu oprogramowania • Zabezpieczenia aplikacji wykorzystuj¹cych PHP i .NET • Ochrona przed atakami typu: wstrzykiwanie SQL, XSS, DOS i DDOS • U¿ywanie zaawansowanych metod ochrony oprogramowania • Sposoby zaciemniania programu • Ochrona kodu przed debugerami • Zastosowanie kluczy sprzêtowych i technik biometrycznych • Psychologiczne aspekty ochrony oprogramowania Dowiedz siê, jak tworzyæ aplikacje odporne na ataki!


Spis treci Wstp .............................................................................................. 9 Rozdzia 1. Zagroenia czyhajce na programistów ........................................... 11 1.1. Dawno, dawno temu w wiecie gier ........................................................................... 11 1.2. Moje przygody z gr Metal Knights ........................................................................ 14 1.3. Niebezpieczny edytor map, czyli sabe punkty ........................................................ 16 1.4. A jak to robi w Diablo... czyli co o bezpieczestwie aplikacji sieciowych .......... 19 1.5. Rodzaje oszustw i narusze bezpieczestwa ........................................................... 21 1.5.1. Nieuprawnione uycie bd kopiowanie programu ........................................ 21 1.5.2. Nielegalna podmiana autorstwa kodu ............................................................. 23 1.5.3. Nieuprawniona modyfikacja kodu .................................................................. 23 1.6. Pirat, Robin Hood, kraker? ...................................................................................... 24 1.7. Czy ja take mam myle o zabezpieczeniach? ....................................................... 25 1.8. Czym si róni kraker od zodzieja samochodów? .................................................. 27 Zadania do samodzielnego wykonania ........................................................................... 30 Pytania kontrolne ............................................................................................................ 31

Rozdzia 2. Proste metody zabezpieczenia programów ......................................... 33 2.1. Wstp ....................................................................................................................... 33 2.2. Numer seryjny ......................................................................................................... 33 2.3. CrackMe — przykady saboci prostych zabezpiecze przed nieuprawnionym uytkowaniem programu ................................................. 35 2.3.1. CrackMe1 ....................................................................................................... 35 2.3.2. CrackMe2 ....................................................................................................... 42 2.4. Gotowe systemy zabezpieczania aplikacji przed nieuprawnionym uyciem ........... 44 Przegld systemów zabezpieczajcych dostpnych na rynku ................................... 47 2.5. Zakoczenie ............................................................................................................. 50 Zadania do samodzielnego wykonania ........................................................................... 51 Pytania kontrolne ............................................................................................................ 51

Rozdzia 3. Teoria szyfrowania. Algorytmy szyfrujce w praktyce ....................... 53 3.1. Wstp ....................................................................................................................... 53 3.2. Szyfrowanie i kodowanie informacji ....................................................................... 53 3.3. Historyczne algorytmy szyfrowania i kodowania .................................................... 54 3.3.1. Pocztki .......................................................................................................... 54 3.3.2. Szyfry przestawieniowe i podstawieniowe, szyfr Cezara ............................... 55 3.3.3. Szyfry polialfabetyczne .................................................................................. 55 3.3.4. Zasada Kerckhoffsa ........................................................................................ 56


4

Bezpieczne programowanie. Aplikacje hakeroodporne 3.4. Wspóczesne algorytmy szyfrowania ................................................................... 56 3.4.1. Rozwój algorytmów szyfrowania ................................................................... 56 3.4.2. Algorytmy symetryczne. Algorytm RC4 ........................................................ 57 3.4.3. Szyfrowanie symetryczne, algorytm DES ...................................................... 61 3.4.4. Szyfrowanie symetryczne, algorytm AES ...................................................... 61 3.4.5. Szyfrowanie asymetryczne, algorytm RSA .................................................... 61 3.4.6. Podpis cyfrowy ............................................................................................... 63 3.4.7. Szyfr z kluczem jednorazowym ...................................................................... 63 3.5. Algorytmy wyznaczajce sygnatury (skróty) danych .............................................. 64 3.5.1. Algorytm wyznaczania CRC .......................................................................... 64 3.5.2. Algorytm MD5 ............................................................................................... 65 3.5.3. Algorytm SHA-1 ............................................................................................ 65 3.6. Generatory liczb pseudolosowych ........................................................................... 69 3.7. Do czego moe suy szyfrowanie w zabezpieczaniu programów? ....................... 70 Zadania do samodzielnego wykonania ........................................................................... 71 Pytania kontrolne ............................................................................................................ 71

Rozdzia 4. Zabezpieczanie programów sieciowych na przykadzie jzyka PHP ... 73 4.1. Wstp ....................................................................................................................... 73 4.2. Obsuga danych z zewntrz ..................................................................................... 74 4.3. Przekazywanie danych midzy skryptami ............................................................... 75 4.4. Uwierzytelnianie w PHP .......................................................................................... 76 4.5. Niebezpieczne konstrukcje jzyka ........................................................................... 79 4.5.1. Konstrukcja include ($plik) ............................................................................ 80 4.5.2. eval($code), konstrukcja $$ ............................................................................ 81 4.5.3. fopen($url) ...................................................................................................... 82 4.6. Bezpieczna obsuga bdów ..................................................................................... 83 4.7. Bezpieczestwo systemu plików ............................................................................. 84 4.8. Cross site scripting ................................................................................................... 85 4.9. Wstrzykiwanie kodu SQL ........................................................................................ 86 4.9.1. Wstrzykiwanie kodu SQL — przykad 1. ....................................................... 87 4.9.2. Wstrzykiwanie kodu SQL — przykad 2. ....................................................... 90 4.9.3. Uycie PDO .................................................................................................... 91 4.9.4. Ataki wielofazowe .......................................................................................... 92 4.9.5. Sposoby ochrony ............................................................................................ 92 4.10. Wstrzykiwanie polece systemowych (shell injection) ......................................... 93 4.11. Wstrzykiwanie zawartoci e-mail (e-mail injection) .............................................. 94 4.12. Cross site request forgery ...................................................................................... 95 4.13. Przejcie kontroli nad sesj (session fixation) ....................................................... 97 4.14. Session poisoning ................................................................................................ 101 4.14.1. Przechowywanie stanu aplikacji w niezabezpieczonych miejscach ........... 101 4.14.2. Przypisanie wartoci do zmiennej sesyjnej o nazwie stworzonej na podstawie danych od uytkownika ................... 104 4.14.3. Podmiana sekwencji wywoa przez wamywacza. Problem wycigu ....... 105 4.14.4. Uywanie tych samych zmiennych sesyjnych do rónych celów ............... 106 4.14.5. Zmienne sesyjne nie s gwarancj bezpieczestwa .................................... 108 4.15. Ataki typu DOS i DDOS ..................................................................................... 110 4.16. Dyrektywa register_globals ................................................................................. 112 4.17. Narzdzie zaciemniajce kod ródowy jzyka PHP ........................................... 114 Zakoczenie .................................................................................................................. 116 Zadania do samodzielnego wykonania ......................................................................... 116 Pytania kontrolne .......................................................................................................... 116


Spis treci

5

Rozdzia 5. Zaawansowane metody zabezpieczania programów ....................... 121 5.1. Wstp ..................................................................................................................... 121 5.2. Klucze rejestracyjne przypisane do uytkownika .................................................. 122 5.2.1. Idea kluczy rejestracyjnych przypisanych do uytkownika .......................... 122 5.2.2. Typowe techniki ........................................................................................... 124 5.2.3. Tworzenie kluczy rejestracyjnych w aplikacjach sieciowych ....................... 125 5.3. Samotestujcy si program .................................................................................... 126 5.3.1. Testowanie integralnoci programu gwarancj jego oryginalnoci .............. 126 5.3.2. Przykad — weryfikacja integralnoci pliku wykonywalnego ..................... 127 5.3.3. Przykad — weryfikacja integralnoci kodu programu ................................ 132 5.4. Sprawdzanie integralnoci danych ......................................................................... 135 5.4.1. Ukryj moje dane ........................................................................................... 136 5.4.2. Testowanie integralnoci danych ulegajcych zmianom .............................. 137 5.4.3. Wersje czasowe oprogramowania — kopoty z shareware ........................... 138 5.4.4. Bezpieczne przechowywanie danych — przykad ........................................ 140 5.5. Samomodyfikujcy si program ............................................................................ 144 5.5.1. Samomodyfikujcy si program. Brzydka sztuczka czy eleganckie zabezpieczenie? ................................. 144 5.5.2. Sabota, czyli jak ukara krakera? ................................................................ 146 5.5.3. „Za 5 sekund ten program ulegnie samozniszczeniu” — automatyczna deinstalacja programu ................................................. 147 5.5.4. „Kod o ograniczonej przydatnoci do wykonania” ............................................ 148 5.6. Klucz programowy ................................................................................................ 150 5.6.1. Klucz programowy — przykad ................................................................... 151 5.6.2. Deszyfrowanie fragmentów programu w trakcie jego dziaania ................... 156 5.6.3. Przykad programu deszyfrujcego si w trakcie dziaania .......................... 158 5.7. Zaciemnianie kodu i danych programu .................................................................. 161 5.7.1. Czy to wci open source? Zaciemnianie kodu jako metoda obronna .......... 161 5.8. Zabezpieczenia. Jak to w praktyce wprowadzi w ycie .................................... 163 5.8.1. Zabezpieczenia a etapy produkcji ................................................................. 163 5.8.2. Generator zabezpiecze ................................................................................ 164 Zadania do samodzielnego wykonania ......................................................................... 165 Pytania kontrolne .......................................................................................................... 166

Rozdzia 6. Zabezpieczenie programów przed debugerami ............................... 167 6.1. Wstp ..................................................................................................................... 167 6.2. Wykrywanie debugerów ........................................................................................ 168 6.3. Utrudnianie debugowania ...................................................................................... 169 6.3.1. Wstawki kodu utrudniajce debugowanie .................................................... 169 6.3.2. Generator wstawek kodu utrudniajcych debugowanie ................................ 172 Zadania do samodzielnego wykonania ......................................................................... 175 Pytania kontrolne .......................................................................................................... 175

Rozdzia 7. Wykorzystanie internetu do zabezpieczania programów .................. 177 7.1. Wstp ..................................................................................................................... 177 7.2. Rejestracja programu przez internet ...................................................................... 178 7.3. Aktywacja numeru seryjnego przez internet .......................................................... 179 7.4. Kontrola uytkowania aplikacji z czciowym dostpem do internetu .................. 180 7.5. Weryfikacja prawidowej pracy aplikacji przez sie .............................................. 181 7.6. Przechowywanie poufnych danych uytkownika .................................................. 182 7.7. Deszyfrowanie programu w trakcie dziaania a internet ........................................ 183 7.8. Fragmentaryczne dane pobierane z internetu ......................................................... 185 7.9. Przesyanie informacji o programie do centralnego serwera .................................... 186


6

Bezpieczne programowanie. Aplikacje hakeroodporne 7.9.1. Totalna inwigilacja? Rejestrowanie informacji o zachowaniu programu i uytkownika ..................................................... 186 7.9.2. Zdalne sprawdzanie tosamoci uytkownika .............................................. 188 7.9.3. Zdalne i lokalne blokowanie dziaania programu sterowanego danymi z centralnego serwera ............................................... 191 7.10. Wirtualne wybory ................................................................................................ 192 Zadania do samodzielnego wykonania ......................................................................... 196 Pytania kontrolne .......................................................................................................... 196

Rozdzia 8. Zabezpieczanie programów przy uyciu kluczy sprztowych oraz technik biometrycznych ......................................................... 197 8.1. Wstp ..................................................................................................................... 197 8.2. Zabezpieczenie aplikacji za pomoc kluczy sprztowych ..................................... 198 8.2.1. Karty magnetyczne i elektroniczne .............................................................. 198 8.2.2. Podpis cyfrowy na trwaym noniku ............................................................ 199 8.2.3. Klucze sprztowe w zabezpieczaniu oprogramowania ................................. 200 8.3. Technologie GPS i RFID, geolokalizacja .............................................................. 201 8.3.1. Technologie GPS i RFID .............................................................................. 201 8.3.2. Problemy etyczne i moralne postpu technicznego zwizanego z lokalizacj i kontrol uytkowników ................................... 202 8.4. Weryfikacja tosamoci za pomoc technik biometrycznych ................................... 203 8.4.1. Techniki biometryczne ................................................................................. 203 8.4.2. Indywidualne oprogramowanie .................................................................... 204 8.5. Szpiegostwo elektroniczne .................................................................................... 204 8.5.1. Wamania do sieci bezprzewodowych .......................................................... 204 8.5.2. Przechwytywanie fal elektromagnetycznych ................................................ 205 Pytania kontrolne .......................................................................................................... 206

Rozdzia 9. Tworzenie bezpiecznych aplikacji w rodowisku .NET ..................... 207 9.1. Wstp ..................................................................................................................... 207 9.2. Autoryzacja oparta na uprawnieniach i rolach (Role-Based Authorization) .......... 208 9.2.1. Uprawnienia, interfejs IPermission, klasa Principal ..................................... 209 9.2.2. Autoryzacja nakazowa oparta na rolach (Imperative Role-Based Security) ........ 210 9.2.3. Autoryzacja deklaracyjna oparta na rolach (Declarative Role-Based Security) ............................................................................................................... 213 9.3. Zabezpieczenie dostpu kodu do zasobów (Code Access Security) ......................... 215 9.3.1. Nakazowe zabezpieczenie dostpu kodu do zasobów (Imperative Code Access Security) ............................................................... 215 9.3.2. Deklaracyjne zabezpieczenie dostpu kodu do zasobów (Declarative Code Access Security) .............................................................. 219 9.3.3. Poziomy regu bezpieczestwa (Security Policy Level) ............................... 220 9.3.4. Narzdzie The Code Access Security Policy Utility — caspol.exe .............. 221 9.4. Bezpieczestwo ASP.NET .................................................................................... 222 9.4.1. Metody uwierzytelniania w ASP.NET ......................................................... 222 9.4.2. Dostp anonimowy ....................................................................................... 223 9.4.3. Uwierzytelnianie systemu Windows ............................................................ 223 9.4.4. Uwierzytelnianie przy uyciu formularza ..................................................... 226 9.4.5. Uwierzytelnianie za pomoc .NET Passport ................................................ 228 9.4.6. Bezpieczna komunikacja za pomoc SSL .................................................... 228 9.5. Tworzenie silnych nazw podzespoom .................................................................. 230 Zadania do samodzielnego wykonania ......................................................................... 231 Pytania kontrolne .......................................................................................................... 232


Spis treci

7

Rozdzia 10. Bezpieczny Program ..................................................................... 235 10.1. Wstp ................................................................................................................... 235 10.2. Opis programu ..................................................................................................... 236 10.3. Przegld kodu ródowego ................................................................................... 238 10.3.1. BezpiecznyProgram.exe ............................................................................. 238 10.3.2. ZabezpieczBP.exe ...................................................................................... 245 10.3.3. StwórzKluczBP.exe .................................................................................... 246 10.4. Wnioski ............................................................................................................... 247 Zadania do samodzielnego wykonania ......................................................................... 249

Rozdzia 11. Psychologiczna strona bezpieczestwa ......................................... 251 11.1. Wstp ................................................................................................................... 251 11.2. Wpyw architektury programu na jego bezpieczestwo ...................................... 251 11.3. „Tylne wejcia” i kod tymczasowy ......................................................................... 253 11.4. Uycie gotowego kodu ........................................................................................ 254 11.5. Open source ......................................................................................................... 256 11.6. Taczce winki kontra bezpieczestwo ............................................................. 257 11.7. Security by obscurity — zabezpieczanie przez zaciemnianie .............................. 258 11.8. Karanie wamywacza ........................................................................................... 260 11.9. Brzytwa Ockhama ............................................................................................... 261 11.10. Uycie socjotechniki .......................................................................................... 261 11.11. Nie poprawiaj wamywacza ............................................................................... 262 11.12. Walka ze script kiddies ...................................................................................... 263 11.13. Ochrona przed automatami ................................................................................ 264 11.14. Ataki z wewntrz ............................................................................................... 267 11.15. acuch a sie zabezpiecze ............................................................................. 267 11.16. Caociowe spojrzenie na problem bezpieczestwa ........................................... 268 Pytania kontrolne .......................................................................................................... 270

Podsumowanie ............................................................................. 273 Odpowiedzi do pyta kontrolnych .................................................. 281 Sowniczek poj ......................................................................... 293 Skorowidz .................................................................................... 301


Rozdzia 6.

Zabezpieczenie programów przed debugerami 6.1. Wstp Wykrywanie aktywnych debugerów oraz programów zrzucajcych fragment pamici typu ProcDump to czynno , która moe by opacalna, jednak nie jest tak prosta, jak si wydaje. Istnieje wiele wyrafinowanych sztuczek wykrywajcych te programy, jednak zdecydowana wikszo z nich wykrywa dokadnie okrelone programy, jak na przykad SoftIce czy OllyDbg, i w dodatku czsto tylko okrelone ich wersje. Najgorsz informacj jest jednak to, e istnieje mnóstwo atek i rozszerze popularnych debugerów, które zabezpieczaj si przed wykryciem. Programy te po modyfikacjach (wykonanych czsto przez samych krakerów dla siebie) ukrywaj si i stosuj techniki mylce. Dlatego wykrywanie debugerów jest zadaniem czsto skazanym na porak. Zwykle jest si pó kroku do tyu, a nawet jeli uda nam si poprzez zaimplementowanie wielu technik jednoczenie wykry skutecznie wszystkie istniejce debugery, to i tak jest to tylko chwilowe zwycistwo, bo za chwil powstan takie, których nie wykryjemy. Jest to wic typowe leczenie objawów, a nie przyczyn choroby. Nie oznacza to, e nie naley w ogóle przejmowa si problemem i nie stosowa adnych zabezpiecze. Jednak jeli Czytelnik nie jest geniuszem assemblera, powinien zostawi to zadanie innym i uy do tego celu programu pobranego z internetu. Jest ich wiele, zarówno darmowych, jak i patnych. Do tych drugich nale m.in. opisane w rozdziale drugim TheMida czy AsProtect. Dziki temu zaoszczdzimy sobie czasu na próby, których wyniki mog by wtpliwe, a co wicej, których rezultat ciko bdzie nam zweryfikowa , poniewa nie bdziemy dysponowa odpowiedni iloci wersji debugerów. Procedury kontrolujce dziaanie takich programów nie musz by niestandardowe i dlatego warto pozostawi je fachowcom.


168

Bezpieczne programowanie. Aplikacje hakeroodporne

Z tych wanie powodów w rozdziale tym nie znajdziecie wielu wyrafinowanych sztuczek blokujcych debugery. Opisz jedynie kilka najprostszych, aby kady móg sobie wyrobi opini na ten temat i w razie potrzeby poszuka bardziej zaawansowanych informacji w innych ródach. Zamiast tego skupi si na ogólnych metodach utrudniania debugowania, które mog by uyteczne niezalenie od stosowania funkcji wykrywajcych debugery lub komercyjnych systemów zabezpiecze, które równie takowe funkcje posiadaj.

6.2. Wykrywanie debugerów Najprostszym sposobem wykrywania debugerów jest wstawienie do kodu po prostu: if(IsDebuggerPresent()) // wykonaj jaki kod, np. zamknij program;

Mona to atwo przetestowa , wpisujc w miejsce komentarza na przykad polecenie wywietlenie jakiego komunikatu i uruchamiajc aplikacj krok po kroku w Visual Studio. Debuger VS zostanie wykryty i program wywietli komunikat. Uruchamiajc program z pliku wykonywalnego, nie zobaczymy komunikatu. Tego typu zabezpieczenie bdzie jednak cakowicie nieskuteczne w przypadku zaawansowanych debugerów uywanych przez krakerów, takich jak SoftIce czy OllyDbg. Wamywacze uywaj zmodyfikowanych wersji tych programów, które s zabezpieczone nie tylko przed opisan powyej weryfikacj, ale take przed wieloma bardziej zaawansowanymi metodami. Twój program musiaby mie naprawd szerok gam testów, aby mona byo mie pewno wykrycia wikszoci mutacji tych debugerów. Dlatego wanie lepiej jest uy gotowego narzdzia wykonanego przez specjalistów, a samemu skupi si na innych zabezpieczeniach. Jako ciekawostk podam jeszcze przykady dwóch rozwiza tego typu: mov ah,43h int 68h cmp eax,0F386h jz mamy_debugger

W tym tecie próbujemy zbada , czy uruchomiony zosta program SoftIce poprzez wykrywanie sterownika debugera systemowego. Kolejny przykad opiera si na wykrywaniu int 41h uywanego przez debugery: xor ax,ax mov es,ax mov bx, cs lea dx, int41handler xchg dx, es:[41h*4] xchg bx, es:[41h*4+2] in al, 40h xor cx,cx int 41h xchg dx, es:[41h*4] xchg bx, es:[41h*4+2]


Rozdzia 6. i Zabezpieczenie program贸w przed debugerami

169

cmp cl,al jnz si_jest int41handler PROC mov cl,al iret int41handler ENDP

Obydwa powysze przykady wykrywania debugera SoftIce pochodz ze strony: http://4programmers.net/Assembler/FAQ/Wykrywanie_debuggera_(SoftICE)1.

6.3. Utrudnianie debugowania 6.3.1. Wstawki kodu utrudniajce debugowanie Utrudnienie debugowania mona wykona , wklejajc w wiele miejsc kodu r贸dowego programu relatywnie nieskomplikowane wstawki. Jeli uywamy jzyka C/C++, sprawa jest prosta, moemy bowiem wykorzysta makra preprocesora, co w poczeniu z tw贸rczym uyciem instrukcji skoku bezwarunkowego (tak oczerniane przez wszystkich goto), wstawek assemblerowych czy konstrukcji takich jak setjmp czy longjmp, moe solidnie skomplikowa ledzenie programu w debugerze. Wane jest, aby tego typu wstawki pozostaway neutralne dla kodu. Oto przykad: jmp_buf env; #define AD(kod, numer) if( setjmp(env) == 0 ) { goto skok_ad_##numer; } else { kod; } goto koniec_ad_##numer; skok_ad_##numer: longjmp(env, 1); koniec_ad_##numer: ;

\

Powysze makro wstawia kod wygldajcy mniej wicej tak: if( setjmp(env) == 0 ) { goto skok_ad_1; } else 1

Tre udostpniona na zasadach licencji Creative Commons Attribution: http://creativecommons.org/licenses/by/2.0/pl/legalcode.

\ \ \ \ \ \ \ \ \ \ \


170

Bezpieczne programowanie. Aplikacje hakeroodporne { // W A CIWY FRAGMENT KODU } goto koniec_ad_1; skok_ad_1: longjmp(env, 1); koniec_ad_1:

W trakcie wykonania instrukcja setjmp(env) == 0 wywoana po raz pierwszy ustawi punkt powrotu dla skoku longjmp na miejsce swojego wywoania oraz zwróci warto TRUE. W zwizku z tym kolejn wykonywan instrukcj bdzie goto skok_ad_1. Nastpnie wykona si longjmp(env,1), które spowoduje przesunicie wykonania z powrotem do pierwszej linii kodu. Tym razem jednak warunek nie bdzie ju speniony i wykonany zostanie cig instrukcji oznaczony jako W A CIWY FRAGMENT KODU. Na koniec instrukcja goto koniec_ad_1 zapewni prawidowe opuszczenie tego bloku kodu. Caa konstrukcja ma wple w kod kilka dziwnych i zaciemniajcych sens skoków wyduajcych i utrudniajcych ledzenie wykonania w debugerze. Oczywicie powinna by uyta w programie wiele razy, aby by naprawd skuteczn. Uycie makra jest nastpujce. Kod, który zaciemniamy, otacza si wywoaniem makra: AD(kod, x). Pewn wad tego makra jest to, e trzeba go wywoywa z dodatkowym

parametrem, który za kadym razem musi by inny. To, co przed zaciemnieniem wyglda tak: for( int i = 0; i < 10; i++) for( int j = 0; j < i; j++) if( x[i] < x[j]) { int tmp = x[i]; x[i] = x[j]; x[j] = tmp; }

po — bdzie wyglda tak: AD( for( int i = 0; i < 10; i++) for( int j = 0; j < i; j++) AD(if( x[i] < x[j]) { int tmp = x[i]; AD(x[i] = x[j] ,2); AD(x[j] = tmp ,3); } , 1) , 0)

Inne makra mog korzysta wprost ze wstawek assemblerowych: #define WSTAWKA_START_ASM __asm PUSH EAX __asm PUSH EBX __asm PUSH ECX __asm PUSHF #define WSTAWKA_STOP_ASM __asm POPF __asm POP ECX __asm POP EBX __asm POP EAX #define WSTAWKA_PUSTA_1 WSTAWKA_START_ASM __asm MOV EAX, ECX __asm MOV EAX, 0 __asm ´ADD EAX, 0xD007 _asm MOV EBX, EAX WSTAWKA_STOP_ASM


Rozdzia 6. i Zabezpieczenie programów przed debugerami

171

#define WSTAWKA_PUSTA_2 WSTAWKA_START_ASM MAKE_DUMMY_1 __asm TEST EAX, EAX __asm ´PUSHF __asm POP EAX __asm MOV EAC, EAX MAKE_STOP_ASM #define WSTAWKA_PUSTA_3 WSTAWKA_START_ASM __asm MOV EAX, EBX __asm ADD EAX, 0x01ac __asm PUSH EAX __asm MOV EAX, EBX __asm POP EBX WSTAWKA_STOP_ASM

Powysze kody nie maj adnego sensu, natomiast nie zmieniaj stanu rejestrów ani flag (dziki uyciu makr WSTAWKA_START_ASM i WSTAWKA_STOP_ASM). Uycie jest proste: wywoanie makra wstawia si po prostu do kodu. for( int i = 0; i < 10; i++) for( int j = 0; j < i; j++) if( x[i] < x[j]) { WSTAWKA_PUSTA_3 int tmp = x[i]; WSTAWKA_PUSTA_3 WSTAWKA_PUSTA_2 x[i] = x[j]; WSTAWKA_PUSTA_3 WSTAWKA_PUSTA_1 WSTAWKA_PUSTA_3 x[j] = tmp; WSTAWKA_PUSTA_2 }

Prawda, e proste? Polecam obejrzenie kodu assemblerowego wygenerowanego przez kompilator dla kadej z trzech powyszych wersji kodu. Powiciwszy 3 – 4 godziny, mona wyprodukowa kilkanacie czy nawet kilkadziesit podobnych fragmentów kodu i uy ich w setkach miejsc, wykonujc po prostu prac typu kopiuj/wklej. Nie powstrzyma to samo w sobie adnego krakera, ale utrudni mu nieco prac. Oczywicie takie wstawki wyduaj kod oraz nieznacznie spowalniaj jego wykonanie. Jeli jednak bdziemy uywa ich wycznie w najbardziej krytycznych fragmentach programu, dotyczcych zabezpiecze, to jest to opacalne. Zwaszcza e przy dzisiejszych prdkociach procesorów tych kilkadziesit instrukcji maszynowych nie bdzie duym obcieniem. Powysze makra s banalne i maj wycznie posuy jako przykad tego, co mona robi . W prawdziwym systemie warto posiedzie nieco duej i doda nastpujce elementy:  Wstawki assemblerowe z du iloci skoków wymieszanych bez adu, na

przykad: WSTAWKA_START_ASM __asm JMP skok_1x; skok_1x: __asm TEST EAX,EBX; __asm JMP skok_3x; skok_5x: __asm MOV EAX, EBX; __asm JMP skok_4x; skok_2x: __asm MOV EAX, ECX; __asm JMP skok_5x; skok_4x: __asm POPF; __asm JMP skok_6x; skok_3x: __asm MOV EAX, 0; __asm PUSH EAX; __asm MOV EAX, EBX;


172

Bezpieczne programowanie. Aplikacje hakeroodporne __asm TEST EAX, EAX; __asm JNZ skok_4x; __asm JMP skok_2x; skok_6x: __asm MOV EAX,EBX; WSTAWKA_STOP_ASM

 Uycie nie tylko skoków bezwzgldnych, ale take duej iloci zagniedonych funkcji oraz skoków warunkowych (jak w powyszym przykadzie skok JNZ).  Wstawianie instrukcji, które nie bd nigdy wykonane, w poblie waciwego

kodu. Mona tego dokona poprzez skoki. Ciekaw instrukcj, któr mona w takie miejsce wstawi , jest __asm int 3, czyli instrukcja przerwania programowego.  Mona nawet pokusi si o sterowanie przepywem wykonania za pomoc

wyjtków. Przez cay czas powinnimy mie jednak na uwadze to, e jest to tylko dodatek, i uwaa , aby nie zaciemni sobie kodu nadmiernie.

6.3.2. Generator wstawek kodu utrudniajcych debugowanie Makra, o których pisaem powyej, to interesujca technika, ale maj one kilka wad:  Nie kady jzyk posiada makra preprocesora. Mona jeszcze ratowa si uyciem funkcji rozwijanych w miejscu wywoania (inline), ale nie zawsze i nie

wszystko uda si nimi zastpi .  Makra pisane rcznie s zazwyczaj schematyczne. Ciko je sparametryzowa

czy zmienia im dynamicznie tre .  Nawet najwygodniejsze w uyciu widniej w kodzie ródowym, zmniejszajc

jego czytelno oraz utrudniajc testowanie (i debugowanie, ale w kocu po to zostay napisane). Lepszym rozwizaniem bdzie wic zostawienie wersji deweloperskiej kodu w stanie czystym i wstawianie kodu antydebugowego przez automat dopiero w procesie produkcji oprogramowania. Dziki uyciu zautomatyzowanych systemów produkcji oprogramowania takich jak na przykad CruiseControl .NET, systemów kontroli wersji takich jak CVS czy SVN oraz narzdzi skryptowych takich jak NANT, Python czy Ruby proces ten nie powinien by skomplikowany. Wyglda on nastpujco:  Prace deweloperskie wykonywane s przez programistów. Programista,

koczc prace, wysya kod ródowy do repozytorium systemu kontroli wersji.  Automat pobiera zmodyfikowane róda do swojej lokalnej kopii.  Prekompilacja — wygenerowanie przez automat wstawek antydebugowych

i wstawienie ich do kodu.  Kompilacja zmodyfikowanego kodu.  Wykonanie testów automatycznych.


Rozdzia 6. i Zabezpieczenie programów przed debugerami

173

Automat taki moe generowa wstawki losowo sporód zbioru elementów w miejsca oznaczone w kodzie w specyficzny sposób. Dziki temu jedyne, co musi zrobi programista, to wstawi takie oznaczenia wszdzie, gdzie chce. Moe to by na przykad specyficzny komentarz: // ZABEZPIECZ for( int i = 0; i < 10; i++) for( int j = 0; j < i; j++) if( x[i] < x[j]) { // ZABEZPIECZ int tmp = x[i]; // ZABEZPIECZ x[i] = x[j]; // ZABEZPIECZ x[j] = tmp; // ZABEZPIECZ } // ZABEZPIECZ

Na pycie CD znajduje si kod ródowy programu GenerujZabezpieczenia napisanego w jzyku C#. Jest to program uruchamiany z linii polece, którego jedynym parametrem jest cieka do pliku ródowego (w jzyku C++), w którym wstawki // ZABEZPIECZ maj zosta zmienione na wstawki antydebugowe. Czytelnik moe rozbudowa i zmodyfikowa go wedug wasnych potrzeb. Mona zmieni go w nastpujcy sposób:  Dodanie wikszej iloci elementów sucych do generowania wstawek.  Dodanie generacji wstawek dla rónych jzyków programowania.  Dodanie generacji kilku rodzajów wstawek, w tym parametryzowanych.  Stworzenie bardziej skomplikowanych wstawek.  Stworzenie mniej schematycznych wstawek.

Naley przy tym pamita o tym, e program po prostu wstawia wstawk tam, gdzie zobaczy stosowny tekst. Moe wic si zdarzy , e kod ródowy po modyfikacji nie bdzie si kompilowa lub w ogóle nie bdzie dziaa . Zaley to od sposobu uycia oznakowania wstawek. Jeli ich tre pojawi si w nietypowym miejscu, na przykad w cigu znaków do wywietlenia na konsoli itp., to dziaanie programu moe zmieni si na nieprawidowe. Kod programu jest do prosty. Podstawow funkcj jest ModyfikujPlik, która odczytuje plik, wyszukuje frazy // ZABEZPIECZ i podmienia je na losowo wygenerowane wstawki assemblerowe. Generowane s dwa typy wstawek:  Statyczna — od 1 do 9 rozkazów assemblera wylosowanych z tablicy statyczneWstawki.  Faszywe skoki — trzy przeplatajce si fragmenty kodu (wylosowane jak wstawka

statyczna).


174

Bezpieczne programowanie. Aplikacje hakeroodporne

Oto gówna funkcja: static void ModyfikujPlik(string a cieka) { // odczyt pliku TextReader reader = new StreamReader(a cieka, ´System.Text.Encoding.Default); string zawarto = reader.ReadToEnd(); reader.Close(); // modyfikacja zawartoci int ile = 0; while (zawarto.IndexOf(oznaczenieWstawki) != -1) { int indeksWstawki = zawarto.IndexOf(oznaczenieWstawki); string wstawka = UtwórzWstawk(); zawarto = zawarto.Substring(0, indeksWstawki) + wstawka + ´zawarto.Substring(indeksWstawki + oznaczenieWstawki.Length); ile++; } // zapis pliku TextWriter writer = new StreamWriter(a cieka, false, ´System.Text.Encoding.Default); writer.Write(zawarto); writer.Close(); Console.WriteLine(a cieka + " zosta zmodyfikowany " ´+ ile.ToString() + " razy"); }

Pojedyncz wstawk tworzy funkcja UtwórzWstawk(): static string UtwórzWstawk() { string cigPodmiany = pocztekWstawki; int ile = rd.Next(1, 3); for (int i = 0; i < ile; i++) { if(rd.Next(0,2) == 0) cigPodmiany += UtwórzSztuczneSkoki(); else cigPodmiany += UtwórzStatycznWstawk(); } return cigPodmiany + koniecWstawki; }

T funkcj zmodyfikuj, jeli chcesz mie wicej typów wstawek. Po prostu nie losuj liczb z zakresu <0; 2), lecz wikszego, i zastp warunek instrukcj switch. Funkcje UtwórzSztuczneSkoki i UtwórzStatycznWstawk wygldaj nastpujco: static string UtwórzStatycznWstawk() { int ile = rd.Next(1, 10); string retWart = ""; for (int i = 0; i < ile; i++) {


Rozdzia 6. i Zabezpieczenie programรณw przed debugerami

175

retWart += statyczneWstawki[rd.Next(0, statyczneWstawki.Length)] + ยด"\r\n"; } return retWart; } static string UtwรณrzSztuczneSkoki() { string retWart = ""; string etykieta1 = UtwรณrzEtykiet(); string etykieta2 = UtwรณrzEtykiet(); string etykieta3 = UtwรณrzEtykiet(); retWart += "__asm JMP " + etykieta1 + ";\r\n"; retWart += etykieta2 + ":" + UtwรณrzStatycznWstawk(); retWart += "__asm JMP " + etykieta3 + ";\r\n"; retWart += etykieta1 + ":" + UtwรณrzStatycznWstawk(); retWart += "__asm JMP " + etykieta2 + ";\r\n"; retWart += etykieta3 + ":" + UtwรณrzStatycznWstawk(); return retWart; }

Druga z nich tworzy skoki ukadajce si w cig: 1. Id do 3 2. Id do 4 3. Id do 2 4. Koniec

Pomidzy nimi znajduj si statyczne wstawki wygenerowane przez UtwรณrzStatycznWstawk (), ktรณrej z kolei kod jest tak prosty, e raczej nie trzeba go objania . Warto jeszcze doda , e kada wstawka zaczyna si odoeniem stanu rejestrรณw i flag na stos, a koczy pobraniem ich stamtd. Dziki temu stan programu nie zmienia si.

Zadania do samodzielnego wykonania 1. Rozwi program GenerujZabezpieczenia zgodnie z sugestiami w treci rozdziau.

Pytania kontrolne P 6.1. Jakie s wady makr antydebugowych wstawianych rcznie do kodu? a) S cakowicie nieskuteczne i nie przeszkadzaj krakerom. b) W niektรณrych jzykach programowania ich implementacja moe by trudna.


176

Bezpieczne programowanie. Aplikacje hakeroodporne c) Nie jest atwo napisa takie makra nieschematycznie, zwykle s podobne do

siebie. d) Znajduj si w kodzie r贸dowym, co zaciemnia go i utrudnia testowanie.

Bezpieczne programowanie. Aplikacje hakeroodporne  

Wyobraź sobie sytuację, w której poświęcasz mnóstwo czasu na stworzenie nowego, ciekawego rozwiązania w świecie informatyki. Kosztuje Cię to...

Advertisement