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
Las vulnerabilidades podrían permitir 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.