
Exploit de preuve de concept pour CVE-2025-62215, une vulnérabilité Use-After-Free du noyau Windows dans SepTokenSidSharingEnabled. Inclut un pilote noyau et un exploit en mode utilisateur pour l'analyse de conditions de concurrence.
Une preuve de concept de vulnérabilité Use-After-Free qui se produit dans le chemin d'optimisation SepTokenSidSharingEnabled du noyau Windows.
NtDuplicateToken incrémente le RefCount du bloc de valeurs SID de 1→2,
un thread noyau concurrent libère le bloc via ExFreePoolWithTag.SepDereferenceSidValuesBlock accède au bloc libéré → UAF / Double Free.[User] IOCTL_REPLACE_SID_BLOCK → Placer un bloc indépendant (RefCount=1) à TOKEN+0x468
[User] IOCTL_TRIGGER_FREE → Lancer un thread noyau (polling jusqu'à RefCount==2)
[User] NtDuplicateToken → Incrémente en interne RefCount 1→2
[Kernel Thread] RefCount==2 détecté → ExFreePoolWithTag(pBlock) ← Point UAF
| Chemin | Description |
|---|---|
exploit/exploitWithDriv/exploitWithDriv.cpp | Exploit en mode utilisateur (application console) |
tokendriv/tokendrv/tokendrv/tokendrv.cpp | Pilote noyau (fournit une interface IOCTL) |
tokendriv.sys — Pilote noyautokendriv/tokendrv/tokendrv.slnxtokendriv/tokendrv/x64/Release/tokendriv.sys.sys dans la VMAprès installation du WDK, vérifier : Propriétés du projet → Paramètres du pilote → Version du système d'exploitation cible
exploitWithDriv.exe — Exploit en mode utilisateurexploit/exploitWithDriv.slnxexploit/x64/Release/exploitWithDriv.exeSepTokenSidSharingEnabled)test / 1234 (compte local, aucun droit administrateur requis)sc create tokendriv type= kernel binpath= "C:\chemin\vers\tokendrv.sys"
sc start tokendriv
Vérifier que le pilote est en cours d'exécution :
sc query tokendriv
Le statut doit être RUNNING.
exploitWithDriv.exe
Déroulement de l'exécution :
FullNumberOfPhysicalPages (doit être ≤ 0x83400)LogonUser("test", ".", "1234") → acquérir hSourceREPLACE → TRIGGER → NtDuplicateToken → Sleep(1)0: kd> !process 0 0 exploitWithDriv.exe
Exemple de sortie :
PROCESS ffffa88f5e61e080
SessionId: 1 Cid: 1234 Peb: ... ParentCid: ...
Image: exploitWithDriv.exe
ffffa88f5e61e080 est l'adresse EPROCESS.
Les adresses ci-dessous peuvent varier selon l'environnement — confirmer avec les symboles du noyau réels.
A. Incrémentation du RefCount du bloc SID (début de la fenêtre de course)
0: kd> bp fffff800`725c6114 ".if (@$proc == 0xffffa88f5e61e080) { .echo A_REFCNT_INCR; dq poi(@rsi+0x468)+8 L1; gc } .else { gc }"
TOKEN+0x4681 → 2 est la fenêtre de courseB. Point de lecture UAF
0: kd> bp fffff800`726f51fb ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_READ; r rax,rdx; gc } .else { gc }"
rax, rdxC. Point d'écriture UAF
0: kd> bp fffff800`726f5208 ".if (@$proc == 0xffffa88f5e61e080) { .echo REAL_UAF_WRITE; r rcx,rdx,rax; gc } .else { gc }"
rcx, rdx, rax pour corruptionEntrée NtDuplicateToken
└─ SeTokenCanImpersonate
└─ RefCount du bloc SID : 1 → 2 ← bp A (A_REFCNT_INCR)
← thread noyau : ExFreePoolWithTag(pBlock)
└─ SepDereferenceSidValuesBlock
└─ déréférencement pBlock (lecture) ← bp B (REAL_UAF_READ)
└─ déréférencement pBlock (écriture) ← bp C (REAL_UAF_WRITE)
2 immédiatement après l'affichage de A_REFCNT_INCR, la fenêtre de course a été entrée avec succèsREAL_UAF_READ / REAL_UAF_WRITE apparaissent, la UAF réelle est confirmée'kcoB' : !pool <addr> ou !poolused| Structure | Décalage | Champ |
|---|---|---|
_TOKEN | +0x468 | SepSidValues (pointeur du bloc de valeurs SID) |
| Bloc de valeurs SID | +0x000 | Length (ULONG) |
| Bloc de valeurs SID | +0x008 | ReferenceCount (LONGLONG) |
sc stop tokendriv
sc delete tokendriv
Preuve de concept de vulnérabilité Use-After-Free se produisant dans le chemin d'optimisation SepTokenSidSharingEnabled du noyau Windows.
NtDuplicateToken incrémente le RefCount du bloc de valeurs SID de 1→2,
un thread noyau concurrent libère ce bloc via ExFreePoolWithTag.SepDereferenceSidValuesBlock accède à nouveau au bloc libéré → UAF / Double Free.[User] IOCTL_REPLACE_SID_BLOCK → Placer un bloc indépendant (RefCount=1) à TOKEN+0x468
[User] IOCTL_TRIGGER_FREE → Lancer un thread noyau (attente polling RefCount==2)
[User] NtDuplicateToken → Incrémente en interne RefCount 1→2
[Kernel Thread] RefCount==2 détecté → ExFreePoolWithTag(pBlock) ← Point UAF
| Chemin | Description |
|---|---|
exploit/exploitWithDriv/exploitWithDriv.cpp | Exploit en mode utilisateur (application console) |
tokendriv/tokendrv/tokendrv/tokendrv.cpp | Pilote noyau (fournit une interface IOCTL) |
tokendriv.sys — Pilote noyautokendriv/tokendrv/tokendrv.slnxtokendriv/tokendrv/x64/Release/tokendrv.sys.sys dans la VMAprès installation du WDK, vérifier dans Propriétés du projet → Paramètres du pilote → Version du système d'exploitation cible
exploitWithDriv.exe — Exploit en mode utilisateurexploit/exploitWithDriv.slnxexploit/x64/Release/exploitWithDriv.exe