biztonsági szempontból veszélyes programozói hibák

32
Biztonsági szempontból veszélyes programozói hibák ITEM pályázata támogatásával BME Informatikai Központ Idealab project Árendás Csaba, M.Sc.

Upload: alima

Post on 09-Jan-2016

23 views

Category:

Documents


0 download

DESCRIPTION

Biztonsági szempontból veszélyes programozói hibák. ITEM pályázata támogatásával BME Informatikai Központ Idealab project. Árendás Csaba, M.Sc. Miről is lesz szó?. A biztonság jelenlegi helyzete az Interneten Támadási lehetőségek, fenyegettségek - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Biztonsági szempontból veszélyes programozói hibák

Biztonsági szempontból veszélyes programozói hibák

ITEM pályázata támogatásávalBME Informatikai Központ Idealab project

Árendás Csaba, M.Sc.

Page 2: Biztonsági szempontból veszélyes programozói hibák

Miről is lesz szó?

• A biztonság jelenlegi helyzete az Interneten• Támadási lehetőségek, fenyegettségek• Biztonsági szempontból veszélyes programozói

hibák• Egyes biztonsági hibák ismertetése• Demo• Védekezési lehetőségek osztályozása• Konklúzió

Page 3: Biztonsági szempontból veszélyes programozói hibák

A biztonság jelenlegi helyzete az Interneten

Page 4: Biztonsági szempontból veszélyes programozói hibák

Támadási eszköztár

• Lehallgatás• Titkosítás megfejtése• Protokoll tervezési hiba kihasználása• Véletlenszám-generátor megtörése• Jelszótörés• Social engineering• Speciális programozói hibák, lyukak

kihasználása (hacker-ek legpreferáltabb játéka)• Stb.

Page 5: Biztonsági szempontból veszélyes programozói hibák

Biztonsági szempontból veszélyes programozói hibák• Veremtúlcsordulás (stack overflow)• Halom túlcsordulás (heap overflow)• Méretbeli egész túlcsordulás (widthness integer

overflow)• Aritmetikai túlcsordulás (arithmetical overflow)• Előjeles hiba (signedness bug)• Formázó karakter sebezhetőség (Format string

vulnerability)• Tömbindexelési hiba (array indexing error)• Karakterméret hiba (unicode bug)

Page 6: Biztonsági szempontból veszélyes programozói hibák

Program memóriatérképe

Page 7: Biztonsági szempontból veszélyes programozói hibák

Buffer overflow - Public Enemy #1

void hibas_fuggveny(char* input)

{

a=1;

b=2;

c=3;

char buffer[12];

strcpy(buffer,input);

printf("%s",buffer);

}

Page 8: Biztonsági szempontból veszélyes programozói hibák

Buffer overflow hiba kihasználása

Page 9: Biztonsági szempontból veszélyes programozói hibák

A hiba kihasználása…

"\x31\xc0\x31\xdb\x31\xd2\x53\x68\x20\x44\x53\x52"

"\x68\x66\x72\x6f\x6d\x68\x62\x6f\x62\x20\x89\xe1"

"\xb2\x0f\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80"

A jobbik eset:„Itt járt Bob!!!”Rosszabb:

rm –R /*

Page 10: Biztonsági szempontból veszélyes programozói hibák

Milyen módon használhat ki a támadó ilyen jellegű hibát?

• Exploit írása (támadó program)

• Vírus írása

Page 11: Biztonsági szempontból veszélyes programozói hibák

A végeredmény…

2003. január 5.(szombat) 05:29:00MS-SQL worm-mel fertőzött gépek száma: 0

2003. január 5.(szombat) 06:00:00MS-SQL worm-mel fertőzött gépek száma: 200 000

Page 12: Biztonsági szempontból veszélyes programozói hibák

Egy támadás tipikus lépései

• Könnyű célpont keresése

• Célpont feltérképezése

• Behatolás

• Nyomok eltüntetése, álcázás (root-kit telepítése)

• Innentől szabad a pálya…

• Több feltört gép, több lehetőség…

Page 13: Biztonsági szempontból veszélyes programozói hibák

Méretbeli túlcsordulás

int main(int argc, char *argv[]){int i = atoi(argv[1]);unsigned short s = i;char buf[80];if(s >= 80) {

return -1;}printf("s = %d\n", s);memcpy(buf, argv[2], i);buf[i] = '\0';printf("%s\n", buf);return 0;

}

Page 14: Biztonsági szempontból veszélyes programozói hibák

Méretbeli túlcsordulás

• Widthness integer overflow occurs if a stored integer value is copied to a smaller value. In this case truncation is necessary which could lead to data loss. If a length condition checking is based on the new value, but the data copying function uses the original value, under special circumstances (if the original data is big enough) an overflow could be caused.

Page 15: Biztonsági szempontból veszélyes programozói hibák

Méretbeli túlcsordulás

DATA (65540 byte)►

BUFFER (4 Byte)

copy function

LENGTH (32 bit) = 65544

10100000 0000 0000 0001 0000 0000 0000 0100 1010 1010 1010 1010 1010 1010 1010

LENGTH (16 bit) = 4

0000 0000 0000 01000001

DATA (65540 byte) ►►►OVERFLOW►►►►►

1010

legth condition checking PASSED

Page 16: Biztonsági szempontból veszélyes programozói hibák

Aritmetikai túlcsordulás

int catvars(char *buf1, char *buf2, unsigned int len1, unsigned int len2){

char mybuf[256];if((len1 + len2) > 256) {

return -1;}memcpy(mybuf, buf1, len1);memcpy(mybuf + len1, buf2, len2);do_some_stuff(mybuf);return 0;

}

Page 17: Biztonsági szempontból veszélyes programozói hibák

Aritmetikai túlcsordulás

• In this case the problem originates in the overflow of an arithmetic operation, where without the extra bits of the overflow valid, but erroneous results will be taken into consideration. Similar problems could arise also from multiplication, not just addition.

Page 18: Biztonsági szempontból veszélyes programozói hibák

Aritmetikai túlcsordulás

Buffer2Buffer1 LENGTH 2 (32bit) = 0xfffffffc

BUFFER (256 Byte)

length condition checking passed

LENGTH 1 (32 bit) = 0x104

11110000

SUM (33 bit) = 4294976552

0000 0000 0000

1 DATA (0xfffffffc byte) ►►OVERFLOW►►

Arithmetical calculation legth1+length2

0000 0000 0000 0000 0010 0000 0100 1100 DATA►► DATA►►1111 1111 1111 1111 1111 1111

0000 0000 0000 0000 0000 0001 0000 0000

SUM (32 bit) = 256

0000 0000 0000 0000 0000

Copy function

Page 19: Biztonsági szempontból veszélyes programozói hibák

Előjeles hiba

int copy_something(char *buf, int len){

char kbuf[800];if(len > sizeof(kbuf)) {

return -1;}return memcpy(kbuf, buf, len);

}

Page 20: Biztonsági szempontból veszélyes programozói hibák

Előjeles hiba

• Signedness bug is almost the same as the pervious bug, although in this case the difference between signed and unsigned integer values is also important, where signed integers are stored in two’s complement. The source of the problem is that we can interpret a signed number as an unsigned one as well, which means a huge number, since in two’s complement negative numbers start with bit ‘1’.

Page 21: Biztonsági szempontból veszélyes programozói hibák

Előjeles hiba

Buffer

kbuffer (800 Byte) length condition checking passed (-1<kbuf size(800))

LENGTH (32 bit), signed integer, stored in two’s complement = 0xffffffff = -1 (DEC)

1111

DATA (0xffffffff byte) ►►OVERFLOW►►

DATA►►

memcpy function

1111 1111 1111 1111 1111 1111 1111

LENGTH (32 bit), interpreted as unsigned integer (but stored in two’s complement)

0xffffffff = 4 294 967 295 (DEC)

1111 1111 1111 1111 1111 1111 1111 1111

Page 22: Biztonsági szempontból veszélyes programozói hibák

Konklúzió, védekezési lehetőségek

• A legveszélyesebb hibacsalád

• Tudni kell róla, gondolni kell rá

• Védekezni lehet és kell ellene!!!

• Számos védelmi megoldás elérhető

Page 23: Biztonsági szempontból veszélyes programozói hibák

Védekezési lehetőségek

Page 24: Biztonsági szempontból veszélyes programozói hibák

Veszélyes függvények

• Strcpy(char *dest, const char *str)

• Strcat(char *dest, const char *src)

• Getwd(char *buf)

• Gets(char *s)

• Scanf(const char *format,…)

• Realpath(char *path,char resolved_path[])

• Sprintf(char *str, const char *format,…)

Page 25: Biztonsági szempontból veszélyes programozói hibák

Program memóriatérképe

Page 26: Biztonsági szempontból veszélyes programozói hibák

Kernel stack randomization

Page 27: Biztonsági szempontból veszélyes programozói hibák

Strcpy implementációja

Char *strcpy(char * dest,const char *src){char *tmp=dest;while ((*dest++=*src++)!=’0’)/*nothing*/return tmp;}

Page 28: Biztonsági szempontból veszélyes programozói hibák

Safelib javított változat

• Char *strcpy(char *dest,const char *src)• {• ...• if ((len=strlen(src,max_size))==max_size)• _libsafe_die(„Overflow caused by

strcpy()”);• real_memcpy(dest,src,len+1);• return dest;• }

Page 29: Biztonsági szempontból veszélyes programozói hibák

Forráskód elemző: Flowfinder

• test.c:49: [4] (buffer) _mbscpy: Does not check for buffer overflows when copying to destination. Consider using a function version that stops copying at the end of the buffer.

• _mbscpy(d,s); /* like strcpy, this doesn't check for buffer overflow */ • test.c:52: [4] (buffer) lstrcat: Does not check for buffer overflows

when concatenating to destination. • lstrcat(d,s); • test.c:45: [2] (buffer) char: Statically-sized arrays can be overflowed.

Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length.

• char d[20];

Page 30: Biztonsági szempontból veszélyes programozói hibák

Problémák a biztonsági hibákkal

• Nincs törvényi kényszerítő erő az eliminálásukra• Hatalmas komplexitás, biztos komponensek

nélkül (ellentétben például az építészettel)• A nagy szoftverfejlesztő cégek nem érdekeltek a

biztonságos termékek elkészítésében• Paradoxonos helyzet az egy termék, millió

hacker felállással, eleve hátrányos helyzet• A szoftverfejlesztés célja általában a specifikáció

szerinti funkcionális működés elérése, minden más másodlagos

Page 31: Biztonsági szempontból veszélyes programozói hibák

Mi jöhet (jön) még

• Biztonsági hibák voltak, vannak és lesznek• Bármely területen megjelenhet a rossz célú

kihasználásuk, ha az eladott eszközök száma eléri a kritikus tömeget

• A jelenlegi megelőzési tendencia nem túl dicséretes, de valamivel jobb, mint korábban

• A jelenlegi eszközök célzott, átgondolt alkalmazásával, a hibák nagy része nem kerülhetne kihasználásra

• Elrettentés: mobil vírusok (lásd Japán, precedens jelleggel)

• Katonai alkalmazás

Page 32: Biztonsági szempontból veszélyes programozói hibák

Köszönöm a figyelmet!