
Exploit de prueba de concepto para CVE-2024-21338, una vulnerabilidad de escalada de privilegios del controlador AppLocker de Windows (appid.sys) utilizada por el grupo Lazarus como un 0day. Logra lectura/escritura del kernel mediante solicitudes IOCTL manipuladas y manipulación de PreviousMode.
Este es un POC para CVE-2024-21338, una vulnerabilidad de elevación de privilegios en el controlador Windows AppLocker (appid.sys), que fue explotada como 0day por el grupo Lazarus para la elevación de privilegios locales en Windows.
CVE-2024-21338 es una vulnerabilidad de elevación de privilegios revelada el 13 de febrero de 2024 en el Patch Tuesday de Microsoft. Fue explotada por el grupo de hackers Lazarus para obtener acceso al kernel y desplegar el rootkit FudModule.
La vulnerabilidad reside en el código de control 0x22A018 del controlador appid.sys. Un atacante puede desencadenar la vulnerabilidad enviando una solicitud IOCTL especialmente diseñada, logrando así una invocación de devolución de llamada arbitraria y, finalmente, obteniendo permisos de lectura/escritura del kernel.

La vulnerabilidad se encuentra en la función AppHashComputeImageHashInternal del controlador appid.sys. AipDeviceIoControlDispatch no verifica correctamente PreviousMode al procesar la solicitud 0x22A018, lo que permite que un proceso en modo usuario active una función de devolución de llamada en modo kernel.
Obtener privilegios de Local Service: Esta vulnerabilidad requiere privilegios de Local Service para acceder al dispositivo \\Device\\AppID, por lo que la herramienta primero encuentra y suplanta un proceso de Local Service.
Construir solicitud IOCTL: La herramienta construye una solicitud IOCTL especialmente diseñada que contiene un puntero a función controlable y sus parámetros.
Desencadenar la vulnerabilidad: Al enviar la solicitud IOCTL, se desencadena la vulnerabilidad, llamando a una función gadget en el kernel para modificar el campo PreviousMode del hilo actual, cambiándolo de modo usuario a modo kernel.
Obtener permisos de lectura/escritura del kernel: Una vez modificado PreviousMode, el proceso en modo usuario puede usar NtReadVirtualMemory y NtWriteVirtualMemory para leer y escribir memoria arbitraria del kernel.
Compile este proyecto con Visual Studio 2026; requiere Windows SDK y un compilador de C++ compatible.
Habilite el servicio Application Identity en un sistema Windows sin parches (por ejemplo, Windows 10 1709).
Ejecute el archivo ejecutable compilado con privilegios de administrador.
La herramienta encontrará automáticamente el proceso Local Service y lo suplantará.
La herramienta cargará el controlador appid.sys y construirá una solicitud IOCTL para desencadenar la vulnerabilidad.
Una vez desencadenada la vulnerabilidad con éxito, la herramienta solicitará la dirección y el valor del kernel a modificar, permitiendo la modificación de la memoria del kernel.
Este proyecto es únicamente con fines educativos y de investigación. No debe utilizarse para fines ilegales.
| Nombre del archivo | Descripción |
|---|
| main.cpp | Función principal, controla el flujo de explotación de la vulnerabilidad |
| CVE-2024-21338.h | Estructuras y declaraciones de funciones relacionadas con la explotación |
| CVE-2024-21338.cpp | Funciones de implementación de requisitos previos para la explotación |
| export_func.h | Declaración de funciones exportadas |
| gadget_search.cpp | Implementación de búsqueda de gadgets del kernel |
| Native.h | Definiciones de API nativas de Native |
| PE.h | Funciones auxiliares para procesar archivos PE |