
Chaîne d'exploitation complète pour CVE-2025-7771 dans ThrottleStop.sys, exploitant des IOCTL de lecture/écriture en mémoire physique non validés pour élever les privilèges d'administrateur à SYSTEM sous Windows.
Preuve de concept complète pour le pilote ThrottleStop.sys de TechPowerUp (CVE-2025-7771).
Un pilote noyau signé, toujours chargeable, expose une lecture et une écriture non validées
en mémoire physique via deux IOCTL. Ce dépôt transforme cette primitive en une élévation de
privilèges locale fonctionnelle d'administrateur à SYSTEM et documente une particularité de
nommage de périphérique qui casse la plupart des détections basées sur le chemin ou le nom
de fichier.
Un PoC pour les mêmes IOCTL existait déjà (voir Crédits). Il s'agit ici d'une chaîne d'exploitation complète et indépendante, et non d'une simple démonstration de primitive.
| Champ | Valeur |
|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Version | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| Signataire | TechPowerUp LLC, DigiCert EV Code Signing |
| Empreinte du certificat | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Validité du certificat | 2019-08-10 au 2022-06-15 |
Le certificat a expiré en 2022, mais la signature porte un horodatage de contresignature de confiance, donc Windows le charge toujours. La révocation n'aide que si sa date précède la date de signature, ce qui est rarement le cas pour d'anciens pilotes comme celui-ci.
La ressource de version ne contient ni CompanyName, ni OriginalFilename, ni
InternalName, donc le fichier ne peut pas être attribué à un éditeur à partir de ses
propres métadonnées.
Deux IOCTL lisent et écrivent la mémoire physique sans validation de limites ni d'adresse :
| IOCTL | Opération |
|---|---|
0x80006498 | Lecture physique |
0x8000649C | Écriture physique |
Les deux sont METHOD_BUFFERED, donc il n'y a pas de déréférencement de pointeur
utilisateur ; le défaut est l'absence de validation de l'adresse physique fournie par
l'appelant, et non un pointeur non vérifié.
À signaler : le gestionnaire d'écriture 0x8000649C est déclaré FILE_READ_ACCESS. Un
handle ouvert en lecture seule peut donc toujours émettre des écritures physiques, donc le
masque d'accès déclaré ne correspond pas à ce que fait réellement le gestionnaire.
L'ouverture du périphérique nécessite des droits administrateur, donc il ne s'agit pas en soi d'un franchissement de frontière de privilèges. Ce que cela donne à un attaquant déjà administrateur, c'est une lecture/écriture noyau arbitraire depuis le mode utilisateur, ce qui contourne les protections censées tenir au-dessus d'admin : l'intégrité de code HVCI, PPL, et l'auto-protection EDR/AV. Du classique bring-your-own-vulnerable-driver.
Comme démonstration concrète, le PoC utilise la primitive de lecture/écriture pour voler le jeton SYSTEM et lancer un shell SYSTEM.
CVSS 4.0 : AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, Élevé).
Tout s'exécute depuis le mode utilisateur contre les IOCTL de lecture/écriture physique du pilote. Il n'y a pas de parcours de tables de pages ni de CR3 impliqué ; les deux processus sont localisés en scannant directement la mémoire physique :
ImageFileName est System et UniqueProcessId vaut 4. Le scan est borné aux plages
de RAM peuplées lues depuis la clé de registre
HARDWARE\RESOURCEMAP\...\Physical Memory du firmware, et non une fenêtre devinée, donc
les trous MMIO ne sont jamais touchés et rien au-dessus de la RAM installée n'est manqué.Token (EPROC_TOKEN) depuis l'EPROCESS
localisé.Token. Le jeton est un _EX_FAST_REF, donc les bits de comptage de références faibles
sont masqués par défaut (--mask sélectionne le comportement).cmd.exe ; whoami renvoie NT AUTHORITY\SYSTEM.Les offsets (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, etc.) sont propres à une build
donnée et doivent être confirmés avec dt nt!_EPROCESS sur la version de Windows cible.
Le nom de l'exécutable compte. L'étape 3 localise notre propre processus en faisant
correspondre son ImageFileName en mémoire physique, et ce champ est limité à 15 caractères
avec le scan qui fait correspondre les 8 premiers. Gardez le nom compilé court et distinctif ;
si vous renommez le binaire, restez dans cette limite sinon l'auto-scan ne trouvera pas le
processus.
Le pilote n'utilise pas de nom de périphérique fixe. Il dérive le nom de l'objet périphérique
à partir du nom de service sous lequel il est enregistré ; le nom de fichier sur le disque
n'a aucune importance. Enregistrer le binaire sous le service TRIXX produit \\.\TRIXX peu
importe le nom du fichier sur le disque.
Donc toute détection basée sur \Device\ThrottleStop ou ThrottleStop.sys est trivialement
contournée. La détection doit se baser sur le hash du fichier ou le certificat de signature :
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
La liste DEVICE_NAMES dans le source n'est qu'une sonde pour les installations produit
connues. Passez un nom de périphérique en argument pour cibler un service que vous avez
enregistré vous-même.
| CVE | Pilote |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (ce dépôt) |
Le binaire n'est pas fourni ici. Vérifiez toute copie par rapport au SHA256 ci-dessus. L'échantillon est catalogué dans LOLDrivers.
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
Usage en laboratoire uniquement. Exécutez dans une VM isolée avec un snapshot pour revenir en arrière.
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
Le binaire ne prend aucun argument. Il affiche la carte de mémoire physique, scanne les
EPROCESS SYSTEM et local, échange le jeton, et lance cmd.exe en tant que
NT AUTHORITY\SYSTEM.

Autres travaux publics sur le même pilote, pour comparaison :
Publié pour la recherche défensive et l'ingénierie de détection. La vulnérabilité est déjà publique sous CVE-2025-7771. Tout ici a été testé sur des systèmes appartenant à l'auteur. N'exécutez pas ceci contre des systèmes que vous ne possédez pas ou que vous n'êtes pas autorisé à tester.