You are on page 1of 33

PB071 Programovn v jazyce C

Bezpen programovn, nvaznosti, diskuze...

vod do C, 10.12.2013

PB071

Organizan
Tento tden posledn pednka i cvien Zpotov pklad
na vaem cvien, obdobn jako pi ncviku kad cvien bude mt jin pklad je nutn spn vypracovat (nen bodovno) bude vypsn opravn termn (leden)

Zkouka
vypsno v ISu, u pota v B130 (Linux) (+ B116&B117 Windows) muste znt sv heslo na Aisu! nutno mt zapsn v poznmkovm bloku zpoet (uhnjte svho cvicho) 50 minut

Npl zkoukovho testu


30 bod otzky z prbnch testk (drill) 30 bod porozumn stvajcmu kdu (co vype program...) 20 bod vlastn kd (funkce, dyn. alokace, prce s etzci)

vod do C, 10.12.2013

PB071

Bezpenostn dopady prce s pamt a nedostatenho oeten vstupu

vod do C, 10.12.2013

PB071

Demo buffer overflow u fixnho pole

vod do C, 10.12.2013

PB071

Pedpoklady
MS Visual Studio 2010 (MSVC kompiltor)
dostupn z fakultn MSAA

V kdu alternativn nastaven pro gcc


v ukzkch nepouito jin rozloen promnnch v pamti ne u MSVC

Debug reim

vod do C, 10.12.2013

PB071

void demoBufferOverflowData() { int unused_variable = 30; #define NORMAL_US R !n! #define ADM"N_US R !a! int userRi#$ts = NORMAL_US R; #define US R_"N%U&_MA'_L N(&) * char userName[US R_"N%U&_MA'_L N(&)]; char +asswd[US R_"N%U&_MA'_L N(&)]; // print some info about variables +rintf(,-./0s0 -+1n,, ,userName,, userName); +rintf(,-./0s0 -+1n,, ,+asswd,, +asswd); +rintf(,-./0s0 -+1n,, ,unused_variable,, &unused_variable); +rintf(,-./0s0 -+1n,, ,userRi#$ts,, &userRi#$ts); +rintf(,1n,); // Get user name +rintf(,lo#in as0 ,); #ets(userName); // Get password +rintf(,-s2vulnerable3ma4$ine34om0 ,, userName); #ets(+asswd);

promnn udvajc prva aktuln pihlenho uivatele pole s fixn dlkou (bude dochzet k zpisu za konec) pomocn vpis adres loklnch promnnch na zsobnku naten uivatelskho jmna a hesla (bez kontroly dlky)

// Check user rights (set to NORMA !"#$R and not changed in code% if (userRi#$ts == NORMAL_US R) { +rintf(,1n5el4ome6 normal user !-s!6 7our ri#$ts are limited31n1n,, userName); } if (userRi#$ts == ADM"N_US R) { vpis info uivatele dle +rintf(,1n5el4ome6 all mi#$t7 admin user !-s!81n,, userName); promnn s prvem } }

vod do C, 10.12.2013

PB071

Rozloen dat v pamti

userName passwd userRights

unused_variable

vod do C, 10.12.2013

PB071

Sputn bez problm

userName passwd
vod do C, 10.12.2013

PB071

Sputn tonkem userName


zadno evil do userName

vod do C, 10.12.2013

PB071

Sputn tonkem - passwd


zadno 1234567812345678Devil I am. Ha Ha do passwd

Pli dlouh heslo pepsalo v pamti userName i userRights


vod do C, 10.12.2013

PB071

Sputn tonkem - vsledek

vod do C, 10.12.2013

PB071

Jak me chrnit programtor?


Dsledn kontrola dlky natanch dat Preventivn mazn natanho pole
nebo preventivn nastaven poslednho bajtu na 0

Jazyk C nem pli pohodln nstroje pro naten vstupu s variabiln dlkou
musme zjistit dopedu dlku vstupu a alokovat (malloc) dostaten pole nebo eit situaci, kdy se natan vstup nevleze do fixnho pole (nap. fgets())

Nelze spolhat na bezpen uspodn dat v pamti


rzn kompiltory umst promnn rzn

vod do C, 10.12.2013

PB071

Jak me chrnit peklada?


Peklada me obalit citliv objekty v pamti dodatenou ochrannou
dodaten pamov prostor kolem pol se speciln hodnotou (nap. 0xcc) monost nsledn detekce pepisu nhodn hodnota (canary word) ped nvratovou adresou z funkce kontrolovan ped nsledovn adresy randomizace pamti (ASLR) ochrana datov sekce programu ped vykonnm (DEP)

Dostupn pepnae pekladae


MSVC: /RTC1,/DYNAMICBASE,/GS,/NXCOMPAT GCC: -fstack-protector-all

vod do C, 10.12.2013

PB071

Jak me chrnit dodaten analza?


Statick analza
probh nad zdrojovm kdem bez jeho sputn Nap. Cppcheck, Microsoft PREfast...

Dynamick analza
probh nad sputnou binarkou programu nap. Valgrind (nejen memory leaks)

Vrazn, automatizovan pomoc


pozor, nedetekuje vechny chyby!

vod do C, 10.12.2013

PB071

Microsoft PREfast
Microsoft Visual Studio 2012/3 Ultimate
pro studenty dostupn v rmci MSAA

Visual Studio Analyze Run code analysis...

vod do C, 10.12.2013

PB071

Demo kontrola vstupu pro system()

vod do C, 10.12.2013

PB071

Pedpoklady
Nezvisl na pekladai Funkce demoInsecureSystemCall()
vype ze souboru informace o pouit nedovol pout pkaz type a dir

Jak me tonk vypsat obsah adrese?

vod do C, 10.12.2013

PB071

Nedostaten oeten zakzanho vstupu


void demo"nse4ureS7stem9all(const char* 4ommand) { :"L * file = NULL; +rintf(,1n1n;USA( "N:O<0 ,); if ((file = fo+en(,usa#e_$el+3t=t,, ,r,)) != NULL) { char 4; while ((4 = #et4(file)) != O:) +ut4(4, stdout); f4lose(file); } +rintf(,1n1n,); // &rinting file content is not allowed if (strn4m+(4ommand, ,t7+e,, strlen(,t7+e,)) == 0) { +rintf(,;"N:O< &7+e 4ommand is not allowed81n,); return; } // isting of director' is not allowed if (strn4m+(4ommand, ,dir,, strlen(,dir,)) == 0) { +rintf(,;"N:O< Dir 4ommand is not allowed81n,); return; } // other!comands ma' not be allowed as well(((((

pkaz na sputn vpis npovdy

zkaz type

zkaz dir

// )e tested for all unwanted commands* input should be safe now* e+ecute it +rintf(,;"N:O< Runnin# 4ommand !-s!1n,, 4ommand); s7stem(4ommand); } vod do C, 10.12.2013

sputn pkazu
PB071

Jak me tonk vypsat adres?


Vloen blch znak
pi vyhodnocovn system() jsou pozdji ignorovny

Rzn velikost znak (system() ignoruje) Speciln znaky (tab...) etzen nkolik pkaz ...
demo"nse4ureS7stem9all(,dir,); // ,irector' listing is not allowed demo"nse4ureS7stem9all(, dir,); // Ma'be* we can get around with spaces demo"nse4ureS7stem9all(,DiR,); // ((( or different character case demo"nse4ureS7stem9all(,10>>dir,); // ((( or special character(s% (-.// is tab% // ((( or se0uence of commands demo"nse4ureS7stem9all(,e4$o ?ou 4an!t sto+ me @ dir,); // ((( do or C, (((10.12.2013 PB071 vod

Jak me tonk vypsat adres a soubor?


Pedpoklad: vstup voln system() nen vypisovn tonkovi
i sputn system(dir) nepome

Lze vyut nkolik nslednch voln


demo"nse4ureS7stem9all(,e4$o ?ou 4an!t sto+ me @ dir A usa#e_$el+3t=t,); demo"nse4ureS7stem9all(,e4$o )a4Bed,);

Lze nepedpokldan vyut stvajc funknosti


nap. zpis vstupnch dat do souboru s npovdou
demo"nse4ureS7stem9all(,t7+e to+_se4ret3t=t,); demo"nse4ureS7stem9all(,1=/01=/01=/01=/01=/0t7+e to+_se4ret3t=t,); demo"nse4ureS7stem9all(,note+ad3e=e to+_se4ret3t=t,);
vod do C, 10.12.2013

PB071

Demo chybn prce s etzci

vod do C, 10.12.2013

PB071

Textov etzce
etzec v C mus bt ukonen nulou \0 Pokud nen, velk mnostv funkc nefunguje
pokrauj dokud nen v pamti nula (za koncem pole)

Funkce pro prci s etzci


sprintf, fprintf, snprintf, strcpy, strcat, strlen, strstr, strchr, read...

Funkce pro prci s pamt


memcpy, memmove (pokud je dlka na koprovn zjitna strlen(string))

http://www.awarenetwork.org/etc/alpha/?x=5
vod do C, 10.12.2013

PB071

Kontrola hesla
void demoAdjacentMemoryOverflow(char* userName, char* password) { char message[100]; char realPassword[] = "very secret password nbu123"; char buf[8]; memset(buf, 0, sizeof(buf)); memset(message, 0, sizeof(message)); // We will copy only characters which fits into buf strncpy(buf,userName,sizeof(buf)); kopie do loklnho pole Problm? // Print username to standard output-nothing sensitive, right? sprintf(message, "Checking '%s' password\n", buf); printf("%s", message); if (strcmp(password, realPassword) == 0) { printf("Correct password.\n"); } vpis veejn informace else { dky chybjc koncov nule i printf("Wrong password.\n"); dal pamti s heslem } }vod do C, 10.12.2013
PB071

oekvan heslo

Zjitn oekvanho hesla


tok je asto kombinace nkolika operac
nedostaten dlka pamti chybjc oeten koncov nuly funkce pedpokldajc ptomnost koncov nuly
demoAdCa4entMemor7Overflow(,admin,, ," don!t Bnow t$e +assword,); demoAdCa4entMemor7Overflow(,admin====,, ," still don!t Bnow t$e +assword,); demoAdCa4entMemor7Overflow(,admin,, ,ver7 se4ret +assword nbu>/3,);

vod do C, 10.12.2013

PB071

zatek realPassword

vloen userName bez koncov nuly

prvn koncov nula pro etzec buf

vod do C, 10.12.2013

PB071

Shrnut
1. Bute si vdomi monch problm a tok
S velkou pravdpodobnost budete vytvet aplikace v sovm prosted Pit pkn, nevytvejte snadno napadnuteln kd Nstroje pro automatickou kontrolu za vs vechny problmy nevye

2.

Pouvejte bezpen verze zranitelnch funkc


Secure C library (xxx_s funkce s pponou _s, soust standardu C11) datov kontejnery, pole a etzce s automatickou zmnou velikosti (C++)

3.

Kompilujte se vemi dostupnmi ochrannmi pepnai pekladae


MSVC: /RTC1,/DYNAMICBASE,/GS,/NXCOMPAT GCC: -fstack-protector-all

4. 5.

Pouvejte automatick nstroje pro kontrolu kdu


statick a dynamick analza, fuzzing, skenery zranitelnost

Vyuvejte ochranny nabzen modernmi operanmi systmy


DEP, ASRL...

26 vod do C, 10.12.2013

PB071

Tutorily
Buffer Overflow Exploitation Megaprimer (Linux)
http://www.securitytube.net/groups?operation=view&groupId=4

Tenouk Buffer Overflow tutorial (Linux)


http://www.tenouk.com/Bufferoverflowc/bufferoverflowvulexploitde mo.html

Format string vulnerabilities primer (Linux)


http://www.securitytube.net/groups?operation=view&groupId=3

Buffer overflow in Easy RM to MP3 utility (Windows)


https://www.corelan.be/index.php/2009/07/19/exploit-writingtutorial-part-1-stack-based-overflows/

27 | vod do C, 10.12.2013

PB071

Co dl po PB071?

vod do C, 10.12.2013

PB071

Mon nvaznosti PB071


Programovn v jazyce C++ (PB161)
principy objektov orientovanho programovn zklady jazyka C++ (STL, ablony...)

Programovn v jazyce Java (PB162) vod do vvoje v C#/.NET (PV178) Tmatick vvoj aplikac v C/C++ (PB173)
zamen na een praktickch programtorskch problm v oblasti vaeho zjmu tmatick skupiny: Zpracovn obrazu, Systmov programovn Linux a Windows, Ovladae jdra Linux, Aplikovan kryptografie a bezpenost... lze zapisovat opakovan (rzn seminrn skupiny)

Seznam programovacch pedmt na FI


http://www.cecko.eu/public/code@fimu
vod do C, 10.12.2013

PB071

Mon nvaznosti PB071 (pokraovn)


Programovn se nenaute na cviench ve kole Najdte si zajmav open source projekt
zkuste v nm odstranit reportovanou chybu zkuste implementovat njakou TODO funknost

Vyberte si zajmavou laborato na kole


sta chu se uit novm vcem

Programtoi jsou (jet pod) slun placen


zvate pi vbru brigdy

Nebojte se jinch jazyk


schopnost programovat je platformov nezvisl
vod do C, 10.12.2013

PB071

Diskuze

vod do C, 10.12.2013

PB071

Debata
1. 2. 3. 4. 5. 6. 7. 8. 9. rove slid, hloubka zbru? Tmata chybjc na pednkch? Co je pro vs nejvt pnos ze cvien? Co vm chyb na cviench? Nronost domcch kol? Zpsob bodovn domcch kol? Pnos odevzdn naneisto? Pnos krtkch testk ped cvienm? Cokoli dalho? Pit prosm do ankety + i PB071

vod do C, 10.12.2013

vod do C, 10.12.2013

PB071

You might also like