lunes, 23 de febrero de 2004

Escalada de privilegios en función del API de Microsoft Windows XP

Se han detectado diversas vulnerabilidades en una función nativa del API
(Application Program Interface) del núcleo de Windows XP que permitiría
a un usuario con el privilegio SeDebugPrivilege ejecutar código en modo
kernel, además de poder leer y escribir de cualquier dirección de
memoria, incluyendo la ocupada por el kernel.

El privilegio SeDebugPrivilege permite cambiar el flujo de ejecución de
cualquier proceso o matarlo (incluyendo los subsistemas de seguridad o
cualquier servidor RPC).

La función ZwSystemDebugControl(), exportada de ntdll.dll, llama a una
función del sistema llamada NtSystemDebugControl(), que es ejecutada
en modo kernel, y que se creó para ser utilizada por depuradores con
el privilegio SeDebugPrivilege.

La primera vulnerabilidad permite modificar el registro MSR
(Model-Specific Register) IA32_SYSENTER_EIP para apuntar al código
deseado y que posteriormente se ejecute con el control total del
procesador.

La segunda permite modificar una entrada IDT (Interrupt Dispatch Table)
con un puntero hacia el código deseado y ejecutar una instrucción INT n
(interrupción del sistema). Un problema de comprobación de una
estructura implicada en el proceso permite la escritura en memoria
de kernel.

La tercera es similar a la anterior, pero utiliza las sub-funciones
DebugSysReadBusData/DebugSysWriteBusData para modificar el IDT.

La cuarta aprovecha que dado que el programa en modo usuario tiene
acceso directo a hardware, también puede leer y escribir memoria del
kernel con la ayuda de hardware que tenga acceso a la RAM del
procesador. Es un proceso similar al segundo y tercero, pero más
complejo.

A efectos prácticos, un usuario con el privilegio anteriormente nombrado
podría ejecutar código arbitrario como si fuera del kernel, además de
leer y escribir cualquier dirección accesible por el mismo. El programa
podría hacer cualquier cosa que el núcleo pueda realizar, como
reprogramar el hardware del sistema, como la BIOS, o parchear el kernel
en memoria. Hay que tener en cuenta que para explotar este problema se
requiere el privilegio SeDebugPrivilege, normalmente dado sólo a
administradores, por lo que el nivel de riesgo es reducido. La posesión
de este privilegio es suficiente para comprometer el sistema por su
diseño intrínseco.

Como medida sencilla de precaución, se recomienda conceder dicho
privilegio sólo a usuarios de confianza.

Se tiene constancia de la existencia de códigos de prueba de concepto
que aprovechan este problema.


Julio Canto
jcanto@hispasec.com


Más información:

Multiple Windows XP Kernel Vulnerability Allow User Mode Programs To
Gain Kernel Privileges
http://www.securiteam.com/windowsntfocus/5TP0B2KC0K.html