
CVE-2024-6768에 대한 개념 증명 익스플로잇으로, 조작된 .BLF 파일을 통해 BSoD를 유발하는 Windows CLFS.sys 드라이버 취약점입니다. 소스 코드와 기술 분석을 포함합니다.
CVE-2024-6768은 Windows의 CLFS(Common Log File System) 드라이버(CLFS.sys)에서 입력 데이터의 지정된 수량에 대한 부적절한 검증으로 인해 발생하는 취약점입니다. 이 결함으로 인해 복구 불가능한 불일치가 발생하여 KeBugCheckEx 함수가 호출되고 Blue Screen of Death(BSoD)가 발생합니다. 이 문제는 모든 업데이트가 적용된 상태에서도 Windows 10 및 Windows 11, Windows Server 2016, Server 2019, Server 2022의 모든 버전에 영향을 미칩니다. PoC(Proof of Concept)는 .BLF 파일 내에서 특정 값을 조작하면 권한이 없는 사용자가 시스템 충돌을 유발할 수 있음을 보여줍니다. 잠재적인 문제로는 시스템 불안정 및 서비스 거부가 있으며, 악의적인 사용자가 이 취약점을 악용하여 영향을 받는 시스템을 반복적으로 충돌시켜 운영을 방해하고 잠재적으로 데이터 손실을 초래할 수 있습니다.
지난 두 번의 CLFS(Common Log File System) 연구 노력에서 저는 두 경우 모두 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의 최신 버전까지 모든 버전에 영향을 미칩니다.
기본 점수: CVSS 4.0: 6.8 중간
벡터 문자열 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
공격 벡터(AV): 로컬
공격 복잡성(AC): 낮음
공격 요구 사항(AT): 없음
필요 권한(PR): 낮음
사용자 상호 작용(UI): 없음
기밀성(VC): 없음
무결성(VI): 없음
가용성(VA): 높음
기밀성(SC): 없음
무결성(SI): 없음
가용성(SA): 없음
시스템이 복구 불가능한 상태를 감지한 후, Microsoft가 이 문서에서 설명한 대로 KeBugCheckEx 함수를 호출하여 BSoD가 발생합니다: https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-kebugcheckex.

CClfsLogFcbPhysical::FlushLog+6F2 는 CLFS.sys 버전 10.0.19041.3324에서 KeBugCheckEx 호출이 발생하는 주소입니다:
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
분석을 시작하려면 %windir%\system32 폴더에 있는 취약한 CLFS 드라이버 (CLFS.sys)에서 처리하는 .BLF 파일 형식을 알아야 합니다. 자세한 내용은 이 문서 끝에 있는 참조 섹션을 확인하십시오.
PoC 저장소의 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; ***// 오프셋 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로 돌아가고, 종료될 때 원래 조작된 ullofset이 사용되는 CClfsLogFcbPhysical::FlushLog를 호출합니다.

이는 루프에서 비교되며, 어떤 사이클에서도 일치하지 않으면 시스템이 복구 불가능한 상태이므로 KeBugCheck를 호출하여 자체 재시작을 위한 BSoD가 발생합니다:


작동하는 PoC와 소스 코드 및 조작된 BLF 파일은 Fortra의 GitHub에서 찾을 수 있습니다.
도움이 되길 바랍니다. 질문이 있으시면 [email protected]으로 연락해 주십시오.
CLFS(Common Log File System) 참조: