Sunteți pe pagina 1din 14

Seguridad

Parte 1: como proteger contra ataques desde el interior (clase pasada) Parte 2: Proteccin general de recursos

Ataques desde el interior


Como protegerse de esto?: int main() { int cookie; char buf[80]; gets(buf); if (cookie == 0x41424344) printf("Gansaste!\n"); }

Ataques desde el interior


gets es inseguro! Alternativa: fgets(buffer, sizeof(buffer), stdin);


int main() { int cookie; char buf[80]; fgets(buf, sizeof(buf), stdin); if (cookie == 0x41424344) printf("Gansaste!\n"); }

Ataques desde el interior

Qu otras funciones son inseguras?


scanf(%s, buf); strlen(buf); strcpy(dest, src);


Usar strncpy(dest, src, len), pero cuidado con len! char dest[50]; strncpy(dest, src, strlen(src)); INCORRECTO! Correccin: char dest[50]; strncpy(dest, src, sizeof(dest)); dest[sizeof(dest)-1] = 0; string al final esto es

si queremos un

Ataques desde el interior


int main(int argc, char * argv[]){ int cookie = 0x12345678; char buffer[40]; strncpy(buffer,argv[1],sizeof(buffer)); buffer[sizeof(buffer)-1]=0; if (cookie == 0x41424344) printf ("Ganaste!\n\a"); return 0; }

Ataques desde el interior

Como prevenir inyeccion de comandos?


int main(int argc, char **argv) { char buffer[64] = "date "; printf ("Bienvenido a Megaserver!\n\r"); printf ("La hora y fecha actual es: "); system("date"); printf ("Por favor ingrese la nueva: "); gets(buffer+strlen(buffer));

system(buffer);

return 0; }

Ataques desde el interior

Filtrar caracteres peligrosos

; , , No usar system() Ejecutar directamente el programa Pueden aun haber inyeccion de comandos?

Evitar llamar al shell!


Ataques desde el interior

Como prevenir integer overflows? #include<stdio.h> int main(int argc, char * argv[]){ unsigned int cookie = 0x12345678; unsigned int parameter = atoi(argv[1]); if (cookie > cookie+parameter) printf ("NAAAAAAAAAAH!\n\a"); return 0; }

Ataques desde el interior


#include<stdio.h> #include<limits.h> int main(int argc, char * argv[]){ unsigned int cookie = 0x12345678; unsigned int parameter = atoi(argv[1]); assert(cookie+parameter<UINT_MAX); if (cookie > cookie+parameter) printf ("NAAAAAAAAAAH!\n\a"); return 0; } // Funciona?

Ataques desde el interior


#include<stdio.h> #include<limits.h> int main(int argc, char * argv[]){ unsigned int cookie = 0x12345678; unsigned int parameter = atoi(argv[1]); assert(cookie<UINT_MAX-parameter); // AHORA? if (cookie > cookie+parameter) printf ("NAAAAAAAAAAH!\n\a"); return 0; }

Ataques desde el interior


#include<stdio.h> int main(int argc, char * argv[]){ unsigned int cookie = 0x12345678; unsigned int parameter = atoi(argv[1]); assert(cookie+parameter>cookie); // AHORA ? if (cookie > cookie+parameter) printf ("NAAAAAAAAAAH!\n\a"); return 0; }

Ataques desde el interior

Como prevenir ataques de format strings?

Los ataques ocurren cuando se hace printf(buf) Alternativas:


Chequear dinamicamente buf (dificil!) O nunca llamar de esa forma!

printf(fmt, params)

Ejercicio de parcial

Considere el siguiente programa:


void fun(char *str){ char ss[2000]; strcpy(ss,"echo \""); strncat(ss,str,1990); strcat(ss,"\""); system(ss); } Es este codigo vulnerable a inyeccion de codigo? Si no es el caso, justifique. Si es el caso: Proponga un valor para la entrada {\it str} de tal manera que se ejecute un comando ``pwd". Modifique el programa para evitar dicha vulnerabilidad.

Ejercicio de parcial

Verdadero o Falso? Justifique. Este codigo es vulnerable a:


Cadena de Formato Desbordamiento de entero Desbordamiento de pila. Retorno a libc

S-ar putea să vă placă și