Privilege Escalation via a Kernel Pointer Dereference (CVE-2017-18019)
字数 1313 2025-08-29 08:32:18
内核指针解引用导致的权限提升漏洞分析 (CVE-2017-18019)
漏洞概述
CVE-2017-18019是一个存在于K7 Computing和Defenx公司Windows安全产品内核驱动程序中的漏洞,允许攻击者从中等完整性级别提升至系统权限。该漏洞源于内核驱动程序对用户提供的指针验证不足,导致可以解引用任意内核指针。
受影响系统
- 操作系统: Windows 7 SP1至Windows 10 v1809 (64位版本)
- 所需权限: 中等完整性级别(从低完整性级别利用需要额外信息泄漏)
漏洞分析
漏洞根源
漏洞函数存在以下问题:
- 从IOCTL输入缓冲区获取指针
- 仅检查指针值是否≥nt!MmHighestUserAddress(0x00007ffffffeffff)
- 若检查通过,则直接解引用该指针访问内存
漏洞代码关键点
; 检查是否为内核指针
cmp [rcx], 4Bh ; 检查第一个字节是否为0x4B
jnz short loc_xxxxx
cmp byte ptr [rcx+1], 0FFh ; 检查第二个字节是否为0xFF
jnz short loc_xxxxx
...
; 后续会将该指针作为函数指针调用
call qword ptr [r12+0Ch] ; 调用可控函数指针
利用技术
Windows 7 SP1 x64利用
在没有SMEP(管理员模式执行保护)的系统上,利用相对简单:
-
创建两个Private Namespace对象:
- 第一个对象:泄漏其内核地址
- 第二个对象:精心构造边界名称
-
边界名称构造要求:
- 第一个字节=0x4B
- 第二个字节=0xFF
- 偏移0x0A处=第一个对象地址+0x1a0+0x1A
-
最终效果:
- 控制指令指针跳转到用户空间payload
- 实现权限提升
Windows 8.1-10 v1809 x64利用
在有SMEP保护的系统上,需要更复杂的利用技术:
-
使用"write-what-where"原语:
- 利用nt!RtlCopyLuid函数修改内核数据
- 控制RCX和RDX寄存器
-
具体步骤:
- 泄漏进程主令牌地址
- 创建两个Private Namespace对象
- 第一个对象边界名前8字节=nt!RtlCopyLuid地址
- 第二个对象边界名偏移0x0A处=第一个对象地址+0x1a0-0x0C
- 控制参数指向令牌权限结构
-
修改目标:
- 覆盖令牌的_SEP_TOKEN_PRIVILEGES结构
- 启用所有权限
利用准备
所需信息
- 内核对象地址(通过NtQuerySystemInformation泄漏)
- 内核函数地址(nt!RtlCopyLuid等)
- 进程令牌地址
关键技术点
-
Private Namespace对象:
- 可用于在内核对象中插入用户定义数据
- 稳定的利用方式
-
地址计算:
- 需要考虑对象内部偏移
- 确保指针指向有效位置
防御绕过技术
-
针对SMEP的绕过:
- 使用内核函数实现"write-what-where"
- 避免直接执行用户空间代码
-
针对KPP(PatchGuard):
- 修改后恢复CR4寄存器
- 锁定线程到单个处理器
漏洞修复建议
-
输入验证:
- 不应仅检查指针是否在内核空间
- 应验证指针是否指向有效内核对象
-
安全开发实践:
- 不信任任何用户提供的指针
- 对内核指针进行严格验证
总结
CVE-2017-18019展示了内核驱动程序中指针验证不足导致的严重安全问题。通过精心构造的内核对象和巧妙的利用技术,攻击者可以实现从用户模式到内核模式的权限提升。该漏洞的利用技术也反映了现代Windows系统安全机制的演进和相应的绕过方法。