Archivo

miércoles, 22 de junio de 2011

Vulnerabilidad en el Kernel 2.6.x


     En el mundo Linux, los drivers no están limitados a leer y escribir dispositivos, existe una librería llamada ioctl que se encuentra en el kernel y es el encargado en interactuar con los drivers de los dispositivos, esto nos permitirá, por ejemplo, abrir o cerrar una bandeja de la lectora de cd, disminuir la velocidad de rotación de un disco rígido, conocer si tu tarjeta de red tiene link, etc.

     Esta libreria contiene dos funciones, agp_generic_insert_memory()agp_generic_remove_memory(), que no se encuentran debidamente saneadas, es decir un usuario mal intencionado (llámese atacante :) podría suministrar datos especialmente manipulados para causar una condición de denegación de servicio o realizar una escala de privilegios.

     Veamos parte del codigo fuente de una de estas funciones:
1046 int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
1047 {
1048         int num_entries;
1049         size_t i;
1050         off_t j;
1051         void *temp;
1052         struct agp_bridge_data *bridge;
1053         int mask_type;
....
....
1099         if ((pg_start + mem->page_count) > num_entries)
1100                 return -EINVAL;
1101
1102         j = pg_start;
....
....
     En la linea 1099, si bien controla que pg_start + mem->page_count no sobrepase el valor de num_entries; no está controlando que pg_start + mem->page_count sea menor que pg_start (esta variable esta siendo pasada por parametro), la misma condicion aparece en la función agp_generic_remove_memory. Mmmm.. y es grave esto??? pues SI, de todas formas esta vulnerabilidad ya fue arreglada, así que solo resta que actualices tu kernel :)

Para más información ...

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=drivers/char/agp/generic.c;h=850a643ad694ff5022d3e51e0b061ad1eca9ef61
http://en.wikipedia.org/wiki/Ioctl
http://securitytracker.com/id/1025439

No hay comentarios: