Explotación de escalada de privilegios locales para el conductor del núcleo CPU-Z.
La aplicación CPU-Z instalará un controlador firmado vulnerable para acceder a los datos del kernel desde USERMode. Antes de V1.81, el controlador CPU-Z expuso tres IOCTL que permiten que cualquier aplicación USERMode lea los registros de control, lea DWORDS de la memoria física y escriba DWORDS a la memoria física. Abusamos de esta funcionalidad para obtener la ejecución completa del código del modo del núcleo y generar un shell del sistema como prueba de concepto.
Este exploit admite Windows XP - Windows 10 1607:
Esta exploit se probó en los siguientes sistemas con CPU-Z V1.76:
* En Windows 1703 y posterior la protección de flujo de control del kernel (CFG) está habilitado de forma predeterminada [1], lo que resulta en una verificación de errores kernel_security_check_failure.
Para ejecutar este exploit, inicie la aplicación CPU-Z y ejecute Exploit.exe desde un símbolo del sistema como usuario normal. Si tiene éxito, debe generar un nuevo proceso CMD.EXE que se ejecuta como sistema. Tenga en cuenta que esta exploit fallará si se ejecuta desde un proceso de baja integridad debido al uso de NtquerySystemInformation.
El controlador de núcleo CPU-Z antes de V1.81 permite que cualquier aplicación USERMode lea los registros de control, lea DWORDS de la memoria física y escriba DWORDS a la memoria física. Abusamos de esta funcionalidad para leer CR3 y atravesar las tablas de página para construir una primitiva de lectura/escritura arbitraria en todo el espacio de memoria virtual.
Con la lectura/escritura completa, volteamos el bit de usuario/supervisor en la entrada de la tabla de página (PTE) que contiene nuestra carga útil a KernelMode para evitar la prevención de ejecución del modo de supervisor (SMEP). Luego sobrescribimos un puntero de función en NT! HaldispatchTable [1] y activamos la carga útil llamando a NtQueryIntervalProfile.
Como prueba de concepto, la carga útil asignará el token del sistema a un proceso CMD.exe suspendido y reanudará el proceso. Esto debería dar como resultado un nuevo símbolo del sistema que se ejecuta como autoridad/sistema NT. La carga útil no se basa en compensaciones estáticas y, por lo tanto, debería funcionar en Windows XP+.
Se han introducido varias mitigaciones en los últimos dos años que limitan la efectividad de esta exploit. Una breve descripción está a continuación.
A partir de la versión 1.81, el controlador proporcionado con CPU-Z se ha parcheado para limitar el conjunto de personas que llaman que pueden abrir su objeto de dispositivo y se han eliminado algunas implementaciones de IOCTL. En las solicitudes para abrir el objeto del dispositivo del controlador, verificará si el proceso actual tiene habilitado el SeloAdDriverPrivilege. Si este privilige falta o está deshabilitado, el controlador rechazará la solicitud con status_access_denied. Tenga en cuenta que cuando se ejecuta como administrador, es trivial habilitar este privilegio desde Usermode. Además, se ha eliminado el IOCTL para leer registros de control (aunque las implementaciones de lectura/escritura de memoria física permanecen). Sin la capacidad de leer la base de la tabla de página de CR3, el método de explotación en este proyecto ya no es factible. Tenga en cuenta que el controlador CPU-Z proporciona numerosos otros IOCTL que podrían usarse para la explotación, como leer y escribir a registros arbitrarios específicos del modelo.
A partir de Windows 10 1703 (actualización de creadores), la protección de flujo de control del kernel está habilitado de forma predeterminada en x86_64. Las llamadas a través del HalDispatchTable darán como resultado una verificación de errores Kernel_Security_Check_Failure, ya que está protegido por CFG. Si la seguridad basada en la virtualización (VBS) no está habilitada, debería ser posible agregar la carga útil como un objetivo de llamada válido para evitar CFG.
Si la seguridad basada en la virtualización (VBS) está habilitada, matará la mayoría de esta exploit. La manipulación de PTE utilizada para deshabilitar la SMEP ya no será posible, ya que el Hypervisor protegerá el PTES. Además, se necesitará un bypass CFG en x86_64 para obtener la ejecución del código a través del HalDispatchTable ya que el mapa de bits de núcleo CFG no será escritos.
Las vulnerabilidades utilizadas en esta exploit se detallan en CVE-2017-15302 y CVE-2017-15303. Otra prueba de concepto se puede ver en CPUZ-DSEFIX [5].
[1] https://community.osr.com/discussion/283374/control-flow-guard-question
[2] https://www.cvedetails.com/cve/cve-2017-15302/
[3] https://www.cvedetails.com/cve/cve-2017-15303/
[4] https://github.com/akayn/bugs/blob/master/cpuid/cve-2017-15302/readme.md
[5] https://github.com/samlarenn/cpuz-dsefix
Además, el método de sobrescritura haldispatchTable utilizado en esta exploit es un vector comúnmente utilizado para obtener la ejecución del código de un núcleo de lectura/escritura primitiva. Para obtener detalles adicionales sobre esta técnica, consulte los recursos a continuación.
[6] http://poppopret.blogspot.com/2011/07/windows-kernel-exploitation-basics-part.html
[7] https://www.abatchy.com/2018/01/kernel-exploitation-7
[8] https://osandamalith.com/2017/06/14/windows-kernel-exploitation-arbitrary-overwrite/
[9] https://rootkits.xyz/blog/2017/09/kernel-write-whwher-where/