
Analisi tecnica dettagliata e exploit proof-of-concept per CVE-2024-30051, un heap-based buffer overflow nella libreria Windows DWM Core Library che consente l'escalation dei privilegi locali al livello Integrity System.
In questo post del blog, spiegherò una vulnerabilità nella libreria DWM Core di Microsoft Windows che ho analizzato quando lo exploit per Core Impact veniva sviluppato. Permette a un utente malintenzionato non privilegiato di eseguire codice come utente DWM con privilegi di Integrità di Sistema (CVE-2024-30051).
Poiché all'epoca non c'erano abbastanza informazioni pubbliche per sviluppare l'exploit, ho dovuto fare molto reverse engineering, quindi qui mostrerò come fare il reverse della patch KB5037771 per Windows 23H2 usando IDA PRO, userò BINDIFF per eseguire un binary diffing tra dwmcore.dll versione 10.0.22621.3447 e versione 10.0.22621.3593, mostrerò come viene prodotto l'heap overflow e poi lo sfrutterò elevando i privilegi, infine creerò un PoC funzionante.
Indice:
[Windows DWM Core Library Elevation of Privilege Vulnerability (CVE-2024-30051) 1](#windows-dwm-core-library-elevation-of-privilege-vulnerability-cve-2024-30051)
[Dettagli della vulnerabilità: 2](#dettagli-della-vulnerabilità)
[Diffing per trovare il bug: 3](#diffing-per-trovare-il-bug)
[Analisi del PoC che sfrutta CVE-2024-30051: 8](#analisi-del-poc-che-sfrutta-cve-2024-30051)
[1) Inizializzazione 8](#inizializzazione)
[2) Hooking 8](#hooking)
[3) Creazione della finestra 16](#creazione-della-finestra)
[4) Creazione del Device 16](#creazione-del-device)
[5) Creazione della Factory 22](#creazione-della-factory)
[6) Creazione di un Device Context 28](#creazione-di-un-device-context)
[7) Creazione di un Composition Device 29](#creazione-di-un-composition-device)
[8) Chiamata della funzione hook3 31](#chiamata-della-funzione-hook3)
[9) Creazione del target per HWND 32](#creazione-del-target-per-hwnd)
[10) Creazione della Surface 33](#creazione-della-surface)
[11) Chiamata a BeginDraw, EndDraw e CreateVisual 34](#chiamata-a-begindraw-enddraw-e-createvisual)
[12) Chiamata a Visual SetContent 36](#chiamata-a-visual-setcontent)
[13) Rilascio degli oggetti 38](#rilascio-degli-oggetti)
[14) Commit del Composition Device 38](#commit-del-composition-device)
[15) Chiamata a hook2 39](#chiamata-a-hook2)
[16) Chiamata a hook 39](#ricorda-che-la-funzione-vulnerabile-può-essere-raggiunta-usando-alcuni-metodi-della-classe-cprimitivegroup.-a-questo-punto-crea-un-heap-poi-hook2-cattura-e-salva-il-corrispondente-heaphandle.)
[17) Chiamata a hook4 41](#chiamata-alla-funzione-hook4)
[18) Esecuzione dell'Heap Spray 49](#esecuzione-dellheappray)
[19) Modifica del chunk base prima dell'invio 51](#modifica-del-chunk-base-prima-dellinvio)
[20) Debug del processo DWM 52](#debug-del-processo-dwm)
[21) Elevazione dei privilegi al livello Integrity System 62](#elevazione-dei-privilegi-al-livello-integrity-system)
Vulnerabilità di Elevazione dei Privilegi nella Libreria DWM Core di Windows CVE-2024-30051
Rilasciata: 14 maggio 2024
CNA assegnante: Microsoft CVE-2024-30051
Impatto: Elevazione dei Privilegi
Gravità massima: Importante
Debolezza:
CWE-122: Buffer Overflow basato su Heap
CVSS: 3.1 7.8 / 7.2
La vulnerabilità esiste a causa di un errore di calcolo della dimensione in una divisione intera all'interno della principale libreria DWM di Windows chiamata dwmcore.dll. Un utente locale può causare un buffer overflow nell'heap nel metodo CCommandBuffer::Initialize in dwmcore.dll e può eseguire codice arbitrario con l'utente DWM con privilegi di Integrità di Sistema. L'exploit eseguirà un Heap Spray nel processo DWM per preparare la memoria e infine produce un Heap Overflow in dwmcore.dll che verrà attivato rilasciando determinate parti dell'heap spray.
Una volta che l'exploit ha successo, il processo DWM caricherà la nostra DLL appositamente creata che esegue il nostro codice o il nostro eseguibile (nel nostro caso un CMD) come utente DWM che ha privilegi di Integrità di Sistema.

Esaminiamo questa vulnerabilità e vediamo come ci permette di eseguire come utente DWM con Livello di Integrità SYSTEM. Si noti che poiché non si tratta di un utente appartenente al gruppo Amministratori, ha alcune restrizioni di privilegi.
La patch per Windows 11 23H2 può essere scaricata da:
https://www.catalog.update.microsoft.com/Search.aspx?q=KB5037771
windows11.0-kb5037771-x64_19a3f100fb8437d059d7ee2b879fe8e48a1bae42.msu
La versione vulnerabile di dwmcore.dll è: 10.0.22621.3447
La versione patchata di dwmcore.dll è: 10.0.22621.3593
Analizzando le funzioni modificate, è chiaro che la versione patchata di CCommandBuffer::Initialize ha molti blocchi aggiunti, rendendola molto diversa dalla versione non patchata.

Dopo aver fatto reverse engineering statico di quella funzione, ci sono due chiamate a CD2DSharedBuffer::GetBufferSize.
La prima chiamata ottiene la dimensione da allocare nel new e la seconda chiamata ottiene la stessa dimensione per il memcpy.

Tutto sembra inizialmente corretto. Tuttavia, prima dell'allocazione, esegue alcune operazioni con la dimensione.

Ottiene buffer_size e buffer_size2 chiamando la stessa funzione CD2DSharedBuffer::GetBufferSize, che restituisce entrambi lo stesso valore. Ma nel new esegue una pre-operazione, una divisione intera di buffer_size per 0x90 e poi moltiplicazione per 0x90, mentre nel memcpy usa il buffer_size2 restituito senza operare su di esso.
Con queste operazioni, ho scoperto che la dimensione finalmente usata nel new e nel memcpy può essere diversa.
buffer_size = buffer_size2 (dimensioni restituite)
size_new = buffer_size / 0x90 x 0x90
size_memcpy = buffer_size2
Ad esempio, se buffer_size è 0x91
buffer_size = buffer_size2 = 0x91
size_new = buffer_size / 0x90 x 0x90 = 0x90
size_memcpy = buffer_size2 = 0x91
Questo esempio dimostra che c'è un heap overflow. Copia più byte di quanti allocati, e la dimensione è controllabile.
Ad esempio, se buffer_size è 0x23f come usato nel POC.