02-12-2009
Aunque aun no se ha producido un comunicado oficial de FreeBSD, el fallo ha sido explotado con éxito en las versiones 8.0, 7.1 y 7.0 de FreeBSD
Riesgo: Medio
Descripción:El objetivo consiste en evitar la restricción que poseen ciertas variables de entorno usadas por el cargador dinámico "ld-elf.so", cuando el ejecutable tiene el bit setuid o setgid asignado. Esta restricción se aplica llamando a la función "unsetenv" de la librería estándar sobre estas variables para evitar que existan en el entorno creado.
El exploit crea un ejecutable y una librería dinámica. El ejecutable asigna al array que representa el entorno, un valor que apunta a una zona no inicializada del heap, y otro valor que inicia la variable de entorno "LD_PRELOAD" -la cual indica las librerías que han de cargarse antes que cualquier otra referenciada- a la ruta hacia la librería dinámica creada por el exploit.
Tras ello, se efectúa una llamada a la función del sistema "Excel" con el objeto de reemplazar el proceso con un ejecutable que posea el setuid de root. Al proceder a limpiar las variables de entorno que están restringidas, el cargador dinámico no chequea el valor de retorno de las llamadas a "unsetenv".
Esto último se aprovecha para crear un error en dichas llamadas y evitar que se borren las variables de entorno. Dentro de ese contexto se crea una shell con una simple llamada a la función estándar "system" dentro de la librería enlazada- que tendrá permisos efectivos de root.
El equipo de seguridad de FreeBSD ha publicado un parche, aunque como indican, es posible que no se trate de una versión final y no está suficientemente testeado. Puede descargarse desde:
http://people.freebsd.org/~cperciva/rtld.patch
http://lists.freebsd.org/pipermail/freebsd-announce/2009-December/001286.html
http://archives.neohapsis.com/archives/fulldisclosure/2009-11/0372.html
http://www.hispasec.com/unaaldia/4055/
http://xorl.wordpress.com/2009/12/01/freebsd-ld_preload-security-bypass/
http://secunia.com/advisories/37517/