
PoC d'exploit Windows CLFS LPE pour la recherche en sécurité
CVE-2025-60709 est une vulnérabilité d'élévation de privilèges locale (LPE) dans le pilote CLFS.sys (Common Log File System) de Windows. Elle permet à un attaquant disposant d'une exécution de code locale d'élever ses privilèges d'un utilisateur standard à NT AUTHORITY\SYSTEM via un dépassement de tampon (buffer overflow) dans le parsing des conteneurs CLFS, obtenant ainsi une primitive d'écriture arbitraire dans la mémoire du noyau.
Ce dépôt contient deux implémentations :
| Champ | Détail |
|---|---|
| Identifiant CVE | CVE-2025-60709 |
| Type | Élévation de privilèges locale (LPE) |
| Composant | CLFS.sys (pilote Common Log File System) |
| Système cible | Windows 11 24H2 (build 26100.3485+) |
| Architecture | x64 uniquement |
| Vecteur | Dépassement de tampon dans le parsing des conteneurs CLFS |
| Impact | Élévation vers NT AUTHORITY\SYSTEM |
| Prérequis | Exécution de code locale (utilisateur standard) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 KB, 157 líneas) — Exploit C original
├── CVE-2025-60709.go (9.2 KB, 285 líneas) — Port Go (demo educativa)
└── README.txt (4.2 KB, 132 líneas) — Documentación original
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] EVASIÓN DE DEFENSAS
├─ KillETW() → Parchea EtwEventWrite en ntdll con RET (0xC3)
└─ KillAMSI() → Parchea AmsiScanBuffer en amsi.dll con RET (0xC3)
[2] HEAP GROOMING (preparación de memoria)
└─ GroomLookaside()
├─ Crea 4096 archivos: C:\Windows\Temp\groom_00000.blf
├─ Llama CreateLogFile() + AddLogContainer() por cada uno
└─ Agota lookaside lists → garantiza layout de heap predecible
[3] PRIMITIVA DE ESCRITURA ARBITRARIA — ClfsArbWrite(Address, Value)
├─ Construye buffer CLFS malformado (0x102010 bytes)
│ ├─ Firma válida CLFS en +0x00: 0x0201
│ ├─ Sector size shift en +0x14: 2
│ ├─ First client region en +0x28: 0x100
│ ├─ cbRecord OVERSIZED en +0x100: 0xFF00 (64 KB > datos reales)
│ ├─ Marcador shadow zone en +0x9A8: 0x13371337
│ └─ CClfsContainerContext falso en offset (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (dato a escribir)
├─ Calcula checksum CLFS correcto (driver lo valida)
├─ Escribe contenedor malformado → C:\Windows\Temp\evil.blf
├─ Crea log apuntando a evil.blf
├─ Llama ClfsReadRestartArea() → dispara parsing kernel
└─ Driver desborda buffer → escribe Value en Address ✓
[4] ROBO DE TOKEN SYSTEM
├─ Lee EPROCESS del proceso SYSTEM via PsInitialSystemProcess
└─ Extrae token en EPROCESS + EPROCESS_TOKEN (offset 0x4c0)
[5] ESCALACIÓN DE PRIVILEGIOS
└─ ClfsArbWrite(CurrentEprocess + 0x4c0, SystemToken)
└─ Sobreescribe token del proceso actual con token SYSTEM ✓
[6] EJECUCIÓN DE PAYLOAD C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Copia shellcode beacon de 1789 bytes
├─ CreateThread() → ejecución como NT AUTHORITY\SYSTEM
└─ Beacon C2: IPv6 + DoH → fallback Gmail drafts
└─ sRDI + sleep obfuscation + ETW/AMSI ya parcheados
[7] PERSISTENCIA
└─ Sleep(INFINITE) → proceso mantiene token SYSTEM
| Champ | Offset | Description |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Jeton de sécurité du processus |
EPROCESS_PID | 0x440 | Identifiant du processus (PID) |
EPROCESS_LINKS | 0x448 | Liste chaînée des processus actifs |
EPROCESS_NAME | 0x5A8 | Nom du processus (ImageFileName) |
⚠️ Ces offsets varient selon les builds de Windows. Ils nécessitent une mise à jour pour d'autres versions.
Contenedor CLFS legítimo:
[Header 0x100 bytes][Record: cbRecord bytes de datos reales]
Contenedor malformado (evil.blf):
[Header válido][cbRecord=0xFF00 → kernel lee 65,280 bytes]
↓
Kernel overflow → llega a CClfsContainerContext falso
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Driver usa estructura falsa → escribe ValueToWrite en TargetKernelAddress
CVE-2025-60709.c| Fonction | Rôle |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → base de ntoskrnl.exe |
KillETW() | VirtualProtect + surécriture d'EtwEventWrite dans ntdll.dll par 0xC3 (RET) |
KillAMSI() | Charge amsi.dll + surécriture d'AmsiScanBuffer par 0xC3 (RET) |
GroomLookaside() | Crée 4096 journaux CLFS pour épuiser les lookaside lists → tas déterministe |
ClfsArbWrite() | Cœur de l'exploit — primitive d'écriture arbitraire en mémoire noyau |
main() | Orchestre l'attaque : ETW→AMSI→groom→vol de jeton→arb write→beacon |
| Aspect | Version C | Version Go |
|---|---|---|
| Type | Exploit fonctionnel (selon la documentation) | Démo pédagogique uniquement |
| API | Accès direct (ntdll, clfsw32, advapi32) | Wrappers syscall.NewLazyDLL() |
| Checksum CLFS | Algorithme complet | Placeholder simplifié |
| Adresses noyau | Réelles | Placeholder codé en dur (0x123456) |
| Payload C2 | Shellcode de 1789 octets | Octets NOP (0x90) de test |
| Résultat attendu | Élévation vers SYSTEM | Message "Arb write failed (yeah)" |
Version C (nécessite Visual Studio Build Tools + Windows SDK) :
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Version Go (nécessite Go 1.19+ sur Windows x64) :
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go
| Atténuation | Efficacité |
|---|---|
| HVCI (Hypervisor-protected Code Integrity) | Élevée — empêche l'écriture en mémoire noyau |
| kCFI (Kernel Control Flow Integrity) | Élevée — complique les chaînes ROP/JOP |
| CFG (Control Flow Guard) | Moyenne — complique l'exécution de shellcode |
| Windows Defender | Moyenne — détecte les techniques connues |
| Mise à jour Windows | Élevée — le correctif officiel élimine la vulnérabilité |
rule CVE_2025_60709_CLFS_LPE {
meta:
description = "Detects CVE-2025-60709 CLFS LPE exploit"
author = "KONDORDEVSECURITYCORP"
date = "2026-03"
cve = "CVE-2025-60709"
severity = "critical"
strings:
$clfs_sig = { 01 02 00 00 }
$magic = { 37 13 37 13 }
$evil_file = "evil.blf" ascii wide
$groom_file = "groom_" ascii wide
$etw_func = "EtwEventWrite" ascii wide
$amsi_func = "AmsiScanBuffer" ascii wide
$token_off = { C0 04 00 00 } // EPROCESS_TOKEN = 0x4C0
condition:
3 of them
}
| Type | Valeur |
|---|---|
| Fichier malformé | C:\Windows\Temp\evil.blf |
| Journal malformé | \\.\C:\Windows\Temp\evil_log |
| Fichiers de grooming | C:\Windows\Temp\groom_00000.blf … groom_04095.blf |
| Processus | Priorité élevée anormale (REALTIME_PRIORITY_CLASS) |
ARCHIVO: Creación masiva de *.blf en C:\Windows\Temp\ (> 100 en segundos)
ARCHIVO: Creación de C:\Windows\Temp\evil.blf
PROCESO: Proceso en modo REALTIME_PRIORITY + llamadas a ClfsReadRestartArea
MEMORIA: Escritura en PAGE_EXECUTE_READWRITE + CreateThread inmediato
API: VirtualProtect sobre EtwEventWrite o AmsiScanBuffer
KERNEL: Acceso a PsInitialSystemProcess desde user-mode
# Verificar archivos de grooming
Get-ChildItem C:\Windows\Temp -Filter "groom_*.blf" | Measure-Object
# Verificar archivo exploit
Test-Path C:\Windows\Temp\evil.blf
# Verificar integridad de ntdll (ETW patch)
Get-AuthenticodeSignature (Get-Process -Name notepad | Select -First 1).Path
CVE-2025-60709 est une vulnérabilité d'élévation de privilèges locale (LPE) dans le pilote Windows CLFS.sys (Common Log File System). Elle permet à un attaquant disposant d'une exécution de code locale d'élever ses privilèges d'un utilisateur standard à NT AUTHORITY\SYSTEM grâce à un dépassement de tampon (buffer overflow) dans le parsing des conteneurs CLFS, obtenant une primitive d'écriture arbitraire dans la mémoire du noyau.
Ce dépôt contient deux implémentations :
| Champ | Détail |
|---|---|
| Identifiant CVE | CVE-2025-60709 |
| Type | Élévation de privilèges locale (LPE) |
| Composant | CLFS.sys (pilote Common Log File System) |
| Système cible | Windows 11 24H2 (build 26100.3485+) |
| Architecture | x64 uniquement |
| Vecteur | Dépassement de tampon dans le parsing des conteneurs CLFS |
| Impact | Élévation vers NT AUTHORITY\SYSTEM |
| Prérequis | Exécution de code locale (utilisateur standard) |
[1] DEFENSE EVASION
├─ KillETW() → Patch EtwEventWrite in ntdll with RET (0xC3)
└─ KillAMSI() → Patch AmsiScanBuffer in amsi.dll with RET (0xC3)
[2] HEAP GROOMING
└─ GroomLookaside()
├─ Creates 4096 files: C:\Windows\Temp\groom_00000.blf
├─ Calls CreateLogFile() + AddLogContainer() for each
└─ Exhausts lookaside lists → guarantees predictable heap layout
[3] ARBITRARY WRITE PRIMITIVE — ClfsArbWrite(Address, Value)
├─ Constructs malformed CLFS buffer (0x102010 bytes)
│ ├─ Valid CLFS signature at +0x00: 0x0201
│ ├─ Oversized cbRecord at +0x100: 0xFF00 (65,280 bytes)
│ ├─ Shadow zone marker at +0x9A8: 0x13371337
│ └─ Fake CClfsContainerContext at offset (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (data to write)
├─ Computes valid CLFS checksum (driver validates)
├─ Writes malformed container → C:\Windows\Temp\evil.blf
├─ Creates log pointing to evil.blf
├─ Calls ClfsReadRestartArea() → triggers kernel parsing
└─ Driver overflows buffer → writes Value to Address ✓
[4] SYSTEM TOKEN THEFT
├─ Reads SYSTEM process EPROCESS via PsInitialSystemProcess
└─ Extracts token at EPROCESS + 0x4C0
[5] PRIVILEGE ESCALATION
└─ ClfsArbWrite(CurrentEprocess + 0x4C0, SystemToken)
└─ Overwrites current process token with SYSTEM token ✓
[6] C2 PAYLOAD EXECUTION
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Copy 1789-byte shellcode beacon
├─ CreateThread() → runs as NT AUTHORITY\SYSTEM
└─ Beacon: IPv6 + DoH C2 → Gmail drafts fallback
└─ sRDI + sleep obfuscation + ETW/AMSI already patched
[7] PERSISTENCE
└─ Sleep(INFINITE) → process keeps SYSTEM token
| Champ | Offset | Description |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Jeton de sécurité du processus |
EPROCESS_PID | 0x440 | Identifiant du processus |
EPROCESS_LINKS | 0x448 | Liste chaînée des processus actifs |
EPROCESS_NAME | 0x5A8 | Nom du processus (ImageFileName) |
⚠️ Ces offsets varient selon les builds de Windows. Ils doivent être mis à jour pour d'autres versions.
Legitimate CLFS container:
[0x100 byte Header][Record: cbRecord bytes of real data]
Malformed container (evil.blf):
[Valid Header][cbRecord=0xFF00 → kernel reads 65,280 bytes]
↓
Kernel overflows → reaches fake CClfsContainerContext
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Driver uses fake structure → writes ValueToWrite to TargetKernelAddress
CVE-2025-60709.c| Fonction | Rôle |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → base de ntoskrnl.exe |
KillETW() | VirtualProtect + surécriture d'EtwEventWrite dans ntdll.dll par 0xC3 (RET) |
KillAMSI() | Charge amsi.dll + surécriture d'AmsiScanBuffer par 0xC3 (RET) |
GroomLookaside() | Crée 4096 journaux CLFS pour épuiser les lookaside lists → tas déterministe |
ClfsArbWrite() | Cœur de l'exploit — primitive d'écriture arbitraire en mémoire noyau |
main() | Orchestre : ETW→AMSI→groom→vol de jeton→arb write→beacon |
| Aspect | Version C | Version Go |
|---|---|---|
| Type | Exploit fonctionnel (selon la doc) | Démo pédagogique uniquement |
| API | Directes (ntdll, clfsw32, advapi32) | Wrappers syscall.NewLazyDLL() |
| Checksum CLFS | Algorithme complet | Placeholder simplifié |
| Adresses noyau | Réelles | Placeholder codé en dur (0x123456) |
| Payload C2 | Shellcode de 1789 octets | Octets NOP (0x90) |
| Résultat attendu | Élévation vers SYSTEM | Message "Arb write failed (yeah)" |
Version C (nécessite Visual Studio Build Tools + Windows SDK) :
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Version Go (nécessite Go 1.19+ sur Windows x64) :
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go
| Atténuation | Efficacité |
|---|---|
| HVCI (Hypervisor-protected Code Integrity) | Élevée — empêche les écritures en mémoire noyau |
| kCFI (Kernel Control Flow Integrity) | Élevée — bloque les chaînes ROP/JOP |
| CFG (Control Flow Guard) | Moyenne — entrave l'exécution de shellcode |
| Windows Defender | Moyenne — détecte les techniques connues |
| Windows Update | Élevée — le correctif officiel élimine la vulnérabilité |
rule CVE_2025_60709_CLFS_LPE {
meta:
description = "Detects CVE-2025-60709 CLFS LPE exploit"
author = "KONDORDEVSECURITYCORP"
date = "2026-03"
cve = "CVE-2025-60709"
severity = "critical"
strings:
$evil_file = "evil.blf" ascii wide
$groom_file = "groom_" ascii wide
$etw_func = "EtwEventWrite" ascii wide
$amsi_func = "AmsiScanBuffer" ascii wide
$magic = { 37 13 37 13 }
$token_off = { C0 04 00 00 }
condition:
3 of them
}
| Type | Valeur |
|---|---|
| Fichier malformé | C:\Windows\Temp\evil.blf |
| Journal malformé | \\.\C:\Windows\Temp\evil_log |
| Fichiers de grooming | C:\Windows\Temp\groom_00000.blf … groom_04095.blf |
| Processus | Priorité REALTIME_PRIORITY_CLASS anormale |
FILE: Mass creation of *.blf in C:\Windows\Temp\ (> 100 in seconds)
FILE: Creation of C:\Windows\Temp\evil.blf
PROCESS: REALTIME_PRIORITY process + ClfsReadRestartArea calls
MEMORY: Write to PAGE_EXECUTE_READWRITE + immediate CreateThread
API: VirtualProtect over EtwEventWrite or AmsiScanBuffer
KERNEL: PsInitialSystemProcess access from user-mode
# Check grooming files
Get-ChildItem C:\Windows\Temp -Filter "groom_*.blf" | Measure-Object
# Check exploit file
Test-Path C:\Windows\Temp\evil.blf
FR : Ce PoC d'exploit est publié uniquement à des fins de recherche en sécurité, d'analyse de vulnérabilités, de renseignement sur les menaces et de défense. Utiliser ce code contre des systèmes sans autorisation écrite explicite est illégal et peut violer le CFAA, le Computer Misuse Act et les lois équivalentes. Les auteurs déclinent toute responsabilité en cas d'usage abusif.
FR : Ce PoC d'exploit est publié uniquement pour la recherche en sécurité, l'analyse de vulnérabilités, le renseignement sur les menaces et des fins défensives. L'utilisation de ce code contre des systèmes sans autorisation écrite explicite est illégale et peut enfreindre le CFAA, le Computer Misuse Act et la législation équivalente. Les auteurs n'assument aucune responsabilité en cas de mauvaise utilisation.