Historias
Slashboxes
Comentarios
 

Una optimización de compilador permite ejecutar código arbitrario en Linux

editada por mig21 el 18 de Julio 2009, 16:36h   Printer-friendly   Email story
desde el dept. exploit-televisado
Un pobrecito hablador nos cuenta: «Se ha publicado un exploit para una nueva vulnerabilidad descubierta en el kernel Linux, que afecta a las versiones 2.6.30 y 2.6.30.1. Dicha vulnerabilidad es particularmente importante porque a través de ella es posible evitar las protecciones de seguridad de módulos como SELinux y AppArmor. Una posible solución es ejecutar el compilador con la orden CFLAGS+= -fno-delete-null-pointer-checks, que evita que la optimización se lleve a cabo. El error está solucionado en la rama 2.6.31-rc3. Visto en Slashdot»
El problema parece que proviene de una optimización del compilador en la implementación de net/tun respecto a los punteros referenciados a NULL. En concreto:

struct sock *sk = tun->sk; // initialize sk with tun->sk
...
if (!tun)
return POLLERR; // if tun is NULL return error
En esta porción de código, el compilador desecha el fin basándose en que, si tun fuera NULL, la aplicación habría devuelto un error en las sentencias anteriores. La ausencia de esa comprobación permite usar exploits de desreferecia de punteros NULL.

Historias relacionadas

[+] Como hacer 'SSL Spoofing' gracias a un caracter nulo 21 comentarios
Vía slashdot leo que dos investigadores, Dan Kaminsky y Moxie Marlinspike, han encontrado una manera de hacerse pasar por una web popular con autenticación de una autoridad certificadora: «Cuando un atacante que es dueño de su propio dominio (maltipo.com, por ejemplo) y pide un certificado de una autoridad certificadora, ésta, usando información del Whois, le manda un email para que confirme que es propietario del dominio. Pero un atacante también puede pedir un certificado para un subdominio de su web, como Paypal.com\0.maltipo.com, usando el carácter nulo \0 en la url. La autoridad certificadora le dará un certificado para este subdominio porque es el dueño legitimo del dominio raíz. Entonces, gracias a un bug en la implementación del SSL de muchos navegadores, se puede engañar a éstos para que entiendan este certificado como si fuera el que viene con la web de Paypal autentica. Básicamente, cuando estos navegadores vulnerables comprueban el nombre del dominio contenido en el certificado del atacante, dejan de leer cualquier carácter detrás del \0 en el nombre.»
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • ¿Qué hace la optimización?

    (Puntos:3, Interesante)
    por xOneca (38185) el Sábado, 18 Julio de 2009, 16:43h (#1160579)
    ( http://127.1/ )
    Entonces ¿la optimización elimina el if junto con su return? Es lo único que se me ocurre...

    Tendría más sentido moverla por encima de la asignación de *sk

    --
    Esto es Barrapunto: vale todo menos quedarse mudo.
  • Para mí eso un error de código

    (Puntos:2, Interesante)
    por Boriel (20804) el Domingo, 19 Julio de 2009, 13:40h (#1160659)
    ( http://www.boriel.com/ )
    Porque, efectivamente, *sk no debería ser inicializado de esa manera si tun puede valer NULL.

    struct sock *sk;
    if (!tun) return POLLERR; // if tun is NULL return error
    sk = tun->sk;
    ... // Resto del codigo
    Precisamente estudio compiladores y la optimización que hace me parece un poco bestia, pero lógica (no sé si yo la implementaría; quizá para O3 o superior). Vamos, que estoy defendiendo al compilador :-P porque parece que es éste quien tiene la culpa (según el título de la noticia).

    Muchas de esas cosas (como la inicialización original) se hacen por optimización, pero por encima de las optimizaciones está la estabilidad del código, y ésta, en concreto, puede referenciar al campo de un puntero NULL. Sigo pensando que es un bug del programador de ese código kernel.
  • ¿C# en el kernel?

    (Puntos:1)
    por miguelsan (22769) el Sábado, 18 Julio de 2009, 21:20h (#1160605)
    ( http://barrapunto.com/ | Última bitácora: Jueves, 29 Abril de 2010, 22:49h )
    Eso no se le ocurre ni a Microsoft. Serás ignorante y presuntuoso.

    Afortunadamente la versión 2.6.30 aún no está muy extendida (es la última liberada), y para que se pueda aprovechar la vulnerabilidad hay que escribir el código maligno y posteriormente conseguir instalarlo en la máquina destino. Es realmente improbable que alguien haya sido afectado.

    Esto me gusta del software libre. Nadie está libre de cometer errores, pero trabajando así colaboramos para que (casi) nadie sufra las consecuencias de los que hubiere. Ganamos todos.
    [ Padre ]
  • Re:¿Vulnerabilidad de Linux?

    (Puntos:5, Divertido)
    por pobrecito hablador el Sábado, 18 Julio de 2009, 22:23h (#1160613)
    Efectivamente, el kernel tiene codigo especifico para prevenir una vulnerabilidad y es el GCC el que machaca esta proteccion al optimizar el codigo.

    El kernel lo escribio originalmente Linus y el GCC fue de Stallman... no puede ser coincidencia.
    [ Padre ]
  • 3 respuestas por debajo de tu umbral de lectura actual.