viXard | estamos ogullosos de presentar al sr. David Larochelle |
viXard | graduado de la universidad de virginia en ciencias de computacion |
viXard | los slides estan en http://www.cs.virginia.edu/~drl7x/umeet/umeet.htm |
viXard | el titulo es "deteccion estatica para vulnerabilidades por overflow |
viXard | comenzamos |
viXard | Gracias |
viXard | las preguntas de hacen en #qc |
viXard | Hola, esta charla esta basada en una presentacion de este año en usenix security |
viXard | si quieren mas detales de la misma : lclint.cs.virginia.edu |
viXard | hace 13 años, muchas computadoras fueron saturadas hasta el punto de no poder usarse |
viXard | el causante fu el gusando Morris |
viXard | explotando el daemon del finger |
viXard | para este momento un overflow en el buffer no era algo bien comprendido |
viXard | asi que esto causaba que fuera muy vulnerable |
viXard | hoy en dia el overflow del buffer es un problema aun |
viXard | los overflows de buffer del IIS siguen siendo explotadios por el Red Code |
viXard | esto sigue siendo la causa de una gran cantidad de vulnerabilidades en internet |
viXard | si accesan los slides, podran ver el wall street journal reciente como testimonio del peligro del overflow del buffer |
viXard | el sitio fue hacekado dos veces este año |
viXard | parte del problema es la educacion |
viXard | los programadores aun no conocen el preligro de esta vulnerabilidad |
viXard | por esta razon, aun los programadores de seguridad, cometen errores |
viXard | para ilustrar esto, mostrare un ejemplo mas tarde |
viXard | ya que los prograadores siempre cometen errores, necesitamos herramientas automatizadas |
viXard | dos posibles aproximanciones para ellos, son run-time y tiempo de compilacion |
viXard | la primera |
viXard | trabaja creando ejecutables que chekan los overflows |
viXard | detectan el error, lo examinan |
viXard | sin ejecutarlos |
viXard | el problema es solucionado en el codigo fuente |
viXard | el proximo slide |
viXard | queremos crear una herramienta que usarian los programadores para detectar los errores en sus codigos |
viXard | slide 7 |
viXard | Nosotros implementamos nuestra herramienta extendiendo LCLint, una herramienta estatica de codigo abierto |
viXard | Usando anotaciones, LCLint es capaz de de detectar |
viXard | un lint estandar. |
viXard | integramos nuestra herramienta de chequeo con LCLint, lo cual permitio mejorar nuestra capacidad de deteccion de fallos |
viXard | slide 8 |
viXard | Dos anotaciones añadodas son MaxSet, el cual denota el indice maximo en una cadena |
viXard | que puede ser escrita libre de errores |
viXard | y MaxRead, la cual denota el maximo indice en una cadena que puede ser leida sin errores |
viXard | Slide 9 |
viXard | Esto proviene de una guia de programacion de SecurityFocus.com |
viXard | En la guia ellos sugieren que los programadores usen strncat en vez de strcat |
viXard | y proveen esto como un ejemplo de como usar strncat. |
viXard | El codigo fue basico |
viXard | <drl7x> char buffer[256] |
viXard | <drl7x> strncat (buffer, str, sizeof(str) -1 ) |
viXard | donde str es una funcion parametro |
viXard | Aqui hay dos problemas |
viXard | primero: el buffer es inutilizable |
viXard | adicionalmente, el usuario ha confundido el requemiento de strncat. |
viXard | proximo slide |
viXard | como se puede ver en el slide |
viXard | se muestra un ejemplo de la alerta reportada por lclint |
viXard | slide 11 |
viXard | Nuestro chequeo toma lugar completamente dentro de las funciones |
viXard | the rule maxRead(str + i) = maxRead(str) - i |
viXard | un ejemplo |
viXard | esto ayuda a manejar el codigo en el que un puntero ha sido incrementado |
viXard | finalmente, producimos mensajes de error |
viXard | slide 12 |
viXard | mas splits |
viXard | Encontramos que tantos "loops" (repeticiones) |
viXard | tienen formas comunes |
viXard | por ejemplo, en el eloop: |
viXard | for (init; *buf; buff++) |
viXard | asumimos que el loop ejecuta maxRead(buf) |
viXard | interacciones, y modelamos las primeras y ultimas interaciones |
viXard | del loop |
viXard | slide 13 |
ToniSB | Para probar nuestra herramienta la usamos para analizar dos programas de seguridad critica del codigo abierto. |
ToniSB | En los dos casos detectamos bugs conocidos... |
ToniSB | Adicionalmente, fuimos capazes de descubrir overflows de buffer desconocidos |
ToniSB | Nuestra herramienta se ejecuto suficientemente rapida, asi que creemos que es razonable que los usuarios la pongan en sus Makefiles como parte del proceso de compilado... |
ToniSB | (Tardo unos 7 segundos en analizar el wu-ftpd) |
ToniSB | y 33 segundos para analizar el BIND |
ToniSB | el wu-ftpd tiene 20000 lineas de codigo... |
ToniSB | y el bind 40,000 |
ToniSB | La tabla en la diapositiva(slide) 14 tiene un buen sumario de los resultados |
ToniSB | Recientemente hemos analizado otra vez el wu-ftpd |
ToniSB | Sin comentarios la herramienta producio 166 warnings de escrituras fuera-de-indice(out-of-bounds) |
ToniSB | Despues de iterativamente ir añadiendo comentarios y volviendo a ejecutar la herramienta |
ToniSB | lclint producio 101 warnings de buffer overflows |
ToniSB | Esto esto es un ejemplo de un bug en el wu-ftpd que detectamos. |
ToniSB | int access_ok( int msgcode) { |
ToniSB | char class[1024], msgfile[200]; |
ToniSB | int limit; |
ToniSB | limit = acl_getlimit(class, msgfile); |
ToniSB | Aqui la funcion getaclentry setea entry->arg[3] a apuntar a una cadena de lectura potencialmente arbitraria desde un archivo de configuracion |
ToniSB | El str lo copia en msgpathbuf |
ToniSB | strcpy(msgpathbuf, entry->arg[3]; |
ToniSB | Cuando ejecutamos lclint para informar: |
ToniSB | un buffer overflow potencial |
ToniSB | Añadiendo comentarios y cambios en strncy para determinar que la funcion |
ToniSB | LCLint es capaz de determinar que la funcion es segura |
ToniSB | de todas formas tuvimos que hacer un numero de cambios a la funcion y volver a ejecutar lclint antes de poder asegurarnos de su seguridad |
ToniSB | slide 16 |
ToniSB | Trabajos relacionados |
ToniSB | Tradicionalmente, se ha usado el analisis lexico para buscar vulnerabilidades |
ToniSB | Usando una herramienta como grep un "auditor" podia escanear un programa en busca de funciones de libreria potencialmente inseguras. Herramientas recientes como ITS4 combinan esta aproximacion con una base de datos de funciones potencialmente inseguras. |
ToniSB | El analisis lexico esta limitado a detectar solo vulnerabilidades en llamadas a funciones. Y tiende a producir un elevado numero de positivos falsos |
ToniSB | Wagner ha desarrollado un sistema para detectar vulnerabilidades creando cadenas c com un tipo de datos abstracto que es accedido a traves de funciones de libreria |
ToniSB | el analisis insensible al flujo es usado para resolver "contraints"(¿?¿) |
ToniSB | Esta aproximacion no requiere anotaciones y trabaja bastante bien. |
ToniSB | Pero el analisis insensible al flujo es impreciso y causa un elevado numero de positivos falsos. |
ToniSB | Ademas esta aproximacion no puede detecar overflows de buffer que ocurren como resultado de un acceso directo al buffer. |
ToniSB | Recientemente Dor ha intentado detectar overflows de buffer haciendo una tranduccion source-to-source(codigo-fuente a codigo-fuente) |
ToniSB | Esto crea un programa seguro que contiene variables adicionales y instrucciones assert. |
ToniSB | Overflows de buffer en el programa original se detectan buscando los casos en que los asserts en el programa seguro pueden fallar. |
ToniSB | slide 17 |
ToniSB | Reconocemos que hay ciertos impedimientos al uso masivo de nuestra herramienta. |
ToniSB | La gente es vaga |
ToniSB | y los programadores son mas vagos que la mayoria |
ToniSB | Añadir anotaciones puede ser demasiado trabajo excepto para los fanaticos de la seguridad |
ToniSB | <conclusiones del slide 18> |
viXard | permiso: las preguntas en #qc |
ToniSB | Como serian las cosas de aqui 13 años? |
ToniSB | Seran los overflows de buffer explotados normalmente? |
ToniSB | Entre la comunidad de la seguridad, los overflows de buffer han sido mucho tiempo un problema bien entendido. |
ToniSB | De todas formas, los overflows de buffer han seguido siendo demasiado comunes. |
ToniSB | Si queremos ser en el 2013 mejores que en el 200, nosotros, el comite de seguridad, debemos trabajar para codificar nuestros conocimientos en herramientas que los programadores realas puedan usar como parte d su proceso de desarrollo para que nuestras experiencias lleguen a los desarrolladores reales. |
ToniSB | La creacion de herramientas de chequeo estatico es un camino prometedor para conseguir esto. |
ToniSB | Actualizacion: |
ToniSB | Hay un par de adiciones al LCLint que no estan incluidas en las diapositivas. |
ToniSB | Ahora ofrecemos funcionalidad como la del ITS4 en la que |
ToniSB | cada repeticion de una funcion potencialmente vulnerable como la del gets, es informada |
ToniSB | de todas formas nuestra aproximacion usa un arbol de "parse" completo asi que si gets se usa como una variable o en una cadena literal no se informa de ningun warning. |
ToniSB | Gracias por escuchar esta charla. |
ToniSB | plas plas plas plas ;) |
ToniSB | traduzco las preguntas? |
arnette | si |
arnette | Que no las entiendo der too ;OP |
hecman | sip |
ToniSB | por favor |
ToniSB | vamos con las preguntas... |
ToniSB | tal vez sea mejor hacerlas aqui ahora |
ToniSB | Oks sarnold. |
ToniSB | tu habias hecho la primera pregunta. |
viXard | quien tien el log de este canal ? |
ToniSB | Hace una combinacion de cosas |
ToniSB | Usas anotaciones para marcar el codigo fuente para que lclint tenga mas informacion |
ToniSB | por ejemplo, para que sepa que una funcion solo se llama con un buffer de tamaño 100 |
ToniSB | Afortunadamente esta informacion adicional sera verificada por lclint |
ToniSB | En el peor caso puedes marcar codigo seguro |
ToniSB | sarnold> hay alguna maneral senzilla para juntar el "array de 100 elementos" del LCLint con la declaracion/malloc del buffer a 100 elementos? |
ToniSB | Si. Tenemos una version anotada interna de la libreria estandart. |
ToniSB | malloc tiene la anotacion: |
ToniSB | eso nos dice que str = malloc(100); implica que str[99] o menor es valido |
ToniSB | sarnold_> mm, pienso que me he perdido la notacion |
ToniSB | (empezaba con '/' ?) ;) |
ToniSB | Perdon, la anotacion es * void malloc (size_t size( /*@asegura maxSet(result) == (size - 1) @*/ |
ToniSB | Si,las anotaciones son de la forma /*@ ... @*/ |
ToniSB | Mas preguntas |
ToniSB | sarnold_> si, un segundo |
ToniSB | fernand> que piensas del cyclone y otras aproximacions similares? |
ToniSB | Pienso que cyclone es un proyecto interesante |
ToniSB | sarnold_> como lo hace el LCLint para manejar funciones que usan como argumentos arrays de tamaño variable? |
ToniSB | cyclone para la gente que no lo sepa, es un intento de hacer una version de C a salvo de errores de escritura |
ToniSB | Esto es una cosa y seria bueno si la gente usara lenguajes mas seguros |
ToniSB | de todas formas, ya existes lenguajes mas seguros: java, ada, etc. |
ToniSB | Pero aun asi la gente insiste en tener problemas con C |
ToniSB | sean cuales sean los beneficios de un nuevo lenguaje,a la gente le cuesta cambiar de lenguaje. |
ToniSB | tal vez el cyclone es tan cercano al C que la gente desearia cambiarse. Pero la historia nos indica que esto no es muy probable que ocurra. |
ToniSB | viXard te importa seguir? |
viXard | sigo |
ToniSB | gracias ;) |
viXard | Usamos el comentario requerido, por ejemplo |
viXard | foo (char *s, int n ) /@requires maxSet(s) >= n @*/ |
viXard | Esto dice que esta funcion solo es segura si el puntero apuntado por s es mas grande que n |
viXard | <sarnold_> ok, y eso une las declaraciones de tamaño, en el tiempo de compilacion estatica |
viXard | o el dinamico /*@ensures maxSet(result) == (size - 1) @*/ from malloc() ? ? |
viXard | Bueno, cuando revisamos el cuerpo de foo, asumimos que el comentario es cierto |
viXard | <sarnold_> Y, como pregunta final, como ese ultimo ejemplo puede ser modificado, digamos para free(), el cual vuelve atras 4 bytes o algo similar |
viXard | usando la variable *(variable - 4) para obtener informacion ? |
viXard | ESTO es para la preguta anterior |
viXard | Cada vez que foo es llamado, reportamos un error, para esto no podemos verificar la precondicion del parametro actual |
viXard | para la siguiente pregunta... |
viXard | Preguntas como usar free y luego accesar la memoria ? |
viXard | <sarnold_> no, no |
viXard | pregunto como LCLint puede verificar que free() no esta 'out of bounds' (¿?) |
viXard | cuando toma ptr-4 para su propia data |
viXard | <sarnold_> maxSet(ptr) >= n-4 ? |
viXard | <drl7x> quieres decir free( *(ptr -3) ) or free (ptr - 3) |
viXard | <sarnold_> free(3) esta en la libc de malloc... |
viXard | y bueh ya ellos estan discutiendo quien tiene la madre mas bonita ;) |