
Pruebas de concepto que demuestran algunos aspectos de la mitigación de pila sombra del kernel de Windows.
Este proyecto tiene como objetivo destacar ciertos aspectos de la mitigación de shadow stack implementada por Microsoft en Windows 11. El código está específicamente enfocado en Windows 11 24H2. Es posible que no funcione en otras versiones de Windows 11, debido a la gestión de desplazamientos del kernel.
El proyecto se divide en dos partes: un cliente y un controlador. La comunicación entre ellos se gestiona mediante el mecanismo IOCTL. El cliente solicita al controlador que realice acciones a nivel de kernel.
CR4 actual, lo que provoca un BSOD.try/except y del shadow stack durante una división por cero.Use build.bat.
Como requisito previo, los siguientes kits deben ser para la misma compilación de Windows:
Nota:
El POC se ha probado con la versión 10.0.26100.0 de los kits.
Para activar la mitigación de shadow stack del kernel, se deben agregar o establecer los siguientes valores en la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\:
| Nombre | Tipo | Datos |
|---|---|---|
| EnableVirtualizationBasedSecurity | REG_DWORD | 1 |
| Scenarios\HypervisorEnforcedCodeIntegrity\Enabled | REG_DWORD | 1 |
| Scenarios\KernelShadowStacks\Enabled | REG_DWORD | 1 |
Además, para poder cargar un controlador con firma de prueba, se debe ejecutar el siguiente comando en una consola de administrador:
bcdedit /set testsigning on
A continuación, se requiere un reinicio.
Para cargar el controlador, se deben introducir los siguientes comandos en una consola de administrador:
sc create shadow type= kernel binPath= ABSOLUTE_PATH_TO_THE_DRIVER
sc start shadow
El cliente tiene las siguientes opciones:
SergiusTheBest por su FindWDK.
| Opción | Descripción |
|---|
| inc | Incrementa la dirección de retorno al llamador en 1 |
| skip | Parchea RSP para apuntar al marco de pila anterior |
| cdisable | Deshabilita CET en CR4 |
| cenable | Habilita CET en CR4 |
| wrmsr REGISTER VALUE | Escribe el REGISTRO con el VALOR dado |
| wrshsk | Escribe en el shadow stack |
| wrshskpte | Reescribe el PTE del shadow stack |
| div DIVIDEND DIVISOR | Realiza una división de enteros en espacio de kernel |