
Proof-of-concept per CVE-2026-29923, un'escalation di privilegi locali nel driver kernel pstrip64.sys. Dimostra una primitiva di lettura/scrittura della memoria fisica tramite IOCTL per elevare i privilegi da utente non privilegiato a NT AUTHORITY\SYSTEM su Windows.
Una proof-of-concept minimale per CVE-2026-29923, una vulnerabilità nel driver del kernel pstrip64.sys (EnTech Taiwan PowerStrip ≤ 3.90.736) che consente a un processo in modalità utente non privilegiato di elevarsi a NT AUTHORITY\SYSTEM.
pstrip64.sys espone un IOCTL (0x80002008) che accetta un indirizzo fisico fornito dall'utente e lo mappa direttamente nello spazio di indirizzi virtuali del processo chiamante aprendo \Device\PhysicalMemory e chiamando ZwMapViewOfSection con l'handle del processo corrente. Non c'è controllo dei privilegi, nessuna validazione dell'indirizzo oltre a quella imposta da HalTranslateBusAddress, e nessun controllo di accesso sul link simbolico \\.\PSTRIP64.
Il risultato è una primitiva di lettura/scrittura illimitata della memoria fisica da un processo non privilegiato.
Con lettura/scrittura fisica arbitraria disponibile, l'exploit segue quattro passaggi.
1. Scansione per le strutture EPROCESS
La RAM fisica viene esaminata in blocchi da 2 MB. Ogni blocco viene scansionato per il tag del pool del kernel Proc (0x636F7250), che segna l'allocazione del pool che contiene la struttura _EPROCESS di un processo. I candidati trovati vengono validati con tre euristiche leggere prima che il PID sia considerato attendibile:
PriorityClass == 0x2 — tutti i processi attivi girano con priorità NormalProcessLock == 0x0 — il campo di lock è libero su un processo stabileImageFileName[0] è ASCII stampabile — la memoria spazzatura raramente soddisfa questa condizione2. Individuare entrambi i puntatori al token
Sono necessari due obiettivi:
Token del nostro processo all'interno di _EPROCESSPID 4) _EPROCESS3. Sovrascrivere il nostro token
La pagina di 4 KB contenente il campo Token viene mappata e il campo viene sovrascritto con il valore del token di System. Da questo punto in poi, il kernel di Windows tratta il nostro processo come NT AUTHORITY\SYSTEM.
4. Far partire una shell
cmd.exe viene lanciato tramite CreateProcessA. Poiché i processi figli ereditano il token del genitore, la shell risultante gira come SYSTEM.
La finestra degli indirizzi fisici da 3 GB a 4 GB è riservata per MMIO sui sistemi x86. Tentare di mappare pagine in questo intervallo causa al driver di restituire l'errore 74 (fallimento di HalTranslateBusAddress). La scansione salta questa finestra e riprende a 0x100000000 per catturare le strutture del kernel che Windows posiziona sopra i 4 GB.
Il gestore di mappatura del driver scrive l'indirizzo virtuale restituito in un campo DWORD (LowPart), troncando il VA a 64 bit in 32 bit. Una build a 64 bit riceve un puntatore corrotto e crasha immediatamente. Compilare come x86.
| Software | Versioni |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
Hash del driver (SHA-256):
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
Gli offset hardcoded sono per Windows 10 22H2 x64. Altre build richiedono valori aggiornati — usa dt nt!_EPROCESS in WinDbg per confermare.
Apri un prompt dei comandi per sviluppatori di Visual Studio x86 ed esegui:
cl /EHsc /O2 exploit.c /Fe:poc.exe
Oppure imposta la destinazione della piattaforma su x86 in Visual Studio e compila in modalità Release. Il binario non richiede dipendenze esterne oltre al Windows SDK.
Carica prima pstrip64.sys (richiede privilegi di amministratore per caricare il driver, non per eseguire l'exploit una volta caricato), poi:
poc.exe
Si aprirà una nuova finestra di cmd.exe che gira come NT AUTHORITY\SYSTEM.
Bloccare il caricamento del driver (preferito)
Rilevare lo sfruttamento in corso
SYSTEMNT AUTHORITY\SYSTEM al di fuori di un evento di autenticazione legittimoQuesto codice è pubblicato solo per scopi educativi e di ricerca difensiva. Usalo solo su sistemi di tua proprietà o sui quali hai esplicita autorizzazione scritta per testare. L'autore non è responsabile per qualsiasi uso improprio.
| Campo | Offset |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |