Report CVE-2023-28218
Panoramica del bug
Errore che porta all'escalation dei privilegi nel kernel di Windows. L'errore si verifica nel driver Windows Ancillary Function Driver for WinSock (AFD.sys). L'errore è stato rilasciato nella patch dell'11/04/2023. Ha un punteggio CVSS:3.1 7.0 / 6.1 ed è stato valutato come Important.
Descrizione del bug
- Tipo di errore:
Double fetch e Integer overflow che portano a pool overflow.
- L'errore si verifica nelle funzioni
Afd!AfdComputeCMSGLength e Afd!AfdCopyCMSGBuffer.

Queste 2 funzioni ricevono entrambe v82 come parametro di input. v82 è un indirizzo controllato dall'usermode. Nella funzione Afd!AfdComputeCMSGLength, questo indirizzo viene referenziato direttamente per ottenere il valore. Successivamente viene calcolata la lunghezza del buffer CMSG per restituirla. Quindi un pool viene allocato in base a questa dimensione. Controllando i due parametri di input a1 e a2 possiamo controllare la dimensione che verrà restituita nel parametro a3.

Nella funzione Afd!AfdCopyCMSGBuffer, l'indirizzo v82 viene referenziato direttamente per ottenere il valore. Dopo alcuni passaggi di controllo, questo valore viene utilizzato come dimensione per l'operazione memmove.

In questa funzione c'è un errore di Integer overflow, che, combinato con il fatto che entrambe le funzioni fanno fetch direttamente da un indirizzo lato usermode, ci permette di modificare il suo valore durante l'esecuzione. Ciò porta alla creazione di una dimensione molto grande per il memmove. Quando si copia verso una zona di memoria non accessibile, si verifica un try-catch. Ma la copia delle aree di memoria precedenti è già avvenuta. In questo modo possiamo copiare con la dimensione che desideriamo.

- Per poter attivare il POC, è necessario prima creare un
socket con il parametro type impostato a SOCK_DGRAM. Successivamente, utilizzare l'handle di questo socket come parametro per chiamare la funzione bind. Infine, creare 2 thread: un thread chiamerà ripetutamente DeviceControl con IOCTL 0x120D3. Impostare l'userbuffer in modo appropriato per bypassare alcuni controlli. L'altro thread modificherà continuamente il valore memorizzato all'indirizzo usermode che funge da parametro per le due funzioni di cui sopra.
Exploitation
- Con questo errore, possiamo overfloware un pool NX non paginato con una dimensione e dati completamente controllabili dall'usermode.
- L'approccio di sfruttamento consiste nello spruzzare (spray) molti oggetti NamedPipe, quindi liberare alcuni oggetti per creare buchi nell'heap. Successivamente, creare un pool dopo aver calcolato la dimensione dalla funzione
Afd!AfdComputeCMSGLength, questa dimensione deve corrispondere a quella dell'oggetto NamedPipe. In questo modo, il pool verrà allocato negli oggetti appena liberati. Utilizzare il bug per overfloware gli oggetti NamedPipe adiacenti, quindi sfruttare i meccanismi di NamedPipe per ottenere la lettura/scrittura della memoria del kernel. Leggere il token del processo di sistema e poi scriverlo nel token del processo corrente.
Intervallo interessato
- Windows Server 2012 R2 (Server Core installation) build precedente a 6.3.9600.20919
- Windows Server 2012 R2 build precedente a 6.3.9600.20919
- Windows Server 2012 (Server Core installation) build precedente a 6.2.9200.24216
- Windows Server 2012 build precedente a 6.2.9200.24216
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) build precedente a 6.1.7601.26466
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 build precedente a 6.1.7601.26466
- Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation) build precedente a 6.0.6003.22015
- Windows Server 2008 for x64-based Systems Service Pack 2 build precedente a 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation) build precedente a 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 build precedente a 6.0.6003.22015
- Windows Server 2016 (Server Core installation) build precedente a 10.0.14393.5850
- Windows Server 2016 build precedente a 10.0.14393.5850
- Windows 10 Version 1607 for x64-based Systems build precedente a 10.0.14393.5850
- Windows 10 Version 1607 for 32-bit Systems build precedente a 10.0.14393.5850
- Windows 10 for x64-based Systems build precedente a 10.0.10240.19869
- Windows 10 for 32-bit Systems build precedente a 10.0.10240.19869
- Windows 10 Version 22H2 for 32-bit Systems build precedente a 10.0.19045.2846
- Windows 10 Version 22H2 for ARM64-based Systems build precedente a 10.0.19045.2846
- Windows 10 Version 22H2 for x64-based Systems build precedente a 10.0.19045.2846
- Windows 11 Version 22H2 for x64-based Systems build precedente a 10.0.22621.1555
- Windows 11 Version 22H2 for ARM64-based Systems build precedente a 10.0.22621.1555
- Windows 10 Version 21H2 for x64-based Systems build precedente a 10.0.19044.2846
- Windows 10 Version 21H2 for ARM64-based Systems build precedente a 10.0.19044.2846
- Windows 10 Version 21H2 for 32-bit Systems build precedente a 10.0.19044.2846
- Windows 11 version 21H2 for ARM64-based Systems build precedente a 10.0.22000.1817
- Windows 11 version 21H2 for x64-based Systems build precedente a 10.0.22000.1817
- Windows 10 Version 20H2 for ARM64-based Systems build precedente a 10.0.19042.2846
- Windows 10 Version 20H2 for 32-bit Systems build precedente a 10.0.19042.2846
- Windows 10 Version 20H2 for x64-based Systems build precedente a 10.0.19042.2846
- Windows Server 2022 (Server Core installation) build precedente a 10.0.20348.1668
- Windows Server 2022 build precedente a 10.0.20348.1668
La patch
- L'errore è stato corretto sostituendo le due vecchie funzioni con due nuove funzioni; alle vecchie funzioni è stato aggiunto il suffisso
_old nel nome. Le nuove funzioni hanno. Nelle due nuove funzioni, sebbene sia ancora presente un double fetch, il valore recuperato viene verificato prima dell'uso. Le funzioni Rtl vengono utilizzate per sostituire le operazioni aritmetiche, prevenendo l'Integer overflow.
Conclusione
- Il bug ha un intervallo interessato molto ampio, minacciando molti sistemi. Tuttavia, il payload di sfruttamento durante l'esecuzione ha ancora una piccola percentuale di fallimento che porta al crash di Windows a causa dello spray dell'heap. Inoltre, dopo aver ottenuto i privilegi del processo cmd a System, l'uscita da questo processo causa anch'essa il crash di Windows. Ciò è dovuto al fatto che durante lo sfruttamento l'oggetto NamedPipe è stato corrotto.
Allegati
- POC minimale

- POC di sfruttamento
