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() y 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)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 :)
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;
....
....
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:
Publicar un comentario