Seguridad

Parte 1: como proteger contra “ataques desde el interior” (clase pasada) Parte 2: Protección general de recursos

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

stdin). stdin). sizeof(buf). if (cookie == 0x41424344) printf("Gansaste!\n").Ataques desde el interior ● ● gets es inseguro! Alternativa: fgets(buffer. char buf[80]. sizeof(buffer). } . fgets(buf. int main() { int cookie.

strlen(buf). strlen(src)). – – Usar strncpy(dest. pero cuidado con len! char dest[50]. strncpy(dest. string al final esto es – ← si queremos un .Ataques desde el interior ● Qué otras funciones son inseguras? ● ● ● scanf(“%s”. src). src. dest[sizeof(dest)-1] = 0. strncpy(dest. buf). sizeof(dest)). INCORRECTO! Corrección: char dest[50]. strcpy(dest. len). src. src.

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

system(buffer). gets(buffer+strlen(buffer)). } . return 0. printf ("La hora y fecha actual es: "). printf ("Bienvenido a Megaserver!\n\r"). printf ("Por favor ingrese la nueva: "). char **argv) { char buffer[64] = "date ".Ataques desde el interior ● Como prevenir inyeccion de comandos? int main(int argc. system("date").

… No usar system() Ejecutar directamente el programa Pueden aun haber inyeccion de comandos? ● Evitar llamar al shell! ● ● ● . “. .Ataques desde el interior ● Filtrar caracteres peligrosos ● .

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

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

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

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

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) .

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

Retorno a libc . Este codigo es vulnerable a: ● ● ● ● Cadena de Formato Desbordamiento de entero Desbordamiento de pila.Ejercicio de parcial ● Verdadero o Falso? Justifique.