SKREAM(一):内核模式下的提权缓解措施
字数 1329 2025-08-19 12:42:32

SKREAM: 内核模式下的提权缓解措施技术分析

背景介绍

本地权限提升(LPE)攻击是攻击者利用内核漏洞从低权限提升到系统权限的常见手段。SKREAM(SentinelOne's KeRnel Exploits Advanced Mitigations)是一个开源项目,旨在检测和缓解内核开发周期中的各种风险。

内核溢出漏洞原理

内核溢出漏洞是LPE攻击中广泛使用的一类漏洞,当驱动程序将用户输入数据复制到内存池分配时未验证大小,攻击者可以输入比分配空间更长的数据,覆盖相邻内存池。

关键数据结构

  1. OBJECT_HEADER结构

    • 位于池头之后
    • 包含TypeIndex成员,指向nt!ObTypeIndexTable数组的索引
  2. nt!ObTypeIndexTable数组

    • OBJECT_TYPE结构数组
    • 前两个条目是伪条目:
      • 第一个:空指针
      • 第二个:0xbad0b0b0(x64架构上扩展为用户模式地址)

攻击技术分析

TypeIndex覆盖攻击流程

  1. 攻击者分配0xbad0b0b0页面并伪造OBJECT_TYPE结构
  2. 在内存池中碰撞已知类型和大小的对象
  3. 释放部分对象制造内存"漏洞"
  4. 触发漏洞溢出到下一个对象,修改其TypeIndex为1
  5. 对溢出对象触发操作(如关闭句柄)
  6. 系统从0xbad0b0b0获取OBJECT_TYPE并调用攻击者提供的函数指针

SKREAM缓解措施

技术原理

预先分配包含0xbad0b0b0的内存区域并保护它不被修改或取消映射。

实现步骤

  1. 内存分配

    • 分配包含0xbad0b0b0的区域
    • 系统自动创建VAD(Virtual Address Descriptors)条目
  2. VAD操作

    • 检索创建的VAD条目(使用类似BBFindVad的函数)
    • 由于需要MMVAD_LONG而非MMVAD_SHORT,需自行分配并初始化MMVAD_LONG结构
    • 复制MMVAD_SHORT内容到MMVAD_LONG中的子结构
  3. VAD标志修改

    • 设置关键保护标志:
      Vad->u.VadFlags.NoChange = 1;
      Vad->u.VadFlags.OneSecured = 1;
      Vad->u.VadFlags.MemCommit = 1;
      Vad->u.VadFlags.Protection = MM_READONLY;
      
  4. VAD树更新

    • 设置短VAD子节点的父节点指向新的MMVAD_LONG
    • 更新父节点中的适当子节点指针
    • 释放不再引用的短VAD条目

不同Windows版本的适配

Windows 8适配

  1. 结构变化:

    • 不再有MMVAD_LONG结构,只有MMVAD_SHORT和MMVAD
    • 部分标志位置改变或不存在
  2. 代码调整:

    • 修改标志设置逻辑以适应新结构
    • 更新VAD操作方式

Windows 8.1及更高版本

  1. nt!ObTypeIndexTable[1]不再指向0xbad0b0b0,而是nt!MmBadPointer
  2. Windows 10中TypeIndex值使用安全cookie编码,增加了利用难度

技术限制

  1. 仅适用于Windows 7和Windows 8系统
  2. 从Windows 8.1开始,技术有效性降低
  3. Windows 10的安全机制使该技术基本失效

总结

SKREAM提出的缓解措施通过预先分配和保护关键内存区域,有效阻止了基于TypeIndex覆盖的内核池溢出攻击。该技术展示了如何通过深入理解Windows内存管理机制来构建针对性的防御措施。

SKREAM: 内核模式下的提权缓解措施技术分析 背景介绍 本地权限提升(LPE)攻击是攻击者利用内核漏洞从低权限提升到系统权限的常见手段。SKREAM(SentinelOne's KeRnel Exploits Advanced Mitigations)是一个开源项目,旨在检测和缓解内核开发周期中的各种风险。 内核溢出漏洞原理 内核溢出漏洞是LPE攻击中广泛使用的一类漏洞,当驱动程序将用户输入数据复制到内存池分配时未验证大小,攻击者可以输入比分配空间更长的数据,覆盖相邻内存池。 关键数据结构 OBJECT_ HEADER结构 : 位于池头之后 包含TypeIndex成员,指向nt !ObTypeIndexTable数组的索引 nt!ObTypeIndexTable数组 : OBJECT_ TYPE结构数组 前两个条目是伪条目: 第一个:空指针 第二个:0xbad0b0b0(x64架构上扩展为用户模式地址) 攻击技术分析 TypeIndex覆盖攻击流程 攻击者分配0xbad0b0b0页面并伪造OBJECT_ TYPE结构 在内存池中碰撞已知类型和大小的对象 释放部分对象制造内存"漏洞" 触发漏洞溢出到下一个对象,修改其TypeIndex为1 对溢出对象触发操作(如关闭句柄) 系统从0xbad0b0b0获取OBJECT_ TYPE并调用攻击者提供的函数指针 SKREAM缓解措施 技术原理 预先分配包含0xbad0b0b0的内存区域并保护它不被修改或取消映射。 实现步骤 内存分配 : 分配包含0xbad0b0b0的区域 系统自动创建VAD(Virtual Address Descriptors)条目 VAD操作 : 检索创建的VAD条目(使用类似BBFindVad的函数) 由于需要MMVAD_ LONG而非MMVAD_ SHORT,需自行分配并初始化MMVAD_ LONG结构 复制MMVAD_ SHORT内容到MMVAD_ LONG中的子结构 VAD标志修改 : 设置关键保护标志: VAD树更新 : 设置短VAD子节点的父节点指向新的MMVAD_ LONG 更新父节点中的适当子节点指针 释放不再引用的短VAD条目 不同Windows版本的适配 Windows 8适配 结构变化: 不再有MMVAD_ LONG结构,只有MMVAD_ SHORT和MMVAD 部分标志位置改变或不存在 代码调整: 修改标志设置逻辑以适应新结构 更新VAD操作方式 Windows 8.1及更高版本 nt!ObTypeIndexTable[ 1]不再指向0xbad0b0b0,而是nt !MmBadPointer Windows 10中TypeIndex值使用安全cookie编码,增加了利用难度 技术限制 仅适用于Windows 7和Windows 8系统 从Windows 8.1开始,技术有效性降低 Windows 10的安全机制使该技术基本失效 总结 SKREAM提出的缓解措施通过预先分配和保护关键内存区域,有效阻止了基于TypeIndex覆盖的内核池溢出攻击。该技术展示了如何通过深入理解Windows内存管理机制来构建针对性的防御措施。