domingo, 25 de agosto de 2013

Denegación de servicio en Samba

Jeremy Allison, trabajador de Google y colaborador del proyecto Samba, ha descubierto un error de desbordamiento de entero en Samba que permite ocasionar una denegación de servicio a través de una petición especialmente manipulada.

Samba es una implementación libre del protocolo SMB/CIFS. Dicho protocolo permite compartir archivos, impresoras y otros dispositivos a través de la red. SMB/CIFS es asociado a menudo con estaciones de trabajo Microsoft Windows ya que es soportado de manera nativa desde Windows 2000. Su desarrollo comenzó en los laboratorios de IBM para dar capacidad de interoperatividad de red al sistema de archivos de MS-DOS.

La vulnerabilidad descubierta por Allison reside en la función 'read_nttrans_ea_list' del archivo 'nttrans.c'.

Este es el código de la función vulnerable:



Esta función está encargada de crear una lista enlazada de estructuras de nombres y datos EA. Su misión es leer las entradas de ese tipo que residan en el campo 'pdata' de la petición SMB e ir añadiendo nodos a dicha lista. Por cada entrada se llamará a la función 'read_ea_list_entry' que nos creará la entrada correspondiente reservando memoria para cada una de ellas.

Para cada entrada creada se llamará a la macro 'DLIST_ADD_END' que será la encargada de insertar el nuevo nodo a la lista. Finalmente la función que tratamos retornará un puntero a la cabeza de dicha lista.

Si observamos, 'offset' es del tipo 'size_t', es decir, es un entero sin signo inicializado a 0. Más adelante vemos que se entra en un bucle 'while' para ir agregando estructuras a la lista. Para ir de nodo a nodo se actualiza el offset sumando a su valor actual el valor que haya en 'next_offset'. El valor que se asigna a 'next_offset' viene dado por una estructura de datos que viene con la petición (request). Dicho valor es manipulable y puede inicializarse a un valor negativo relativamente grande.

Si manipulamos una petición y añadimos a la cabecera un valor negativo:

// construct nttrans header
  nttrans_hdr.paramoffset[0] = '\x00';
  nttrans_hdr.paramoffset[1] = '\x00';
  nttrans_hdr.paramoffset[2] = '\x10';
  nttrans_hdr.paramoffset[3] = '\xff';
  nttrans_hdr.dataoffset[0] = '\x00';
  nttrans_hdr.dataoffset[1] = '\x00';
  nttrans_hdr.dataoffset[2] = '\x10';
  nttrans_hdr.dataoffset[3] = '\xff';

(Las líneas de código pertenecen al exploit publicado por x90c)

Como 'offset' es un entero sin signo puede interpretarse como un número negativo y como 'next_offset' también es negativo no se saldrá del bucle 'while'. Esto creará un consumo de memoria continuo llevando al proceso a su desestabilización y por lo tanto creará una denegación de servicio.

Existe, como hemos reflejado, un exploit publicado por 'x90c'. La vulnerabilidad tiene asignado el CVE-2013-4124 y existe un parche disponible que detecta si la suma genera un valor menor que el esperado. Se consideran vulnerables las versiones anteriores a la: 3.5.22, 3.6.7 y 4.0.8.

Más información:

Denial of service - CPU loop and memory allocation.==

Exploitation: samba nttrans reply Integer overflow




David García
Twitter: @dgn1729


No hay comentarios:

Publicar un comentario en la entrada