lunes, 30 de noviembre de 2009

Elevación de privilegios en FreeBSD

Nikolaos Rangos o más conocido como Kingcope, ha publicado en la lista de seguridad Full Disclosure un exploit 0-day para FreeBSD que podría permitir a un atacante local elevar privilegios.

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 "execl" 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.

Aunque aun no se ha producido un comunicado oficial de FreeBSD, el exploit ha sido probado con éxito en las versiones 8.0, 7.1 y 7.0.


David García
dgarcia@hispasec.com


Más información:

Exploit publicado en Full Disclosure:
http://seclists.org/fulldisclosure/2009/Nov/379

Parche del equipo de seguridad de FreeBSD:
http://people.freebsd.org/~cperciva/rtld.patch

FreeBSD LD_PRELOAD Security Bypass:
http://xorl.wordpress.com/2009/12/01/freebsd-ld_preload-security-bypass/

No hay comentarios:

Publicar un comentario en la entrada