简介
CVE-2024-6768 是 Windows 通用日志文件系统 (CLFS.sys) 驱动程序中的一个漏洞,由输入数据中指定数量的验证不当引起。此漏洞导致不可恢复的不一致,触发 KeBugCheckEx 函数并导致蓝屏死机 (BSoD)。尽管已应用所有更新,但该问题仍会影响 Windows 10 和 Windows 11、Windows Server 2016、Server 2019 和 Server 2022 的所有版本。概念验证 (PoC) 表明,通过在 .BLF 文件中制作特定值,非特权用户可以导致系统崩溃。潜在的问题包括系统不稳定和拒绝服务,因为恶意用户可以利用此漏洞反复使受影响的系统崩溃,从而中断操作并可能导致数据丢失。
漏洞详情
此漏洞是由输入中指定数量的不正确验证 (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):无
系统检测到不可恢复状态后,会调用 KeBugCheckEx 函数,从而导致 BSoD,如 Microsoft 的一篇文章中所述。
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 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
构建 PoC
要开始分析,必须了解 .BLF 文件格式,该文件格式由位于文件夹 %windir%\system32 中的易受攻击的通用日志文件系统驱动程序 CLFS.sys 处理。
54.blf 文件在偏移量 0x1c10 处有一个精心设计的值 (0xffffffff00ff01)。
这个精心设计的值位于 _CLFS_CLIENT_CONTEXT 结构的偏移量 0x38 处。它被复制到 CClfsLogFcbPhysical::Initialize 中,并被复制到 CClfsLogFcbPhysical 结构的偏移量 0x538 处。
CLFSHASHSYM 结构以 cidNode = 0xC1FDF006 开头,并以蓝色突出显示:
之后,_CLFS_CLIENT_CONTEXT 结构以 cidNode == 0xC1FDF007 开头。
字段 lsnOwnerPage 位于偏移量 0x38,将用精心设计的值 0xffffffff00ff01 填充:
当执行 PoC 时,它会构造 lsnOwnerPage 的值并调用 CreateLogFile。所提到的值在 UpdateCachedOwnerPage 中使用,如下面的调用堆栈所示:
这是 PoC 调用 CreateLogFile 并开始使用精心制作的值的地址:
AddLsnOffset 内部返回一个 ulloffset,它是根据这个精心设计的值计算出来的:
返回的 ulloffset 是 0xFFFFFFFF00000000:
之后,比较此值并退出函数CClfsLogFcbPhysical::UpdateCachedOwnerPage:
之后,它返回到用户模式下的 PoC,并在退出时使用原始制作的 ullofset 调用 CClfsLogFcbPhysical::FlushLog:
这是一个循环比较的结果,如果在任何循环中都不相等,则由于系统处于不可恢复状态,它会调用 KeBugCheck,从而产生 BSoD 以重新启动系统:
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)