
Windows CLFS の型混乱(CVE-2022-24481)の詳細な分析。根本原因の説明、エクスプロイトの流れ、カーネルガジェットの詳細、そして動作するローカル権限昇格 PoC を提供します。
型の取り違え
clfs.sys
rgContainers[0] の検証ロジックが厳密ではないため、rgContainers[0] を偽装した後、ClientContext が ContainerContext 構造体と重複します。偽のデータが受け入れられると、CloseHandle の後、CClfsLogFcbPhysical::FlushMetadata が ClientContext データを復元します。
rgContainers[0] を偽装した後、ClientContext は ContainerContext 構造体と重複します。偽のデータが受け入れられると、CloseHandle の後、CClfsLogFcbPhysical::FlushMetadata によって ClientContext データが復元されます。構造体が重複しているため、この処理により ContainerContext->pContainer は偽装されたデータに置き換えられます。最後に CClfsBaseFilePersisted::RemoveContainer が呼び出されると、間接メンバー関数呼び出しが発生し、特定のガジェットが実行されて特権昇格につながります。
createlog は新しいログファイルを作成します。
Container エントリを追加します。
現在のディレクトリを指すシンボリックリンク X:\ を作成します。
cbSymbolName_start -> cbSymbolName_end の範囲をクリアします。
cbSymbolName_start を X:\N に設定します。
ContainerContext_start -> New_cbSymbolName_end のデータを ClientContext にコピーします。
rgContainers[0] が新しい ContainerContext_start の場所を指すように更新します。
新しい ContainerContext->pContainer の値を更新します。
チェックサムを再計算します。
カーネルメモリ内でガジェットのアドレスを特定します。
偽の仮想テーブルを構築します。
残りのメモリ設定を実行します。
CClfsLogFcbPhysical::Initialize
00000001C0002EDB は ClientContext データを格納します。
CloseHandle の後、CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata が実行されます。
偽装されたデータが ClientContext にコピーされて戻されます。ClientContext が ContainerContext と重複しているため、ContainerContext->pContainer は偽装されたデータで上書きされます。
その後、CClfsBaseFilePersisted::RemoveContainer が私たちのガジェットを実行し、任意のアドレスへの16バイト書き込みが発生します。
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) ファイルを開くための初期化ルーチン
bp clfs!CClfsLogFcbPhysical::Initialize + 0x45F
このコードは ClientContext メモリを格納します。

CloseHandle の後、CClfsRequest::Cleanup->CClfsLogFcbPhysical::FlushMetadata が実行されます。
bp clfs!CClfsLogFcbPhysical::FlushMetadata + 0x46
これにより ClientContext データが復元されます。

CClfsBaseFilePersisted::RemoveContainer
bp clfs!CClfsBaseFilePersisted::RemoveContainer + 0x10F
偽装した仮想テーブルポインタを使用してガジェットに到達します。

偽装されたファイルが不正な場合、ファイルを開くのに失敗し、GetLastError で理由が明らかになります。その場合、エクスプロイトのフローは続行できません。
CClfsBaseFilePersisted::RemoveContainer

CLFS!ClfsEarlierLsn
nt!SeSetAccessStateGenericMapping

nt!SeSetAccessStateGenericMapping

movdqu xmmword ptr [rax+8], xmm0 は [rax+8] に16バイト(XMMWORD、128ビット)を書き込みます。
逐次実行の結果、poi(rdx) 0xFFFFFFFF の16バイトデータが poi(poi(rcx+0x48)+0x8) に書き込まれます。
rcx は仮想テーブルポインタの位置であり、この位置は私たちの制御下にあります。
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