
Preuve de concept pour CVE-2026-29923, une escalade de privilèges locale dans le pilote noyau pstrip64.sys. Démontre une primitive de lecture/écriture de la mémoire physique via IOCTL pour passer d'un utilisateur non privilégié à NT AUTHORITY\SYSTEM sur Windows.
Une preuve de concept minimale pour CVE-2026-29923, une vulnérabilité dans le pilote noyau pstrip64.sys (EnTech Taiwan PowerStrip ≤ 3.90.736) qui permet à un processus non privilégié en mode utilisateur d'élever ses privilèges à NT AUTHORITY\SYSTEM.
pstrip64.sys expose un IOCTL (0x80002008) qui accepte une adresse physique fournie par l'utilisateur et la mappe directement dans l'espace d'adressage virtuel du processus appelant en ouvrant \Device\PhysicalMemory et en appelant ZwMapViewOfSection avec le handle du processus courant. Il n'y a aucune vérification de privilèges, aucune validation d'adresse au-delà de ce qu'impose HalTranslateBusAddress, et aucun contrôle d'accès sur le lien symbolique \\.\PSTRIP64.
Le résultat est une primitive de lecture/écriture physique de la mémoire sans restriction depuis un processus non privilégié.
Disposant d'une lecture/écriture physique arbitraire, l'exploit suit quatre étapes.
1. Rechercher les structures EPROCESS
La RAM physique est parcourue par blocs de 2 Mo. Chaque bloc est scanné à la recherche du tag de pool noyau Proc (0x636F7250), qui marque l'allocation de pool contenant la structure _EPROCESS d'un processus. Les candidats potentiels sont validés avec trois heuristiques légères avant que le PID ne soit considéré fiable :
PriorityClass == 0x2 — tous les processus vivants tournent avec une priorité normaleProcessLock == 0x0 — le champ de verrouillage est clair sur un processus stableImageFileName[0] est un caractère ASCII imprimable — la mémoire indésirable satisfait rarement cette condition2. Localiser les deux pointeurs de jeton
Deux cibles sont nécessaires :
Token de notre propre processus dans _EPROCESS_EPROCESS du processus System (PID 4)3. Écraser notre jeton
La page de 4 Ko contenant notre champ Token est mappée puis le champ est écrasé avec la valeur du jeton System. À partir de ce moment, le noyau Windows traite notre processus comme NT AUTHORITY\SYSTEM.
4. Lancer un shell
cmd.exe est lancé via CreateProcessA. Comme les processus enfants héritent du jeton du parent, le shell obtenu s'exécute en tant que SYSTEM.
La fenêtre d'adresses physiques 3 Go – 4 Go est réservée au MMIO sur les systèmes x86. Tenter de mapper des pages dans cette plage provoque le retour de l'erreur 74 (échec de HalTranslateBusAddress) par le pilote. Le scan ignore cette fenêtre et reprend à 0x100000000 pour capturer les structures noyau que Windows place au-dessus de la barre des 4 Go.
Le gestionnaire de mappage du pilote écrit l'adresse virtuelle retournée dans un champ DWORD (LowPart), tronquant l'adresse 64 bits sur 32 bits. Une compilation 64 bits reçoit un pointeur corrompu et plante immédiatement. Compiler en x86.
| Logiciel | Versions |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
Empreinte du pilote (SHA-256) :
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
Les décalages codés en dur ciblent Windows 10 22H2 x64. D'autres builds nécessitent des valeurs mises à jour — utilisez dt nt!_EPROCESS dans WinDbg pour confirmer.
Ouvrez une invite de commandes développeur Visual Studio x86 et exécutez :
cl /EHsc /O2 exploit.c /Fe:poc.exe
Ou définissez la cible de plateforme sur x86 dans Visual Studio et compilez en mode Release. Le binaire ne nécessite aucune dépendance externe en dehors du SDK Windows.
Chargez d'abord pstrip64.sys (nécessite des droits administrateur pour charger le pilote, pas pour exécuter l'exploit lui-même une fois chargé), puis :
poc.exe
Une nouvelle fenêtre cmd.exe s'ouvrira, s'exécutant en tant que NT AUTHORITY\SYSTEM.
Bloquer le chargement du pilote (recommandé)
Détecter l'exploitation en cours
SYSTEMNT AUTHORITY\SYSTEM en dehors d'un événement d'authentification légitimeCe code est publié à des fins éducatives et de recherche défensive uniquement. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de test. L'auteur n'est pas responsable d'une mauvaise utilisation.
| Champ | Décalage |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |