Exploits de elevación de privilegios en el kernel Linux

Desde Hispasec nos llega la importantisima noticia de que se han publicado dos exploits y una prueba de concepto para la una vulnerabilidad en el kernel Linux que podría permitir a un atacante local elevar privilegios a root.

La vulnerabilidad afecta a los kernel Linux posteriores a la versión 3.4. El error fue introducido en la función ‘compat_sys_recvmmsg’ en el archivo ‘/net/compat.c’ al agregar código para manejar estructuras de tiempo de 64 bits.

Básicamente, el fallo consiste en una ausencia de verificación en cierta estructura pasada desde el área de usuario como argumento a la función
‘__sys_recvmmsg’. Esta función terminará por usar la estructura pasada a espacio del kernel sin ningún tipo de comprobación. Si observamos el código del commit:

kernel1

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/net/compat.c?id=ee4fa23c4bfcc635d077a9633d405610de45bc70

En primer lugar vemos como la función ‘compat_sys_recvmmsg’ recibe en uno de sus parámetros (el último) un puntero a una estructura ‘timespec’. Dicho parámetro está marcado por la macro ‘__user’ que indica que dicho parámetro procede del área de usuario.

Posteriormente vemos como si está definido ‘COMPAT_USE_64BIT_TIME’ dicho parámetro es usado en la llamada a la función ‘__sys_recvmmsg’. Ahí está
el problema, y es grave. Jamás se debería acceder a la memoria del kernel desde el espacio de usuario y no filtrar previamente dicha estructura es lo que hace precisamente la función vulnerable.

Tal y como señalan en la lista oss-security (de lectura altamente recomendable) http://seclists.org/oss-sec/2014/q1/187 uno de los parches propuestos filtra dicho parámetro a través de la llamada a la función ‘copy_from_user’ para comprobar si las referencias a memoria se están haciendo al espacio de usuario en vez de a la memoria del núcleo o si tiene capacidad para lectura/escritura. En dicho caso se provocaría un fallo y se devolvería el error -EFAULT.

Vemos parcialmente el parche aquí y observamos las llamadas a la función comentada y a su homónima ‘copy_to_user’ cuando la operación es a la inversa:

kernel2

En principio la vulnerabilidad afecta a los kernel Linux desde la versión 3.4, aunque ha de estar definida la opción ‘CONFIG_X86_X32’. Esto podemos comprobarlo en el archivo de configuración de arranque (en algunas distribuciones):

/boot/config-* (donde * es la versión del kernel que podemos ver también haciendo uname -r)

Como curiosidad lo que esta opción permite es tener la capacidad de ejecutar binarios que usen punteros de 32 bits ejecutándose en arquitecturas de 64bits. (http://en.wikipedia.org/wiki/X32_ABI)

Más información:

Exploit 1
http://www.exploit-db.com/exploits/31346/

Exploit 2
http://www.exploit-db.com/exploits/31347/

PoC
http://www.exploit-db.com/exploits/31305/

Fuente: Hispasec – Una al dia

¿Te resultó interesante? Compártelo ...



elMor3no

Publicado por elMor3no

http://gutl.jovenclub.cu » Forma parte de GUTL desde el 6 diciembre, 2011. Usuario de GNU/Linux desde hace varios años. Coordinador Nacional de GUTL.

Este artículo tiene 14 comentarios

  1. En reiteradas ocasiones hemos visto las ventajas de un kernel al edge, pero estos son algunos de los problemas que traen andar tan «actualizados». También veo como un problema que algunos de estos no están tan actualizados 3.4-3.7(algunos tienen más de un año), creo que a Linus(sé que no es exclusivamente su trabajo) le daría un consejo parecido al que le daría a Canonical, no lancen tantas versiones y denle robustez a las que tienen, están enfermos de «versionitis» y de paso nos tienen enfermos a nosotros.
    Saludos

    • Linus es solo el supervisor final, pero imagínate si se pone a publicar actualizaciones solo una vez al año o algo así, con la cantidad de mejoras (mejoras importantes) que hay en cada actualización del kernel. NO, la frecuencia de actualizaciones está bien, eso creo yo.
      Por otro lado cuando sale una noticia sobre cierta vulnerabilidad, seguro hay alguien que está a punto de publicar la solución.

      • por lo general es el mismo que la detecta el que la corrige o al menos el que propone la corrección, a nadie le cuadra que haya vulnerabilidades en el kernel, pero es que estas aparecen cuando pasa el tiempo porque el código viejo queda obsoleto muy rápido. Esta vulnerabilidad que dicen en el artículo no estaba presente en sistemas de 32 bits, es al pasar a 64 bits que se convierte en vulnerabilidad. Lo bueno es que sabemos que se corrigen.

  2. Linux R2D2 3.12.9-1-ARCH

    Ese es mi Kernel en estos momentos. Dudo mucho, pero mucho, que esta vulnerabilidad ya no haya sido corregida y parcheada.

    • Hola linuXgirl, una vulnerabilidad es una brecha de seguridad que puede ser explotada por: malware polimórfico, troyanos, gusanos, xploits remotos, programas de fuerza bruta. Alguna vez un amigo veterano me dijo que en la comunidad linux una vulnerabilidad o error era reparado en 48 horas.
      Aunque recientemente se descubrió que tardaron 23 años en descubrir una saturación de búffer en el X11. Saludos

Los comentarios están cerrados.