
Ricerca di tesi magistrale su CVE-2024-30051 (Overflow dell'heap di DWM di Windows). Include un exploit ad alta affidabilità con ottimizzazione automatizzata dell'heap spray, logging in tempo reale e analisi empirica del tasso di successo. Componente del portfolio che dimostra exploit binario avanzato di Windows, manipolazione del layout dell'heap e LPE tramite Desktop Window Manager.
Buffer Overflow basato su Heap in Windows Desktop Window Manager (
dwmcore.dll)
Escalation dei Privilegi Locali → Livello di Integrità SYSTEM tramite processo DWM
Target di build: Windows 11 22H2 (10.0.22621.3447) · Patch: KB5037771
Questo repository contiene la mia ricerca per la Tesi Magistrale su CVE-2024-30051, una vulnerabilità di Elevazione dei Privilegi di gravità Alta (CVSS 7.8) nella libreria principale del Windows Desktop Window Manager (dwmcore.dll).
La vulnerabilità origina da un errore di calcolo nella divisione intera in CCommandBuffer::Initialize. La dimensione usata per new() e quella usata per memcpy() divergono a causa di questo errore, producendo un heap overflow di 0x8F byte. Un exploit riuscito fa sì che dwm.exe carichi una DLL controllata dall'attaccante, eseguendo codice arbitrario sotto l'account window manager\dwm-1 con Livello di Integrità SYSTEM.
| Aspect | Description |
|---|---|
| Patch diffing | Analisi BinDiff completa che identifica CCommandBuffer::Initialize come esatto locus della vulnerabilità (punteggio di similarità 0.32 vs globale 0.98 su 14.062 funzioni confrontate) |
| WinDbg dynamic analysis | Verifica passo-passo di tutti e 4 gli hook, sovrascrittura del campo size e costruzione del payload |
| Empirical heap spray analysis | 50 sessioni controllate su due configurazioni di RAM (8.192 MB e 4.096 MB) con test statistici formali |
| Statistical findings | Mann-Whitney U (p = 0.031) e test t di Welch (p = 0.011) confermano l'effetto RAM; medie osservate 12.9–19× migliori della previsione teorica di ~64 tentativi |
| Payload DLL path centralized | Percorso hardcoded estratto nella costante del preprocessore #define PAYLOAD_DLL_PATH |
| Session logging | Registro completo con timestamp per ogni sessione scritto in %TEMP%\cve_30051_log.txt |
| Academic documentation | Causa principale, analisi heap spray di 50 sessioni e cronologia CVE |
CVE-2024-30051-Masters-Thesis/
├── README.md
├── LICENSE
├── setup.bat # Copia s11.dll nella posizione richiesta
│
├── exploit/
│ ├── C21.sln # Soluzione Visual Studio 2022
│ ├── exploit_src/
│ │ ├── c26f.vcxproj
│ │ ├── c26f.filters
│ │ └── main.cpp # Exploit — heap spray + hooking + overflow
│ └── payload/
│ ├── payload.vcxproj
│ ├── payload.vcxproj.filters
│ ├── dllmain.cpp # Payload DLL — genera shell SYSTEM + cleanup
│ ├── framework.h
│ ├── pch.h
│ └── pch.cpp
│
└── docs/
├── screenshots/ # Patch diffing, WinDbg e catture forensi
└── analysis/
├── 01-root-cause.md # Bug di divisione intera in CCommandBuffer::Initialize
├── 02-heap-spray.md # Dati empirici di 50 sessioni e risultati statistici
└── 03-timeline.md # Scoperta, divulgazione e cronologia della patch
Apri C21.sln in Visual Studio 2022. Compila il progetto payload in Release x64.
Esegui setup.bat dalla radice del repository. Copia s11.dll in C:\Users\Public\Documents\s11.dll (il percorso definito da PAYLOAD_DLL_PATH).
⚠️ La DLL deve essere in questo esatto percorso prima di eseguire
C26f.exe. Posizionarla accanto all'eseguibile non funzionerà.
Compila il progetto C26f in Release x64.
x64\Release\C26f.exe
Esegui da un CMD standard (non elevato). L'exploit riprova automaticamente fino a 10 volte. In caso di successo, dwm.exe carica s11.dll e genera un CMD con Livello di Integrità SYSTEM. Un registro di sessione viene scritto in %TEMP%\cve_30051_log.txt.
#define MAX_ATTEMPTS 10 // Max auto-retry attempts per session
#define SPRAY_STEP 0x10 // Hole spacing index (1024 holes)
#define SPRAY_RANGE_START 0x3000 // Spray range start index
#define SPRAY_RANGE_END 0x7000 // Spray range end index
#define SLEEP_POST_SPRAY 0xC8 // ms wait after spray (200ms)
#define SLEEP_POST_HOLES 0xC8 // ms wait after freeing holes (200ms)
#define PAYLOAD_DLL_PATH "C:\\Users\\Public\\Documents\\s11.dll"
In CCommandBuffer::Initialize (dwmcore.dll 10.0.22621.3447), CD2DSharedBuffer::GetBufferSize viene chiamato due volte. La dimensione passata a new() subisce una divisione intera per 0x90 prima della moltiplicazione, mentre memcpy() usa il valore grezzo:
buffer_size = GetBufferSize() → e.g. 0x23F
size_new = (0x23F / 0x90) * 0x90 = 0x1B0 ← allocated
size_memcpy = 0x23F ← copied
overflow = 0x23F - 0x1B0 = 0x8F bytes
BinDiff comparison between build 10.0.22621.3447 (vulnerable) and 10.0.22621.3593 (patched):
| Metric | Value |
|---|---|
| Similarità globale | 0.98 |
| Confidenza | 0.99 |
| Funzioni corrispondenti | 14.062 (99.1%) |
Similarità di CCommandBuffer::Initialize | 0.32 |
| Blocchi di base — versione vulnerabile | 4 |
| Blocchi di base — versione patchata | 20 (16 blocchi di validazione aggiunti) |
Il punteggio anomalo di 0.32 contro una similarità globale di 0.98 è la firma diretta del locus della vulnerabilità.
1. Hook RtlCreateHeap → cattura l'handle dell'heap di dwmcore
2. Hook RtlAllocateHeap → cattura l'indirizzo del chunk base
3. Hook NtDCompositionCreateChannel → cattura MappedAddress (regione di memoria condivisa)
4. Hook NtDCompositionCommitChannel → sovrascrive il campo size (0x120 → 0x23F)
inserisce comandi batch aggiuntivi
5. Heap spray di 0x10000 oggetti CHolographicInteropTexture (size=0x1B0)
6. Libera buchi ogni 0x10 indici → crea spazi vuoti per l'atterraggio dell'overflow
7. Scrive il payload nel buffer di overflow → KCBTable+0x388 + LoadLibraryA + percorso DLL
8. Rilascia tutti gli oggetti spray → innesca overflow → LoadLibraryA("s11.dll")
9. dwm.exe carica la DLL del payload → genera CMD come integrità SYSTEM
La RAM disponibile influenza il numero di tentativi necessari per un heap spray riuscito?
Due blocchi di 25 sessioni ciascuno. Protocollo per sessione: ripristina snapshot pulito post-avvio → attesa 100 secondi di stabilizzazione → avvia exploit → registra il tentativo riuscito.
| Blocco | RAM | Sessioni | Successi | Fallimenti |
|---|---|---|---|---|
| A | 8.192 MB | 25 | 24 | 1 |
| B | 4.096 MB | 25 | 24 | 1 |
| Blocco | RAM | Media tentativi | Deviazione std | IC 95% | Fattore vs teoria (64) |
|---|---|---|---|---|---|
| A | 8.192 MB | 3.375 | 1.135 | [2.896; 3.854] | ≈ 19× più veloce |
| B | 4.096 MB | 4.958 | 2.645 | [3.841; 6.076] | ≈ 12.9× più veloce |
| Test | Statistica | p-value | Conclusione |
|---|---|---|---|
| Mann-Whitney U | U = 184.0 | p = 0.031 | Rifiuta H₀ |
| Test t di Welch | t(23) = −2.695 | p = 0.011 | Rifiuta H₀ |
base = heap_base + 0x720 conferma che il layout dell'heap post-avvio riproducibile è il principale motore del determinismo — non la densità dei buchi.Dati grezzi completi, formato del registro di sessione e osservazioni sull'heap deterministico sono documentati in docs/analysis/02-heap-spray.md.
=====================================================
CVE-2024-30051 - Windows DWM Heap Overflow EoP
CWE-122 | CVSS 7.8 | Elevation of Privilege
=====================================================
Researched and reproduced by : devianntsec
Original PoC by : Ricardo Narvaja (Fortra)
Target : Windows 11 22H2 (22621.3447)
=====================================================
[*] Current user:
window manager\dwm-1
[*] Mandatory Integrity Level:
Mandatory Label\System Mandatory Level S-1-16-16384
[*] Enabled privileges:
SeImpersonatePrivilege Enabled
=====================================================
Shell running under DWM process - SYSTEM level
=====================================================
Gli artefatti (s11.dll e lo script .bat) vengono automaticamente eliminati dopo 5 secondi tramite un processo di pulizia differita.
| Artefatto | Posizione | Persistenza | Strumento di rilevamento |
|---|---|---|---|
cmd.exe figlio di dwm.exe | Log eventi di sicurezza | Sì (se il controllo processi è attivo) | Event ID 4688 |
Processo esterno che accede a dwm.exe | Sysmon | Sì | Sysmon Event ID 10 |
Crash di dwm.exe su tentativi falliti | Log eventi applicazione | Sì | Event ID 1000 |
DLL payload s11.dll sul disco | C:\Users\Public\Documents\ | Solo primi ~5 secondi | Monitoraggio SHA-256 |
| Documento | Descrizione |
|---|---|
| Root Cause Analysis | Bug di divisione intera in CCommandBuffer::Initialize, metodologia di patch diffing |
| Heap Spray Analysis | Dati empirici di 50 sessioni, dati grezzi delle sessioni, test statistici |
| CVE Timeline | Scoperta, divulgazione e cronologia della patch |
Questa ricerca fa parte della mia Tesi Magistrale in Cybersecurity (UCAM — Campus Internacional de Ciberseguridad), analizzando vulnerabilità N-Day in più ambienti.
Questo CVE rappresenta il vettore applicazione desktop Windows all'interno della tesi, dimostrando:
Keywords: EoP · Heap Overflow · DirectComposition · DWM · Patch Diffing ·
BinDiff · WinDbg · Heap Spray · Empirical Analysis · CVE-2024-30051
Annais Molina (devianntsec) — Studente Magistrale in Cybersecurity
Licenza MIT — vedi LICENSE
Questo repository è fornito solo per scopi educativi e di ricerca sulla sicurezza, come parte di una Tesi Magistrale accademica. Tutti i test sono stati eseguiti su macchine virtuali isolate senza esposizione di rete. Utilizzare solo su sistemi di tua proprietà o per i quali hai esplicita autorizzazione scritta a testare. L'uso non autorizzato contro sistemi è illegale e può comportare azioni penali.