deset zapovijedi za sigurno kodiranje (2003)
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
Deset zapovijediza sigurno kodiranje
Vatroslav Mihalj
svibanj 2003.
2
M. Howard, K. Brown: “Defend Your Code with Top 10 Security Tips Every Developer Must Know”MSDN Magazine, September 2002.
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!
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
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
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
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));}
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...
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)
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);...
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
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);
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 )
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
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
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
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
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
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{...}
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 (...)
...
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
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)
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
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
25
Pročitati “Writing Secure Code”
Kad bude vremena...