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位版本)
  • 所需权限: 中等完整性级别(从低完整性级别利用需要额外信息泄漏)

漏洞分析

漏洞根源

漏洞函数存在以下问题:

  1. 从IOCTL输入缓冲区获取指针
  2. 仅检查指针值是否≥nt!MmHighestUserAddress(0x00007ffffffeffff)
  3. 若检查通过,则直接解引用该指针访问内存

漏洞代码关键点

; 检查是否为内核指针
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(管理员模式执行保护)的系统上,利用相对简单:

  1. 创建两个Private Namespace对象:

    • 第一个对象:泄漏其内核地址
    • 第二个对象:精心构造边界名称
  2. 边界名称构造要求:

    • 第一个字节=0x4B
    • 第二个字节=0xFF
    • 偏移0x0A处=第一个对象地址+0x1a0+0x1A
  3. 最终效果:

    • 控制指令指针跳转到用户空间payload
    • 实现权限提升

Windows 8.1-10 v1809 x64利用

在有SMEP保护的系统上,需要更复杂的利用技术:

  1. 使用"write-what-where"原语:

    • 利用nt!RtlCopyLuid函数修改内核数据
    • 控制RCX和RDX寄存器
  2. 具体步骤:

    • 泄漏进程主令牌地址
    • 创建两个Private Namespace对象
    • 第一个对象边界名前8字节=nt!RtlCopyLuid地址
    • 第二个对象边界名偏移0x0A处=第一个对象地址+0x1a0-0x0C
    • 控制参数指向令牌权限结构
  3. 修改目标:

    • 覆盖令牌的_SEP_TOKEN_PRIVILEGES结构
    • 启用所有权限

利用准备

所需信息

  1. 内核对象地址(通过NtQuerySystemInformation泄漏)
  2. 内核函数地址(nt!RtlCopyLuid等)
  3. 进程令牌地址

关键技术点

  1. Private Namespace对象:

    • 可用于在内核对象中插入用户定义数据
    • 稳定的利用方式
  2. 地址计算:

    • 需要考虑对象内部偏移
    • 确保指针指向有效位置

防御绕过技术

  1. 针对SMEP的绕过:

    • 使用内核函数实现"write-what-where"
    • 避免直接执行用户空间代码
  2. 针对KPP(PatchGuard):

    • 修改后恢复CR4寄存器
    • 锁定线程到单个处理器

漏洞修复建议

  1. 输入验证:

    • 不应仅检查指针是否在内核空间
    • 应验证指针是否指向有效内核对象
  2. 安全开发实践:

    • 不信任任何用户提供的指针
    • 对内核指针进行严格验证

总结

CVE-2017-18019展示了内核驱动程序中指针验证不足导致的严重安全问题。通过精心构造的内核对象和巧妙的利用技术,攻击者可以实现从用户模式到内核模式的权限提升。该漏洞的利用技术也反映了现代Windows系统安全机制的演进和相应的绕过方法。

内核指针解引用导致的权限提升漏洞分析 (CVE-2017-18019) 漏洞概述 CVE-2017-18019是一个存在于K7 Computing和Defenx公司Windows安全产品内核驱动程序中的漏洞,允许攻击者从中等完整性级别提升至系统权限。该漏洞源于内核驱动程序对用户提供的指针验证不足,导致可以解引用任意内核指针。 受影响系统 操作系统: Windows 7 SP1至Windows 10 v1809 (64位版本) 所需权限: 中等完整性级别(从低完整性级别利用需要额外信息泄漏) 漏洞分析 漏洞根源 漏洞函数存在以下问题: 从IOCTL输入缓冲区获取指针 仅检查指针值是否≥nt !MmHighestUserAddress(0x00007ffffffeffff) 若检查通过,则直接解引用该指针访问内存 漏洞代码关键点 利用技术 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系统安全机制的演进和相应的绕过方法。