programinio kodo saugumas -...

21
2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 1 Programinio kodo saugumas Rolandas Griškevičius [email protected] MSN: [email protected] http://fmf.vgtu.lt/~rgriskevicius

Upload: vuhanh

Post on 17-Mar-2018

228 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 1

Programinio kodo saugumas

Rolandas Griškevičius

[email protected]

MSN: [email protected]

http://fmf.vgtu.lt/~rgriskevicius

Page 2: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 2

Kodo “malėjas”● A code grinder as defined by the hacker community

reference, the Jargon Dictionary (http://www.eps.mcgill.ca/jargon/jargon.html) is a developer who lacks creativity and is bound by rules and primitive techniques. Developers who become code grinders rarely do so because of lack of ambition; code grinders are born from an environment that struggles with freedom at a developer level.

● Dažnai yra blogo kodo “šaltinis”

Page 3: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 3

Assert / Trace● Many compilers offer an assert() macro. The assert()

macro returns TRUE if its parameter evaluates TRUE and takes some kind of action if it evaluates FALSE. Many compilers will abort the program on an assert() that fails; others will throw an exception

● One powerful feature of the assert() macro is that the preprocessor collapses it into no code at all if DEBUG is not defined. It is a great help during development, and when the final product ships there is no performance penalty nor increase in the size of the executable version of the program.

● TRACE makrosas = IF ( DEBUG ) THEN PRINTF (...)

Page 4: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 4

Assert 2

1: //ASSERTS2: #define DEBUG3: #include <iostream.h>4:5: #ifndef DEBUG6: #define ASSERT(x)7: #else8: #define ASSERT(x) \9: if (! (x)) \10: { \11: cout << "ERROR!! Assert " << #x << " failed\n"; \12: cout << " on line " << __LINE__ << "\n"; \13: cout << " in file " << __FILE__ << "\n"; \14: }15: #endif16:17:18: int main()19: {20: int x = 5;21: cout << "First assert: \n";22: ASSERT(x==5);23: cout << "\nSecond assert: \n";24: ASSERT(x != 5);25: cout << "\nDone.\n";26: return 0;27: }

Page 5: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 5

Exception● Galingas klaidų apdorojimo mechanizmas

● Pagrindinė išimčių programavimo klaida – netvarkingas gaudymas

● Išimtys turi būti pagaunamos kuo “arčiau” galimos jų generavimo vietos:● Stabilesnis programos veikimas● Pilna informacija apie klaidą

● GPF klaidas taip pat galima gaudyti, bet reikia specialiai programoje pakeisti standartinių išimčių “gaudyklę”● API SetUnhandledExceptionFilter

Page 6: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 6

Kodo maskavimas ● angl. literatūroje - “obfuscation”

● Ypatingai daug yra PHP

● Google → php obfuscator

● Mokamas: ZendGuard

● Nemokami → google

Page 7: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 7

Primityvi php obfuskacija

eval( gzuncompress( base64_decode('eNplj1dvwjAAhP9MpNgiCGcQEkV5YG/MXi9VhjMgCzsD+PUFtWorVXdPp7tPOg4jhPBLyPTSjCSAwxh/BQJPbR4aVRBGBNTrHH4X34aeT3IGuJ+pICJJgca/WEG6Co0X8Xtp+s8icdI4o4QxYFuMqMqHS5zUJYDlNKfAo8Ry/yJkVYMCfx90rWevcz1N4uNo02qjw3yVyGoNb/Nxujj3Pfvih+Xj1hCl3V6pqOaQ5Zpl0XRWuPqwGZi8wLc73V5/MByNJ9PZfIGXq/Vmu9sfjqezZTsu8fwgvFyjOEmzG2V5UVb3xxOJkqw01Zam1xo8hNAgpRWB30PQ+ATAxF8l')));

Page 8: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 8

Kintamujų inicializacija● Kalbose, kur kintamieji yra polimorfiniai, ir reikšmės

priskyrimas inicializuoja kintamąjį, pvz. php, vbs, python, dažnai galima sutikti kodą:

● Tačiau suteikiant “default” reikšmę kintamajam iš karto sutrumpėja kodas ir padidėja aiškumas:

$param1 = "";if( .... ) $param1 = "a" else $param1 = "b";

$param1 = "b";if( ... ) $param1 = "a";

Page 9: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 9

“All input is evil”● Taikoma visur, kur tik sutinkami įvesties duomenys:

● WWW puslapiai

– SQL injekcija, XSS ir t.t.● Įvairūs GUI

– Mažiau pavojinga, jei vartotojas dirba su lokalia sistema– Jei GUI yra nutolusios sistemos interfeisas, galioja taisyklės,

panašios į WWW aplikacijų saugumo● Parametriniai ir duomenų failai

– Tikrinti, ar vartotojas negali “pakišti” savo perdaryto failo– Parametruose apriboti vartotojui keisti kritines parametrų

sekcijas● Parametrai su nuoroda į failus

– Tikrinti failo tipą: Windows – pagal plėtinį, Unix – file komanda

– Tiktai santykinės nuorodos į failus !–

Page 10: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 10

Koks bus rezultatas ?

#include <stdio.h>

int main( int argc, char** argv ) { int i = 0; int j = 0; int k = 0;

for( i = 0; i < 10; i++ ) j++, k++; printf( "j=%d k=%d\n", j, k );}

Page 11: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 11

C kablelis● C kablelis yra dažnai

užmirštamas, todėl

kartais gali būti naudo-

jamas savotiškai kodo

“obfuskacijai”.

● Kodas dešinėje suveikia

“nelauktai”:

#include <stdio.h>

int main( int argc, char** argv ) { int i = 0; int j = 0; int k = 0;

for( i = 0; i < 10; i++ ) j++, k++; printf( "j=%d k=%d\n", j, k );}

mygentoo> /tmp $ gcc test_comma.c -o test_commamygentoo> /tmp $ ./test_commaj=10 k=10mygentoo /tmp $

Page 12: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 12

C ir C++ “smulkmenos”● Neinicializuota C nuoroda – potenciali skylė

● Operatorius new:● new → delete● new[] → delete[]

pt = new myclass[3];delete[] pt;

Page 13: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 13

Html validacija● Siekiant, kad puslapis atrodytų “švarus” ir

“kultūringas”, patartina jo kodą validuoti, pvz http://validator.w3.org/

● Validavimas taip pat gali padėti pamatyti klaidas ten kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos kode.

● Prieš validuojant reikia prisiminti, kad kai kurie html “tag'ai” yra laikomi pasenusiais ir validatorius jiems meta klaidą:● align, alink, background, bgcolor, color, hspace, link, size,

text, type, vlink, vspace

– visi šie keičiami į CSS parametrus

Page 14: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 14

Kodo auditas● “Rankinis”

● Gali identifikuoti klaidas/pažeidžiamumus, kurių neidentifikuos automatinės priemonės

● Tačiau reikalingas patyręs auditorius

● “Penetration testing”● Sistemos “streso” testas simuliuojant piktavališką veikimą● Metodika varijuoja nuo pilnai “juodos dėžės” iki “baltos

dėžės principo”. Ypatingai tinka WEB aplikacijoms, kadangi http protokolas yra lengvai simuliuojamas http://www.securityfocus.com/infocus/1709

● Automatinė (statinė) kodo analizė● Daug įvairių įrankių● Vienas ar kitas įrankis veikia tik tam tikroms prg. kalboms

Page 15: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 15

Automatinio kodo audito įrankiai 1● RATS (Rough Auditing Tool for Security)

● www.securesoftware.com / www.fortify.com● C++, PHP, Python, Ruby, C#, ColdFusion, Java, JSP,

PL/SQL, T-SQL, XML, VB.NET● Windows, *nix● Mokamas, daugiau nei 1K$ už licenziją

● Yasca● www.yasca.org● Atviras kodas (BSD licenzija)● Windows, *nix → PHP variklis● C++, Java, .NET, ASP, Perl, PHP, Python, Cobol, etc● Turi savo varikliukus, kitais atvejais pasijungia išorinius,

pvz. Java atveju pasijungia sau JLint

Page 16: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 16

Automatinio kodo audito įrankiai 2● Cppcheck

● cppcheck.wiki.sourceforge.net● Atminties “nutekėjimai” (memory leak), buferio perpildymas,

senos funkcijos ir t.t.● GUI priklausomas nuo QT interfeiso

● graudit● www.justanotherhacker.com/projects/graudit.html● “elementarus” tikrinimo scenarijus pasitelkiant bash, grep,

sed → GUI nėra● Atviras kodas, Windows, *nix● asp, jsp, perl, php, python.

Page 17: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 17

Automatinio kodo audito įrankiai 3● SWAAT

● http://www.owasp.org/index.php/Category:OWASP_SWAAT_Project● XML išvestis● Pagal nutylėjimą turi bazes Python, Perl, PHP, C++● Bazės nuolat pildomos● Atviras kodas, Unix aplinkose veikia su Mono, kadangi

parašyta C#● PHP bug scanner

● raz0r.name/releases/php-bug-scanner● Laisvas naudojimas, Windows● Rusų “chakerių” kūrinys, instrukcijos, puslapis rusiški

Page 18: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 18

Automatinio kodo audito įrankiai 4● Pixy

● pixybox.seclab.tuwien.ac.at● Laisvas naudojimas, Unix, Windows● Veikimas skiriasi nuo analogų: kuriamas duomenų srautų

grafas ir sekami duomenų srautai.● Skirtas daugiausia XSS ir SQL injekcijos aptikimui● Grafai pateikiami vaizdžiai

● Klockwork Insight● Shareware, Windows● C, C++, Java, C# (beta)● Integruojasi su VS ir Eclipse● C++, C#, Java

Page 19: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 19

Automatinio kodo audito įrankiai 5● Coverity Prevent Static Analysis

● www.coverity.com/products● Shareware, Windows● C, C++, Java, C#● Vienas populiariausių ir plačiausiai žinomų● Integracija su gcc ir MS kompiliatoriais ir aplinkomis

Eclipse, VS

● OWASP Code Crawler● http://www.owasp.org/index.php/Category:OWASP_Code_Crawler● .NET, Java● Pilnas pažeidžiamumo aprašymas

Page 20: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 20

Automatinio kodo audito įrankiai 6● Grendel Scan

● www.grendel-scan.com● “Juodos dėžės” WEB skaneris, “penetration test” įrankis,

“fuzz” testavimo įrankis● Veikia Java 5 aplinkoje → Windows, *nix

– Vidinis proxy http srauto kontrolei– http “fuzz”eris– paslėptų katalogų paieška, duomenų apie nutolusią sistemą

surinkimo modulis– CSRF skaneris

Page 21: Programinio kodo saugumas - fmf.vgtu.ltfmf.vgtu.lt/~rgriskevicius/lectures_data/hl_id_0008/lecture11.pdf · kur html “tag'ai” yra generuojami programiniu būdu, t.y. programos

2009-12-18 R. Griškevičius, Saugus programavimas, VGTU, 2009 21

Kai reikia įrodinėti pažeidžiamumą● Metasploit Framework

● www.metasploit.com

● Pagalba:● http://www.ethicalhacker.net/content/view/81/24/

● Metasploit pagalbiniai aprašymai (tutorials) ir video medžiaga:● http://www.darknet.org.uk/2007/07/learn-to-use-metasploit-

tutorials-docs-videos/