
CVE-2024-6768 の概念実証エクスプロイト。細工された .BLF ファイルを介して Windows CLFS.sys ドライバーの脆弱性を悪用し、BSoD を引き起こします。ソースコードと技術分析を含みます。
CVE-2024-6768 は、Windows の Common Log File System (CLFS.sys) ドライバにおける脆弱性であり、入力データで指定された数量の不適切な検証が原因で発生します。この欠陥により回復不能な不整合が生じ、KeBugCheckEx 関数が呼び出され、結果としてブルースクリーンオブデス (BSoD) が発生します。この問題は、すべての更新プログラムが適用された状態でも、Windows 10 および Windows 11、Windows Server 2016、Server 2019、Server 2022 のすべてのバージョンに影響します。概念実証 (PoC) により、.BLF ファイル内で特定の値を細工することで、特権のないユーザーがシステムクラッシュを引き起こせることを示しています。潜在的な問題には、システムの不安定化やサービス拒否が含まれ、悪意のあるユーザーがこの脆弱性を悪用して影響を受けるシステムを繰り返しクラッシュさせ、運用を妨害し、データ損失を引き起こす可能性があります。
Common Log File System (CLFS) に関する過去 2 回の研究では、両方のケースで RCE を達成できました (興味があれば、CLFS CVE-2023-28252 と CLFS CVE-2022-37969 に関する記事があります)。しかし、作業中の PoC でいくつかの値を変更したところ、ターゲットシステム上で BSoD がトリガーされるのを観察しました。そのため、この問題を報告することにしました。このドキュメントは、BSoD を理解し、その再現方法についてのガイダンスを提供します。
この脆弱性は、入力で指定された数量の不適切な検証 (CWE-1284) によって発生し、CLFS.sys ドライバに回復不能な不整合を引き起こし、KeBugCheckEx 関数 の呼び出しを強制します。これにより、特権のないユーザーが Windows で BSoD を発生させることができます。このドキュメントでは、例として CLFS.sys バージョン 10.0.19041.3324 を使用していますが、この問題は、すべての更新プログラムが適用された Windows 10 および Windows 11 の最新バージョンまでのすべてのバージョンに影響します。
Base Score: CVSS 4.0: 6.8 Medium
Vector String CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Attack Vector (AV): Local
Attack Complexity (AC): Low
Attack Requirements (AT): None
Privileges Required (PR): Low
User Interaction (UI): None
Confidentiality (VC): None
Integrity (VI): None
Availability (VA): High
Confidentiality (SC): None
Integrity (SI): None
Availability (SA): None
システムが回復不能な状態を検出すると、KeBugCheckEx 関数を呼び出し、Microsoft がこの記事で説明しているように BSoD が発生します: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex。

CClfsLogFcbPhysical::FlushLog+6F2 は、KeBugCheckEx への呼び出しが行われる CLFS.sys バージョン 10.0.19041.3324 のアドレスです:
CClfsLogFcbPhysical::FlushLog+6D5
CClfsLogFcbPhysical::FlushLog+6D5 loc_FFFFF8062EED4F35: ; BugCheckParameter2
CClfsLogFcbPhysical::FlushLog+6D5 mov r8d, eax
CClfsLogFcbPhysical::FlushLog+6D8 and [rsp+0A8h+Timeout], 0
CClfsLogFcbPhysical::FlushLog+6DE mov r9, rbx ; BugCheckParameter3
CClfsLogFcbPhysical::FlushLog+6E1 mov edx, 3Ah ; ':' ; BugCheckParameter1
CClfsLogFcbPhysical::FlushLog+6E6 mov ecx, 0C1F5h ; BugCheckCode
CClfsLogFcbPhysical::FlushLog+6EB mov r10, cs:__imp_KeBugCheckEx
CClfsLogFcbPhysical::FlushLog+6F2 call near ptr nt_KeBugCheckEx
分析を始めるには、脆弱な Common Log File System ドライバ (CLFS.sys、%windir%\system32 フォルダに存在) によって処理される .BLF ファイル形式を理解する必要があります。詳細については、この記事の最後にある参照セクションを確認してください。
proof of concept repo では、54.blf ファイル内のオフセット 0x1c10 に細工された値 (0xffffffff00ff01) が含まれています。

この細工された値は、_CLFS_CLIENT_CONTEXT 構造体のオフセット 0x38 にあり、CClfsLogFcbPhysical::Initialize で CClfsLogFcbPhysical 構造体のオフセット 0x538 にコピーされます。

下の青色のマークされた領域は、cidNode = 0xC1FDF006 で始まり、これは CLFSHASHSYM 構造体です。

その後、cidNode == 0xC1FDF007 で始まる領域に _CLFS_CLIENT_CONTEXT 構造体が配置されています。
オフセット 0x38 には、細工された値 0xffffffff00ff01 で埋められるフィールド lsnOwnerPage があります:
struct _CLFS_CLIENT_CONTEXT
{
CLFS_NODE_ID cidNode;
CLFS_CLIENT_ID cidClient;
USHORT fAttributes;
ULONG cbFlushThreshold;
ULONG cShadowSectors;
ULONGLONG cbUndoCommitment;
LARGE_INTEGER llCreateTime;
LARGE_INTEGER llAccessTime;
LARGE_INTEGER llWriteTime;
*CLFS_LSN **lsnOwnerPage; ***// offset 0x38
CLFS_LSN lsnArchiveTail;
CLFS_LSN lsnBase;
CLFS_LSN lsnLast;
CLFS_LSN lsnRestart;
CLFS_LSN lsnPhysicalBase;
CLFS_LSN lsnUnused1;
CLFS_LSN lsnUnused2;
CLFS_LOG_STATE eState;
union
{
HANDLE hSecurityContext;
ULONGLONG ullAlignment;
};
};
PoC が実行されると、lsnOwnerPage の値を細工し、CreateLogFile を呼び出し、前述の値が以下のコールスタックで示されるように UpdateCachedOwnerPage で使用されます。

これは、PoC が CreateLogFile を呼び出し、細工された値が使用され始めるアドレスです:



AddLsnOffset 内部では、この細工された値から計算された ulloffset が返されます:

返される ulloffset は 0xFFFFFFFF00000000 です

その後、この値が比較され、CClfsLogFcbPhysical::UpdateCachedOwnerPage 関数を終了します。

その後、ユーザーモードの PoC に戻り、終了する際に、元の細工された ulloffset が使用されるときに CClfsLogFcbPhysical::FlushLog を呼び出します。

これはループ内で比較され、いずれのサイクルでも等しくない場合、システムは回復不能な状態にあるため、KeBugCheck を呼び出して BSoD を生成し、システムを再起動させます:


ソースと細工された BLF を含む機能する PoC は、Fortra の GitHub にあります。
お役に立てば幸いです。ご質問があれば [email protected] までご連絡ください。
Common Log File System (CLFS) の参照: