
Analisi approfondita della type confusion in CLFS di Windows (CVE-2022-24481) con spiegazione della causa radice, flusso di sfruttamento, dettagli sui gadget del kernel e PoC funzionante per l'escalation locale dei privilegi.
Confusione di tipo
clfs.sys
Poiché la logica di validazione per rgContainers[0] non è rigorosa, dopo aver forgiato rgContainers[0], ClientContext si sovrappone alla struttura ContainerContext. Se i dati falsi vengono accettati, dopo CloseHandle, CClfsLogFcbPhysical::FlushMetadata ripristina i dati di ClientContext.
Dopo aver forgiato rgContainers[0], ClientContext si sovrappone alla struttura ContainerContext. Se i dati falsi vengono accettati, dopo CloseHandle, CClfsLogFcbPhysical::FlushMetadata ripristina i dati di ClientContext. Poiché le strutture si sovrappongono, questo processo modifica ContainerContext->pContainer con i dati forgiato. Infine, quando viene chiamato CClfsBaseFilePersisted::RemoveContainer, viene attivata una chiamata indiretta a una funzione membro, viene eseguito un gadget specifico e ciò porta a un'escalation di privilegi.
createlog crea un nuovo file di log.
Aggiungere una voce Container.
Creare un link simbolico X:\ che punti alla directory corrente.
Cancellare l'intervallo cbSymbolName_start -> cbSymbolName_end.
Impostare cbSymbolName_start su X:\N.
Copiare i dati da ContainerContext_start -> New_cbSymbolName_end in ClientContext.
Aggiornare rgContainers[0] in modo che punti alla nuova posizione ContainerContext_start.
Aggiornare il valore del nuovo ContainerContext->pContainer.
Ricalcolare il checksum.
Individuare l'indirizzo del gadget nella memoria del kernel.
Costruire la tabella virtuale falsa.
Completare la restante configurazione della memoria.
CClfsLogFcbPhysical::Initialize
00000001C0002EDB memorizza i dati di ClientContext.
Dopo CloseHandle, viene eseguito CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
Copia i dati forgiato in ClientContext. Poiché ClientContext si sovrappone a ContainerContext, ContainerContext->pContainer viene sovrascritto con i dati forgiato.
CClfsBaseFilePersisted::RemoveContainer esegue quindi il nostro gadget, causando una scrittura di 16 byte in un indirizzo arbitrario.
https://zhuanlan.zhihu.com/p/645490730
https://github.com/fr4nkxixi/CVE-2022-24481-POC
https://securelist.com/windows-clfs-exploits-ransomware-cve-2022-24521/111580/
https://starmap.dbappsecurity.com.cn/blog/articles/2022/05/10/cve-2022-24481/
https://www.4awl.net/9646.html
win10_21H2_19044.1620
CClfsLogFcbPhysical::Initialize(0x??7c) routine di inizializzazione per l'apertura del file
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Questo codice memorizza la memoria di ClientContext.

Dopo CloseHandle, viene eseguito CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Questo ripristina i dati di ClientContext.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Usare il puntatore alla tabella virtuale forgiato per raggiungere il gadget.

Nota: se il file forgiato non è valido, l'apertura del file fallirà e GetLastError rivelerà il motivo. In tal caso, il flusso dell'exploit non può continuare.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 scrive 16 byte in [rax+8] (XMMWORD, 128 bit).
Dopo l'esecuzione sequenziale, il risultato è la scrittura dei 16 byte di dati da poi(rdx) 0xFFFFFFFF in poi(poi(rcx+0x48)+0x8).
rcx è la posizione del puntatore alla tabella virtuale e questa posizione è sotto il nostro controllo.
https://github.com/uname1able/CVE-2022-24481.git
winver
win10_21H2_19044.1620

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
winver
win11_21H2_22000.593

bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x183