SKREAM(一):内核模式下的提权缓解措施
字数 1329 2025-08-19 12:42:32
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->u.VadFlags.NoChange = 1; Vad->u.VadFlags.OneSecured = 1; Vad->u.VadFlags.MemCommit = 1; Vad->u.VadFlags.Protection = MM_READONLY;
- 设置关键保护标志:
-
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内存管理机制来构建针对性的防御措施。