Logo Umeet2001

ESPAÑOL
Presentación

Programa

Desarrollo

ENGLISH

Presentation

Programa

Desarrollo


viXardestamos ogullosos de presentar al sr. David Larochelle
viXardgraduado de la universidad de virginia en ciencias de computacion
viXardlos slides estan en http://www.cs.virginia.edu/~drl7x/umeet/umeet.htm
viXardel titulo es "deteccion estatica para vulnerabilidades por overflow
viXardcomenzamos
viXardGracias
viXardlas preguntas de hacen en #qc
viXardHola, esta charla esta basada en una presentacion de este año en usenix security
viXardsi quieren mas detales de la misma : lclint.cs.virginia.edu
viXardhace 13 años, muchas computadoras fueron saturadas hasta el punto de no poder usarse
viXardel causante fu el gusando Morris
viXardexplotando el daemon del finger
viXardpara este momento un overflow en el buffer no era algo bien comprendido
viXardasi que esto causaba que fuera muy vulnerable
viXardhoy en dia el overflow del buffer es un problema aun
viXardlos overflows de buffer del IIS siguen siendo explotadios por el Red Code
viXardesto sigue siendo la causa de una gran cantidad de vulnerabilidades en internet
viXardsi accesan los slides, podran ver el wall street journal reciente como testimonio del peligro del overflow del buffer
viXardel sitio fue hacekado dos veces este año
viXardparte del problema es la educacion
viXardlos programadores aun no conocen el preligro de esta vulnerabilidad
viXardpor esta razon, aun los programadores de seguridad, cometen errores
viXardpara ilustrar esto, mostrare un ejemplo mas tarde
viXardya que los prograadores siempre cometen errores, necesitamos herramientas automatizadas
viXarddos posibles aproximanciones para ellos, son run-time y tiempo de compilacion
viXardla primera
viXardtrabaja creando ejecutables que chekan los overflows
viXarddetectan el error, lo examinan
viXardsin ejecutarlos
viXardel problema es solucionado en el codigo fuente
viXardel proximo slide
viXardqueremos crear una herramienta que usarian los programadores para detectar los errores en sus codigos
viXardslide 7
viXardNosotros implementamos nuestra herramienta extendiendo LCLint, una herramienta estatica de codigo abierto
viXardUsando anotaciones, LCLint es capaz de de detectar
viXardun lint estandar.
viXardintegramos nuestra herramienta de chequeo con LCLint, lo cual permitio mejorar nuestra capacidad de deteccion de fallos
viXardslide 8
viXardDos anotaciones añadodas son MaxSet, el cual denota el indice maximo en una cadena
viXardque puede ser escrita libre de errores
viXardy MaxRead, la cual denota el maximo indice en una cadena que puede ser leida sin errores
viXardSlide 9
viXardEsto proviene de una guia de programacion de SecurityFocus.com
viXardEn la guia ellos sugieren que los programadores usen strncat en vez de strcat
viXardy proveen esto como un ejemplo de como usar strncat.
viXardEl codigo fue basico
viXard<drl7x> char buffer[256]
viXard<drl7x> strncat (buffer, str, sizeof(str) -1 )
viXarddonde str  es una funcion parametro
viXardAqui hay dos problemas
viXardprimero: el buffer es inutilizable
viXardadicionalmente, el usuario ha confundido el requemiento de strncat.
viXardproximo slide
viXardcomo se puede ver en el slide
viXardse muestra un ejemplo de la alerta reportada por lclint
viXardslide 11
viXardNuestro chequeo toma lugar completamente dentro de las funciones
viXardthe rule  maxRead(str + i) = maxRead(str) - i
viXardun ejemplo
viXardesto ayuda a manejar el codigo en el que un puntero ha sido incrementado
viXardfinalmente, producimos mensajes de error
viXardslide 12
viXardmas splits
viXardEncontramos que tantos "loops" (repeticiones)
viXardtienen formas comunes
viXardpor ejemplo, en el eloop:
viXardfor (init; *buf; buff++)
viXardasumimos que el loop ejecuta maxRead(buf)
viXardinteracciones, y modelamos las primeras y ultimas interaciones
viXarddel loop
viXardslide 13
ToniSBPara probar nuestra herramienta la usamos para analizar dos programas de seguridad critica del codigo abierto.
ToniSBEn los dos casos detectamos bugs conocidos...
ToniSBAdicionalmente, fuimos capazes de descubrir overflows de buffer desconocidos
ToniSBNuestra 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)
ToniSBy 33 segundos para analizar el BIND
ToniSBel wu-ftpd tiene 20000 lineas de codigo...
ToniSBy el bind 40,000
ToniSBLa tabla en la diapositiva(slide) 14 tiene un buen sumario de los resultados
ToniSBRecientemente hemos analizado otra vez el wu-ftpd
ToniSBSin comentarios la herramienta producio 166 warnings de escrituras fuera-de-indice(out-of-bounds)
ToniSBDespues de iterativamente ir añadiendo comentarios y volviendo a ejecutar la herramienta
ToniSBlclint producio 101 warnings de buffer overflows
ToniSBEsto esto es un ejemplo de un bug en el wu-ftpd que detectamos.
ToniSBint access_ok( int msgcode) {
ToniSB    char class[1024], msgfile[200];
ToniSB     int limit;
ToniSB   limit = acl_getlimit(class, msgfile);
ToniSBAqui la funcion getaclentry setea entry->arg[3] a apuntar a una cadena de lectura potencialmente arbitraria desde un archivo de configuracion
ToniSBEl str lo copia en msgpathbuf
ToniSBstrcpy(msgpathbuf, entry->arg[3];
ToniSBCuando ejecutamos lclint para informar:
ToniSBun buffer overflow potencial
ToniSBAñadiendo comentarios y cambios en strncy para determinar que la funcion
ToniSBLCLint es capaz de determinar que la funcion es segura
ToniSBde todas formas tuvimos que hacer un numero de cambios a la funcion y volver a ejecutar lclint antes de poder asegurarnos de su seguridad
ToniSBslide 16
ToniSBTrabajos relacionados
ToniSBTradicionalmente, se ha usado el analisis lexico para buscar vulnerabilidades
ToniSBUsando 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.
ToniSBEl analisis lexico esta limitado a detectar solo vulnerabilidades en llamadas a funciones. Y tiende a producir un elevado numero de positivos falsos
ToniSBWagner 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
ToniSBel analisis insensible al flujo es usado para resolver "contraints"(¿?¿)
ToniSBEsta aproximacion no requiere anotaciones y trabaja bastante bien.
ToniSBPero el analisis insensible al flujo es impreciso y causa un elevado numero de positivos falsos.
ToniSBAdemas esta aproximacion no puede detecar overflows de buffer que ocurren como resultado de un acceso directo al buffer.
ToniSBRecientemente Dor ha intentado detectar overflows de buffer haciendo una tranduccion source-to-source(codigo-fuente a codigo-fuente)
ToniSBEsto crea un programa seguro que contiene variables adicionales y instrucciones assert.
ToniSBOverflows de buffer en el programa original se detectan buscando los casos en que los asserts en el programa seguro pueden fallar.
ToniSBslide 17
ToniSBReconocemos que hay ciertos impedimientos al uso masivo de nuestra herramienta.
ToniSBLa gente es vaga
ToniSBy los programadores son mas vagos que la mayoria
ToniSBAñadir anotaciones puede ser demasiado trabajo excepto para los fanaticos de la seguridad
ToniSB<conclusiones del slide 18>
viXardpermiso: las preguntas en #qc
ToniSBComo serian las cosas de aqui 13 años?
ToniSBSeran los overflows de buffer explotados normalmente?
ToniSBEntre la comunidad de la seguridad, los overflows de buffer han sido mucho tiempo un problema bien entendido.
ToniSBDe todas formas, los overflows de buffer han seguido siendo demasiado comunes.
ToniSBSi 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.
ToniSBLa creacion de herramientas de chequeo estatico es un camino prometedor para conseguir esto.
ToniSBActualizacion:
ToniSBHay un par de adiciones al LCLint que no estan incluidas en las diapositivas.
ToniSBAhora ofrecemos funcionalidad como la del ITS4 en la que
ToniSBcada repeticion de una funcion potencialmente vulnerable como la del gets, es informada
ToniSBde 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.
ToniSBGracias por escuchar esta charla.
ToniSBplas plas plas plas ;)
ToniSBtraduzco las preguntas?
arnettesi
arnetteQue no las entiendo der too ;OP
hecmansip
ToniSBpor favor
ToniSBvamos con las preguntas...
ToniSBtal vez sea mejor hacerlas aqui ahora
ToniSBOks sarnold.
ToniSBtu habias hecho la primera pregunta.
viXardquien tien el log de este canal ?
ToniSBHace una combinacion de cosas
ToniSBUsas anotaciones para marcar el codigo fuente para que lclint tenga mas informacion
ToniSBpor ejemplo, para que sepa que una funcion solo se llama con un buffer de tamaño 100
ToniSBAfortunadamente esta informacion adicional sera verificada por lclint
ToniSBEn el peor caso puedes marcar codigo seguro
ToniSBsarnold> hay alguna maneral senzilla para juntar el "array de 100 elementos" del LCLint con la declaracion/malloc del buffer a 100 elementos?
ToniSBSi. Tenemos una version anotada interna de la libreria estandart.
ToniSBmalloc tiene la anotacion:
ToniSBeso nos dice que str = malloc(100); implica que str[99] o menor es valido
ToniSBsarnold_> mm, pienso que me he perdido la notacion
ToniSB(empezaba con '/' ?) ;)
ToniSBPerdon, la anotacion es * void malloc (size_t size( /*@asegura maxSet(result) == (size - 1) @*/
ToniSBSi,las anotaciones son de la forma /*@ ... @*/
ToniSBMas preguntas
ToniSBsarnold_> si, un segundo
ToniSBfernand> que piensas del cyclone y otras aproximacions similares?
ToniSBPienso que cyclone es un proyecto interesante
ToniSBsarnold_> como lo hace el LCLint para manejar funciones que usan como argumentos arrays de tamaño variable?
ToniSBcyclone para la gente que no lo sepa, es un intento de hacer una version de C a salvo de errores de escritura
ToniSBEsto es una cosa y seria bueno si la gente usara lenguajes mas seguros
ToniSBde todas formas, ya existes lenguajes mas seguros: java, ada, etc.
ToniSBPero aun asi la gente insiste en tener problemas con C
ToniSBsean cuales sean los beneficios de un nuevo lenguaje,a la gente le cuesta cambiar de lenguaje.
ToniSBtal 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.
ToniSBviXard te importa seguir?
viXardsigo
ToniSBgracias ;)
viXardUsamos el comentario requerido, por ejemplo
viXardfoo (char *s, int n ) /@requires maxSet(s) >= n @*/
viXardEsto 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
viXardo el dinamico /*@ensures maxSet(result) == (size - 1) @*/ from malloc() ? ?
viXardBueno, 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
viXardusando la variable *(variable - 4)  para obtener informacion ?
viXardESTO es para la preguta anterior
viXardCada vez que foo es llamado, reportamos un error, para esto no podemos verificar la precondicion del parametro actual
viXardpara la siguiente pregunta...
viXardPreguntas como usar free y luego accesar la memoria ?
viXard<sarnold_> no, no
viXardpregunto como LCLint puede verificar que free() no esta 'out of bounds'  (¿?)
viXardcuando 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...
viXardy bueh ya ellos estan discutiendo quien tiene la madre mas bonita ;)

Generated by irclog2html.pl by Jeff Waugh - find it at freshmeat.net!


Mas información: umeet@uninet.edu