
Catena di exploit completa per CVE-2025-7771 in ThrottleStop.sys, che sfrutta IOCTL di lettura/scrittura non validati sulla memoria fisica per escalare da amministratore a SYSTEM su Windows.
Proof-of-concept completo per il driver ThrottleStop.sys di TechPowerUp (CVE-2025-7771).
Un driver kernel firmato e ancora caricabile espone lettura e scrittura di memoria fisica
non validate attraverso due IOCTL. Questo repository trasforma quella primitiva in una
scalata di privilegi locale da amministratore a SYSTEM funzionante e documenta una stranezza
nella denominazione del dispositivo che aggira la maggior parte dei rilevamenti basati su
percorso e nome file.
Esisteva già un PoC per gli stessi IOCTL (vedi Crediti). Questa è una catena di exploit completa e indipendente, non una semplice dimostrazione della primitiva.
| Campo | Valore |
|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Versione | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| Firmatario | TechPowerUp LLC, DigiCert EV Code Signing |
| Thumbprint certificato | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Validità certificato | 2019-08-10 to 2022-06-15 |
Il certificato è scaduto nel 2022, ma la firma porta un timestamp di controfirma attendibile, quindi Windows lo carica comunque. La revoca aiuta solo se la sua data precede quella della firma, cosa che raramente accade per driver vecchi come questo.
La risorsa di versione non ha CompanyName, OriginalFilename o InternalName, quindi il
file non può essere attribuito a un fornitore dai suoi stessi metadati.
Due IOCTL leggono e scrivono memoria fisica senza validazione dei limiti o degli indirizzi:
| IOCTL | Operazione |
|---|---|
0x80006498 | Lettura fisica |
0x8000649C | Scrittura fisica |
Entrambi sono METHOD_BUFFERED, quindi non c'è dereferenziazione di puntatori utente; il
difetto è la mancata validazione dell'indirizzo fisico fornito dal chiamante, non un
puntatore non controllato.
Da segnalare: l'handler di scrittura 0x8000649C è dichiarato FILE_READ_ACCESS. Un handle
aperto in sola lettura può comunque emettere scritture fisiche, quindi la maschera di accesso
dichiarata non corrisponde a ciò che l'handler fa effettivamente.
Aprire il dispositivo richiede privilegi di amministratore, quindi non si tratta di un attraversamento del confine di privilegio di per sé. Ciò che offre a un attaccante già amministratore è lettura/scrittura arbitraria del kernel dalla modalità utente, che sconfigge le protezioni che dovrebbero reggere al di sopra dell'amministratore: integrità del codice HVCI, PPL e auto-protezione di EDR/AV. Classico bring-your-own-vulnerable-driver.
Come dimostrazione concreta, il PoC usa la primitiva di R/W per rubare il token di SYSTEM e generare una 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, High).
Tutto viene eseguito dalla modalità utente contro gli IOCTL di R/W fisica del driver. Non c'è page-table walking e nessun CR3 coinvolto; entrambi i processi vengono individuati scansionando direttamente la memoria fisica:
ImageFileName sia
System e il cui UniqueProcessId sia 4. La scansione è limitata agli intervalli di RAM
popolata letti dalla chiave di registro HARDWARE\RESOURCEMAP\...\Physical Memory del firmware,
non una finestra ipotizzata, quindi i buchi MMIO non vengono mai toccati e nulla al di sopra
della RAM installata viene perso.Token (EPROC_TOKEN) dall'EPROCESS individuato.Token. Il token
è un _EX_FAST_REF, quindi i bit bassi del reference-count sono mascherati per impostazione
predefinita (--mask seleziona il comportamento).cmd.exe; whoami restituisce NT AUTHORITY\SYSTEM.Gli offset (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, ecc.) sono per una build specifica e
devono essere confermati con dt nt!_EPROCESS sulla versione di Windows di destinazione.
Il nome dell'eseguibile è importante. Il passo 3 individua il nostro processo confrontando il suo
ImageFileName in memoria fisica, e quel campo è limitato a 15 caratteri con la scansione che
confronta i primi 8. Mantieni il nome compilato breve e distintivo; se rinomini il binario,
rimani entro quel limite o la scansione automatica non troverà il processo.
Il driver non usa un nome di dispositivo fisso. Deriva il nome dell'oggetto dispositivo dal
nome del servizio con cui è registrato; il nome del file su disco è irrilevante. Registrare
il binario sotto il servizio TRIXX produce \\.\TRIXX indipendentemente da come si chiami il
file su disco.
Quindi qualsiasi rilevamento basato su \Device\ThrottleStop o ThrottleStop.sys è banalmente
aggirabile. Il rilevamento deve basarsi sull'hash del file o sul certificato di firma:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
La lista DEVICE_NAMES nel sorgente è solo una sonda per installazioni note del prodotto. Passa
un nome di dispositivo come argomento per prendere di mira un servizio che hai registrato tu stesso.
| CVE | Driver |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (questo repo) |
Il binario non è distribuito qui. Verifica qualsiasi copia rispetto allo SHA256 sopra. Il campione è catalogato in LOLDrivers.
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
Solo per uso in laboratorio. Esegui all'interno di una VM isolata con uno snapshot a cui ripristinare.
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>
Il binario non accetta argomenti. Stampa la mappa della memoria fisica, cerca l'EPROCESS di SYSTEM
e quello locale, scambia il token e genera cmd.exe in esecuzione come
NT AUTHORITY\SYSTEM.

Altri lavori pubblici sullo stesso driver, per confronto:
Pubblicato per ricerca difensiva e ingegneria del rilevamento. La vulnerabilità è già pubblica come CVE-2025-7771. Tutto qui è stato testato su sistemi di proprietà dell'autore. Non eseguire questo su sistemi che non possiedi o che non sei autorizzato a testare.