
Tiefgehende Analyse der Windows-CLFS-Typverwechslung (CVE-2022-24481) mit Root-Cause-Erklärung, Exploitation-Ablauf, Kernel-Gadget-Details und funktionierendem lokalen Privilege-Escalation-PoC.
Typverwechslung
clfs.sys
Da die Validierungslogik für rgContainers[0] nicht streng ist, überlappt ClientContext nach dem Fälschen von rgContainers[0] mit der ContainerContext-Struktur. Wenn die gefälschten Daten akzeptiert werden, stellt CClfsLogFcbPhysical::FlushMetadata nach CloseHandle die ClientContext-Daten wieder her.
Nach dem Fälschen von rgContainers[0] überlappt ClientContext mit der ContainerContext-Struktur. Wenn die gefälschten Daten akzeptiert werden, stellt CClfsLogFcbPhysical::FlushMetadata nach CloseHandle die ClientContext-Daten wieder her. Da sich die Strukturen überlappen, setzt dieser Prozess ContainerContext->pContainer auf die gefälschten Daten. Wenn schließlich CClfsBaseFilePersisted::RemoveContainer aufgerufen wird, löst dies einen indirekten Aufruf einer Member-Funktion aus, führt ein bestimmtes Gadget aus und führt zu einer Privilegienausweitung.
createlog erstellt eine neue Logdatei.
Füge einen Container-Eintrag hinzu.
Erstelle einen symbolischen Link X:\, der auf das aktuelle Verzeichnis zeigt.
Leere den Bereich cbSymbolName_start -> cbSymbolName_end.
Setze cbSymbolName_start auf X:\N.
Kopiere die Daten von ContainerContext_start -> New_cbSymbolName_end in ClientContext.
Aktualisiere rgContainers[0], sodass es auf die neue Position ContainerContext_start zeigt.
Aktualisiere den neuen Wert von ContainerContext->pContainer.
Berechne die Prüfsumme neu.
Lokalisiere die Gadget-Adresse im Kernel-Speicher.
Erstelle die gefälschte virtuelle Tabelle.
Führe die restliche Speichereinrichtung durch.
CClfsLogFcbPhysical::Initialize
00000001C0002EDB speichert die ClientContext-Daten.
Nach CloseHandle wird CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata ausgeführt.
Es kopiert die gefälschten Daten zurück in ClientContext. Da sich ClientContext mit ContainerContext überlappt, wird ContainerContext->pContainer mit den gefälschten Daten überschrieben.
CClfsBaseFilePersisted::RemoveContainer führt dann unser Gadget aus, was zu einem 16-Byte-Schreibvorgang an eine beliebige Adresse führt.
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) Initialisierungsroutine zum Öffnen der Datei
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
Dieser Code speichert den Inhalt des ClientContext-Speichers.

Nach CloseHandle wird CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata ausgeführt.
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
Dies stellt die ClientContext-Daten wieder her.

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
Verwende den gefälschten Virtual-Table-Zeiger, um zum Gadget zu gelangen.

Hinweis: Wenn die gefälschte Datei ungültig ist, schlägt das Öffnen der Datei fehl und GetLastError zeigt den Grund. In diesem Fall kann der Exploit-Ablauf nicht fortgesetzt werden.
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 schreibt 16 Bytes an [rax+8] (XMMWORD, 128 Bits).
Nach sequenzieller Ausführung werden die 16-Byte-Daten von poi(rdx) 0xFFFFFFFF in poi(poi(rcx+0x48)+0x8) geschrieben.
rcx ist der Ort des Virtual-Table-Zeigers, und dieser Ort befindet sich unter unserer Kontrolle.
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