House of Einherjar漏洞和House of Force漏洞对比
字数 2672 2025-08-29 08:30:18
House of Einherjar与House of Force漏洞深度分析与对比
1. 概述
1.1 House of Einherjar漏洞
- 类别:堆利用漏洞
- 核心原理:通过伪造prev_size和PREV_INUSE位,诱使glibc的unlink操作合并伪造的"空闲"块
- 关键点:需要控制一个chunk的prev_size和PREV_INUSE位,以及伪造一个fake chunk
1.2 House of Force漏洞
- 类别:堆利用漏洞
- 核心原理:通过覆盖top chunk的size字段,控制后续分配的内存位置
- 关键点:需要能够覆盖top chunk的size字段,并控制分配大小
2. 漏洞原理详解
2.1 House of Einherjar原理
-
前置条件:
- 存在堆溢出可以覆盖下一个chunk的size字段
- 可以控制prev_size字段
- 可以伪造一个fake chunk结构
-
利用步骤:
- 构造一个fake chunk,设置好size和fd/bk指针
- 通过溢出修改下一个chunk的PREV_INUSE位为0(表示前一个chunk是空闲的)
- 设置prev_size指向fake chunk的位置
- 当触发free/unlink时,系统会认为前一个chunk是空闲的并与fake chunk合并
-
关键数据结构操作:
// unlink操作的核心代码 FD = P->fd; BK = P->bk; FD->bk = BK; BK->fd = FD;
2.2 House of Force原理
-
前置条件:
- 可以覆盖top chunk的size字段
- 可以控制malloc的分配大小
-
利用步骤:
- 将top chunk的size改为非常大的值(如0xffffffff)
- 计算需要分配的size = (目标地址 - top chunk地址)
- 分配该大小的chunk,下次分配就会从目标地址开始
-
关键分配逻辑:
// glibc的malloc核心逻辑 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) { // 从top chunk分配 remainder_size = size - nb; remainder = chunk_at_offset(victim, nb); av->top = remainder; // ... }
3. 利用手法对比
3.1 House of Einherjar利用演示
- 构造两个相邻chunk(a和b)
- 在a中构造fake chunk
- 溢出修改b的size字段,清除PREV_INUSE位
- 设置b的prev_size指向fake chunk
- 释放b,触发合并操作
- 结果:fake chunk被合并到空闲列表,后续分配可获取目标地址
3.2 House of Force利用演示
- 找到top chunk地址
- 溢出修改top chunk的size为极大值
- 计算目标地址与top chunk的偏移
- 分配一个大小为该偏移的chunk
- 下次分配将从目标地址开始
4. 技术细节对比
| 对比项 | House of Einherjar | House of Force |
|---|---|---|
| 修改目标 | chunk的prev_size和PREV_INUSE位 | top chunk的size字段 |
| 触发条件 | free/unlink操作 | malloc分配操作 |
| 利用效果 | 任意地址写(通过unlink) | 任意地址分配 |
| 关键操作 | 伪造fake chunk | 计算精确偏移 |
| 依赖特性 | 前向合并机制 | top chunk分配机制 |
5. 漏洞局限性
5.1 House of Einherjar局限性
- 需要精确控制prev_size和PREV_INUSE位
- 依赖特定的内存布局
- 受ASLR和堆保护机制影响大
- 需要能够构造可信的fake chunk
- 现代glibc版本增加了unlink检查
5.2 House of Force局限性
- 需要能够覆盖top chunk的size
- 计算偏移需要精确
- 受malloc大小限制影响
- 现代glibc增加了top chunk大小检查
- 需要连续的大分配可能不现实
6. 防御措施
6.1 通用防御
- 启用ASLR(地址空间布局随机化)
- 使用最新版本的glibc
- 实施堆保护机制(如堆隔离)
- 限制chunk申请的大小范围
6.2 House of Einherjar专项防御
- 检查free时的unlink操作
- 验证prev_size和PREV_INUSE位的合理性
- 实现堆元数据保护
- 使用安全版本的malloc实现
6.3 House of Force专项防御
- 检查top chunk的size合理性
- 限制单个分配的最大大小
- 实现top chunk保护机制
- 使用控制流完整性(CFI)技术
7. 实际应用场景
7.1 House of Einherjar适用场景
- 存在堆溢出可以覆盖size字段
- 程序有频繁的alloc/free操作
- 可以预测或泄露堆地址
- 可以控制prev_size字段
7.2 House of Force适用场景
- 可以覆盖top chunk的size
- 可以控制malloc的分配大小
- 需要分配连续的大内存
- 目标地址可计算或预测
8. 总结与对比
8.1 相同点
- 都是堆利用技术
- 都需要对内存布局有控制能力
- 都可用于实现任意地址写
- 都受现代防护机制的限制
8.2 不同点
-
利用机制不同:
- Einherjar利用前向合并
- Force利用top chunk分配
-
触发操作不同:
- Einherjar通过free触发
- Force通过malloc触发
-
利用复杂度:
- Einherjar需要构造fake chunk
- Force需要精确计算偏移
-
防护重点:
- Einherjar防御重点是unlink检查
- Force防御重点是top chunk检查
9. 扩展知识
9.1 相关防护技术演进
- glibc 2.26引入的tcache机制影响
- Safe-Linking技术对fd/bk指针的保护
- malloc_par结构中的各种检查标志
- 现代Linux内核的堆保护特性
9.2 其他相关堆漏洞
- House of Spirit
- House of Lore
- House of Orange
- House of Rabbit
- House of Storm
10. 实践建议
- 在分析漏洞时,先确定glibc版本
- 检查防护机制是否启用(如ASLR、PIE等)
- 使用调试工具验证内存布局
- 考虑多种利用技术的组合使用
- 关注最新防护技术的绕过方法
通过本文的详细分析,读者应该能够全面理解House of Einherjar和House of Force两种堆利用技术的原理、利用方法、限制条件和防御措施,为二进制安全研究和漏洞利用开发提供坚实基础。