Eternal Champion漏洞深度分析:SMBv1竞态条件漏洞利用与Windows 10缓解机制

本文深入分析了Eternal Champion漏洞利用技术,该漏洞利用SMBv1事务处理中的竞态条件实现信息泄露和远程代码执行,并详细介绍了Windows 10的NX内存保护和HVCI等缓解机制如何有效阻断此类攻击。

Eternal Champion漏洞分析

概述

Eternal Champion是一个针对Windows XP至Windows 8系统的认证后SMB v1漏洞利用工具。分析显示,该漏洞利用依赖于自Windows 8起已被缓解的技术,并在Windows 10中得到进一步加固。本文重点分析针对Windows 7 x64 RTM的利用过程。

漏洞原理

漏洞本质是SMBv1处理事务时存在的竞态条件。事务是一种可能跨多个数据包的请求类型:

  • 当事务主请求包含所有预期数据时,事务不会被标记为"正在执行",但仍会被放入事务列表并发送到ExecuteTransaction函数
  • 这使得竞态成为可能:次级请求(在单独线程处理)可以在ExecuteTransaction执行期间修改事务数据
  • ExecuteTransaction未预料到此情况,结合宽松的参数验证,会导致访问违规

利用过程

信息泄露阶段

通过越界读取实现池信息泄露:

  1. 发送包含多个SMB的单个数据包
  2. 主事务请求使用NT RENAME功能(包含所有预期数据)
  3. 次级事务请求触发竞态条件
  4. 通过池喷洒使TRANSACTION结构在内存中连续布局
  5. 利用DataCount字段被恶意递增的特性,读取相邻TRANSACTION结构中的Connection指针

远程代码执行阶段

使用Transaction2/Transaction2Secondary请求:

  1. 创建包含shellcode的事务(存储第二阶段载荷)
  2. 发送包含多个SMB的数据包触发竞态
  3. 利用SrvSmbQueryPathInformation中的关键代码行:transaction->InData = (PVOID)&objectName;
  4. 通过竞态使InData指针指向主请求处理线程的栈空间
  5. 精确覆盖栈上的返回地址实现控制流劫持

载荷机制

攻击者通过以下步骤执行自定义shellcode:

  1. 利用泄露的CONNECTION对象地址定位ClientOSType字段
  2. 构造特殊的UNICODE_STRING结构(MaximumLength=0x15ff)
  3. 覆盖返回地址指向CONNECTION->ClientOSType.MaximumLength
  4. 通过call指令跳转到攻击者控制的缓冲区执行stage1 shellcode
  5. stage1代码搜索事务列表找到包含stage2 shellcode的事务并执行

缓解措施影响

  • Windows 8 x64+:内核虚拟地址空间(包括分页/非分页池)设置为不可执行,阻断池中代码执行
  • Windows 10
    • HVCI(Hypervisor-enforced Code Integrity)阻止未签名内核页执行
    • 完整的64位内核ASLR(1607版本随机化所有区域除外HAL堆,1703版本随机化HAL堆)
  • 32位Windows 8仍存在可执行分页池,因此仍受影响

shellcode分析

Stage 0

通过UNICODE_STRUCTURE结构实现初始跳转:

1
fffffa83`0398e3ea ff1500000000    call    qword ptr [fffffa83`0398e3f0]

Stage 1

  • 定位CONNECTION结构并遍历TransactionList
  • 查找带有特殊标识符的事务记录
  • 从事务中复制stage2 shellcode并执行

Stage 2

  • 执行完整性检查
  • 执行用户提供的自定义shellcode(通过fuzzbunch)
  • 包含清理和恢复正常线程执行的逻辑

技术细节

漏洞利用涉及多个精巧的内存操作:

  • 精确的池布局控制通过TRANSACTION结构喷洒实现
  • 利用UNICODE_STRING结构特性构造代码指针
  • 多线程同步确保竞态条件可靠触发
  • 通过ETHREAD结构分析实现可靠的线程恢复

该漏洞利用展示了即使在内核环境中,结合恰当的时序和内存操作,也能实现可靠的代码执行。现代Windows系统的安全增强显著提高了此类利用的技术门槛。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计