
Preuves de concept démontrant certains aspects de la mitigation shadow stack du noyau Windows.
Ce projet vise à mettre en évidence certains aspects de la mitigation de shadow stack implémentée par Microsoft dans Windows 11. Le code est spécifiquement axé sur Windows 11 24H2. Il peut ne pas fonctionner sur d'autres versions de Windows 11, en raison de la gestion des offsets du noyau.
Le projet est divisé en deux parties : un client et un driver. La communication entre eux est gérée via le mécanisme IOCTL. Le client demande au driver d'effectuer des actions au niveau du noyau.
CR4 courant, entraînant un BSOD.try/except et de la shadow stack lors d'une division par zéro.Utilisez build.bat.
Comme prérequis, les kits suivants doivent correspondre à la même version de Windows :
Remarque :
Le POC a été testé avec la version 10.0.26100.0 des kits.
Pour activer la mitigation de shadow stack du noyau, les valeurs suivantes doivent être ajoutées ou définies dans la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ :
| Nom | Type | Données |
|---|---|---|
| EnableVirtualizationBasedSecurity | REG_DWORD | 1 |
| Scenarios\HypervisorEnforcedCodeIntegrity\Enabled | REG_DWORD | 1 |
| Scenarios\KernelShadowStacks\Enabled | REG_DWORD | 1 |
De plus, afin de charger un driver signé en test, la commande suivante doit être exécutée dans une console administrateur :
bcdedit /set testsigning on
Ensuite, un redémarrage est requis.
Pour charger le driver, les commandes suivantes doivent être saisies dans une console administrateur :
sc create shadow type= kernel binPath= ABSOLUTE_PATH_TO_THE_DRIVER
sc start shadow
Le client dispose des options suivantes :
SergiusTheBest pour son FindWDK.
| Option | Description |
|---|
| inc | Incrémente l'adresse de retour de l'appelant de 1 |
| skip | Patche RSP afin de pointer sur le frame de pile précédent |
| cdisable | Désactive CET dans CR4 |
| cenable | Active CET dans CR4 |
| wrmsr REGISTER VALUE | Écrit le REGISTER avec la VALUE donnée |
| wrshsk | Écrit dans la shadow stack |
| wrshskpte | Réécrit la PTE de la shadow stack |
| div DIVIDEND DIVISOR | Effectue une division entière dans l'espace noyau |