
ThrottleStop.sys Arbitrary Physical Memory R/W (Lecture/Écriture arbitraire de mémoire physique)
Preuve de concept complète pour le pilote ThrottleStop.sys de TechPowerUp (CVE-2025-7771).
Un pilote noyau signé, encore chargeable, expose des lectures et écritures de mémoire
physique non validées via deux IOCTL. Ce dépôt transforme cette primitive en une
élévation de privilèges locale administrateur-vers-SYSTEM fonctionnelle et documente une
particularité de nommage de périphérique qui contourne la plupart des détections basées
sur les chemins et les noms de fichiers.
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, pas 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 to 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 l'heure 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; le fichier ne peut donc pas être attribué à un éditeur à partir de ses
propres métadonnées.
Deux IOCTL lisent et écrivent de la mémoire physique sans validation des limites ni de l'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, pas un pointeur non vérifié.
À noter : le gestionnaire d'écriture 0x8000649C est déclaré FILE_READ_ACCESS. Un
handle ouvert en lecture seule peut quand même é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, ce n'est donc pas en soi un franchissement de frontière de privilèges. Ce que cela donne à un attaquant déjà administrateur, c'est une lecture/écriture arbitraire du noyau depuis le mode utilisateur, ce qui neutralise les protections censées s'appliquer au-dessus d'administrateur : l'intégrité du code HVCI, la PPL et l'auto-protection EDR/AV. Un cas classique de « bring-your-own-vulnerable-driver ».
En guise de démonstration concrète, le PoC utilise la primitive R/W 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 en mode utilisateur via les IOCTL R/W physiques du pilote. Il n'y a pas de parcours de tables de pages ni de CR3; les deux processus sont localisés en scannant directement la mémoire physique :
ImageFileName vaut System et UniqueProcessId vaut 4. Le scan est limité aux
plages de RAM peuplées lues depuis la clé de registre
HARDWARE\RESOURCEMAP\...\Physical Memory du firmware, pas une fenêtre devinée; les
trous MMIO ne sont donc 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 de
poids faible sont masqués par défaut (--mask sélectionne le comportement).cmd.exe; whoami renvoie .Les offsets (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, etc.) correspondent à un build
spécifique et doivent être vérifiés avec dt nt!_EPROCESS sur la version 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 plafonné à 15
caractères, le scan ne faisant correspondre que les 8 premiers. Gardez un nom compilé
court et distinctif; si vous renommez le binaire, restez dans cette limite ou
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 du nom du service sous lequel il est enregistré; le nom du fichier sur
disque est sans importance. Enregistrer le binaire sous le service TRIXX produit
\\.\TRIXX, quel que soit le nom du fichier sur disque.
Ainsi, toute détection basée sur \Device\ThrottleStop ou ThrottleStop.sys est
trivialement contournée. La détection doit se baser sur l'empreinte du fichier ou sur 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 connues
du produit. 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 répertorié 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 instantané pour pouvoir 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 la mémoire physique, recherche
le SYSTEM et l'EPROCESS local, échange le jeton et lance cmd.exe avec les droits
NT AUTHORITY\SYSTEM.

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