deset zapovijedi za sigurno kodiranje (2003)

25
Deset zapovijedi za sigurno kodiranje Vatroslav Mihalj svibanj 2003.

Upload: vatroslav-mihalj

Post on 24-May-2015

296 views

Category:

Documents


7 download

DESCRIPTION

Based on M. “Defend Your Code with Top 10 Security Tips Every Developer Must Know” by Howard and K. Brown, MSDN Magazine, September 2002.

TRANSCRIPT

Page 1: Deset zapovijedi za sigurno kodiranje (2003)

Deset zapovijediza sigurno kodiranje

Vatroslav Mihalj

svibanj 2003.

Page 2: Deset zapovijedi za sigurno kodiranje (2003)

2

M. Howard, K. Brown: “Defend Your Code with Top 10 Security Tips Every Developer Must Know”MSDN Magazine, September 2002.

Page 3: Deset zapovijedi za sigurno kodiranje (2003)

3

Uvod

previše povjerenja u kod, neugradnja sigurnosnih mehanizama, otvoreni portovi, prevelika prava accounta, loš error handling...doživjeti nepriliku je vrlo lako

“Writing Secure Code” preopširan?10 brzopoteznih!

Page 4: Deset zapovijedi za sigurno kodiranje (2003)

4

1. Ne vjeruj inputu

nikad, ali NIKAD ne vjerovati inputumoguća pojava buffer overruna, SQL injectiona, cross-site scriptinga....NET Framework 1.1 “tjera” da se koristi validiranjeNE ISKLJUČIVATI ZBOG LIJENOSTI

Page 5: Deset zapovijedi za sigurno kodiranje (2003)

5

2. Zaštiti se od buffer overruna

javlja se kad primljeni podaci traže više mjesta nego se očekuje (uglavnom C/C++)overflow u interni memorijski prostorcracker ovako uklanja originalnu

povratnu adresu sa stacka i ubacuju svoj kod

strsafe.h - safe string handling for C

Page 6: Deset zapovijedi za sigurno kodiranje (2003)

6

Primjer

void DoSomething (char *cBuffer, DWORD, cbBuffer){char cBuffDest[32];memcpy(cBuffDest, cBuffer, cbBuffer);}

tko jamči da je cbBuffer 32?ukoliko ima više podataka, pregazi se povratna adresa, te se može ubaciti poziv bilo čega

Page 7: Deset zapovijedi za sigurno kodiranje (2003)

7

provjeriti odgovara li veličina buffera količini podataka access violation u debugging modu ako premalen

void DoSomething (char *cBuffer, DWORD, cbBuffer){const void cbBuffDest = 32;char cBuffDest[cbBuffDest];

#ifdef _DEBUGmemset(cBuffDest, 0x33, cbBuffer);

#endifmemcpy(cBuffDest, cBuffer, min(cbBuffDest ,

cbBuffer));}

Page 8: Deset zapovijedi za sigurno kodiranje (2003)

8

3. Spriječi cross site scripting

specifično za web<script language=c#>

Response.Write (“Hello, ”+ Request.QueryString(“name”));</script>

poziv: http://foo.com/bar.aspx?name=NellMcAndrew

netko može “našaliti” ubaciti skriptu i HTML:http://foo.com/bar.aspx?name=<script>alert(‘boo!’);</script>

dijalog s “Boo” moglo bi biti i nešto drugo...

Page 9: Deset zapovijedi za sigurno kodiranje (2003)

9

.NET Framework 1.1 ne zahtjeva validaciju uzalud!

Regex r = new Regex (@”^[\w]{1,40}$”);if (!r.Match(strName).Success)

{//invalid string handling...

}

escaping problematičnih znakova: HttpServerUtility.HtmlEncode (ASP.NET), server.HTMLEncode (ASP)

Page 10: Deset zapovijedi za sigurno kodiranje (2003)

10

4 Ne zahtjevaj sa permission

queryji koji komuniciraju s back-end data storeom: opasnost od SQL injectiona

void DoQuery (string ID){Sqlconnection sql = new SqlConnection(@”data

source=localhost;” + “user id=sa;password=password”);sql.Opensqlstring = “SELECT something FROM mytable WHERE id=‘” + Id + “’”;SqlCommand cmd = new SqlCommand(sqlstring, sql);...

Page 11: Deset zapovijedi za sigurno kodiranje (2003)

11

OK: SELECT something form mytable WHERE id = ‘1001’ SHIT: SELECT something FROM mytable WHERE id = ‘1001’; DROP TABLE mytable --’upozorenja: ne spajati se kao sa iz aplikacija koristiti regexe i stored procedure koristiti Windows Integrated authentication ili

se spajati na predefiniran acc. s ograničenim pravima

Page 12: Deset zapovijedi za sigurno kodiranje (2003)

12

Regex r = new Regex (@”^\d{1,4}$”);if (!r.Match(Id).Success

throw new Exeption(“invalid Id”);

SqlConnection sqlConn = new SqlConnection(strConn);string str = “sp_CmonDoSomething”;SqlCommand cmd = new SqlCommand(str, sqlCon);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add(“@ID”, id);

Page 13: Deset zapovijedi za sigurno kodiranje (2003)

13

5. Oprezno s kriptografskim kodom

“domaći” kripto kod sadrži mnoge pogreškesecurity through obscurity je glupost - dokaz uspjesi K. Mitnicka osloniti se na dokazana rješenja

umjesto razvoja vlastitih “algoritama” ili implementacija, osloniti se na provjerene librarye (npr. CryptoAPI; primjer: http://fly.srk.fer.hr/~ignac/dipl-part1.zip )

Page 14: Deset zapovijedi za sigurno kodiranje (2003)

14

6. Reduciraj profil raspoloživ napadaču

ne instalirati feature koji se ne zahtjeva ili se praktično ne koristi (naročito razmišljati kod IIS-a)princip najmanjih dovoljnih dozvola aplikacija ne smije raditi s

administratorskim ovlastima ako joj to apsolutno ne treba

primjer: Windows Server 2003

Page 15: Deset zapovijedi za sigurno kodiranje (2003)

15

7.Nemoj davati veća prava nego je potrebno

security policy (OS, .NET framework)nije toliki problem kad korisnik želi učiniti nešto gadno insider attacks mogu biti jaaaako

gadni, ali...NENAMJERNA AKCIJA MOŽE DOVESTI

DO JOŠ GADNIJIH POSLJEDICA

Page 16: Deset zapovijedi za sigurno kodiranje (2003)

16

attachmnet iz e-mail: trojan, virus...serverske aplikacijemalformirani zahtjevi (SQL injection,

cross-site scripting...)kod se počne nenamjerno “zločesto”

ponašati, jer ne očekuje takvo nešto

Page 17: Deset zapovijedi za sigurno kodiranje (2003)

17

potreba postavljanja zidova oko koda da bi se spriječile moguće štetekodu se dodjeljuje onoliko prava i

resursa koliko mu treba za ispravno izvršavanje

odvajanje u assemblye s različitim pravima

Page 18: Deset zapovijedi za sigurno kodiranje (2003)

18

8. Obrati pažnju na error handling kod

posvetiti više pažnje detaljima i dizajnuisprobati execution pathove oko error handlinga stepping kroz kod u debuggeru testirati error handling kod

error handling code može unijeti ozbiljne pogreškeako se dogodi pogreška, sustav treba ostaviti u sigurnom stanju

Page 19: Deset zapovijedi za sigurno kodiranje (2003)

19

bool accessGranted = true;try

{//provjeri imamo li pristup ovom fajlunew FileStream(@”c:\t.txt”, FileMode.Open, FileAccess.Read).Close();}

catch (securityException e) //pristup nije dozvoljen{accessGranted = false;}

catch (...) //nešto drugo se dogodilo{...}

Page 20: Deset zapovijedi za sigurno kodiranje (2003)

20

ako se dogodi neka druga iznimka?nećemo saznati jer smo

preoptimistično pretpostavili dozvoljen pristup

bool accessGranted = false;try

{new FileStream(@”c:\t.txt”, FileMode.Open, FileAccess.Read).Close();//ako smo još uvijek tu, smijemo!accessGranted = true;}

catch (...)

...

Page 21: Deset zapovijedi za sigurno kodiranje (2003)

21

9. Impersonation princip je lomljiv

serverske aplikacije thread i process token

impersonation: thread koji poslužuje radi u drugom security kontekstu, obično klijentovom akcije u ime klijenta

napadač može probati pomoću buffer overflowa steći prava web server procesa

Page 22: Deset zapovijedi za sigurno kodiranje (2003)

22

ISAPI ekstenzija unutar web server procesa:thread token: IUSR_MACHINE, većina

zahtjeva koji dolaze neautenticirananapadač preko buffer overflowa ulazi

u sustav, poziva ReverToSelf da makne impersonation token i stekne prava procesa (SYSTEM)

može i pozvati CreateProcess koji kopira token procesa (SYSTEM), ne threada (user)

Page 23: Deset zapovijedi za sigurno kodiranje (2003)

23

COM threading: in-process COM server pretpostavimo da threading model

pozivateljskog threada i servera nije isti ne prosljeđuje se impersonation token

pozivateljskog threada poziv se izvršava u kontekstu procesa, ne

pozivateljskog threada

zaštita: isključiti buffer overflow mogućnosti pripaziti kod konfiguriranja prava i izolacije

aplikacija

Page 24: Deset zapovijedi za sigurno kodiranje (2003)

24

10. Kreiraj aplikacije koje i ne-administratori mogu

koristitine pretpostaviti da će korisnik imati administratorske ovlastiprovjeriti aplikaciju kao ne-adminzanimljiv prijedlog:ne treba biti admin za pisanje koda i

kompajliranjekoristiti RunAs za pokretanje

aplikacija kao admin

Page 25: Deset zapovijedi za sigurno kodiranje (2003)

25

Pročitati “Writing Secure Code”

Kad bude vremena...