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原理

  1. 前置条件

    • 存在堆溢出可以覆盖下一个chunk的size字段
    • 可以控制prev_size字段
    • 可以伪造一个fake chunk结构
  2. 利用步骤

    • 构造一个fake chunk,设置好size和fd/bk指针
    • 通过溢出修改下一个chunk的PREV_INUSE位为0(表示前一个chunk是空闲的)
    • 设置prev_size指向fake chunk的位置
    • 当触发free/unlink时,系统会认为前一个chunk是空闲的并与fake chunk合并
  3. 关键数据结构操作

    // unlink操作的核心代码
    FD = P->fd;
    BK = P->bk;
    FD->bk = BK;
    BK->fd = FD;
    

2.2 House of Force原理

  1. 前置条件

    • 可以覆盖top chunk的size字段
    • 可以控制malloc的分配大小
  2. 利用步骤

    • 将top chunk的size改为非常大的值(如0xffffffff)
    • 计算需要分配的size = (目标地址 - top chunk地址)
    • 分配该大小的chunk,下次分配就会从目标地址开始
  3. 关键分配逻辑

    // 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利用演示

  1. 构造两个相邻chunk(a和b)
  2. 在a中构造fake chunk
  3. 溢出修改b的size字段,清除PREV_INUSE位
  4. 设置b的prev_size指向fake chunk
  5. 释放b,触发合并操作
  6. 结果:fake chunk被合并到空闲列表,后续分配可获取目标地址

3.2 House of Force利用演示

  1. 找到top chunk地址
  2. 溢出修改top chunk的size为极大值
  3. 计算目标地址与top chunk的偏移
  4. 分配一个大小为该偏移的chunk
  5. 下次分配将从目标地址开始

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局限性

  1. 需要精确控制prev_size和PREV_INUSE位
  2. 依赖特定的内存布局
  3. 受ASLR和堆保护机制影响大
  4. 需要能够构造可信的fake chunk
  5. 现代glibc版本增加了unlink检查

5.2 House of Force局限性

  1. 需要能够覆盖top chunk的size
  2. 计算偏移需要精确
  3. 受malloc大小限制影响
  4. 现代glibc增加了top chunk大小检查
  5. 需要连续的大分配可能不现实

6. 防御措施

6.1 通用防御

  1. 启用ASLR(地址空间布局随机化)
  2. 使用最新版本的glibc
  3. 实施堆保护机制(如堆隔离)
  4. 限制chunk申请的大小范围

6.2 House of Einherjar专项防御

  1. 检查free时的unlink操作
  2. 验证prev_size和PREV_INUSE位的合理性
  3. 实现堆元数据保护
  4. 使用安全版本的malloc实现

6.3 House of Force专项防御

  1. 检查top chunk的size合理性
  2. 限制单个分配的最大大小
  3. 实现top chunk保护机制
  4. 使用控制流完整性(CFI)技术

7. 实际应用场景

7.1 House of Einherjar适用场景

  1. 存在堆溢出可以覆盖size字段
  2. 程序有频繁的alloc/free操作
  3. 可以预测或泄露堆地址
  4. 可以控制prev_size字段

7.2 House of Force适用场景

  1. 可以覆盖top chunk的size
  2. 可以控制malloc的分配大小
  3. 需要分配连续的大内存
  4. 目标地址可计算或预测

8. 总结与对比

8.1 相同点

  1. 都是堆利用技术
  2. 都需要对内存布局有控制能力
  3. 都可用于实现任意地址写
  4. 都受现代防护机制的限制

8.2 不同点

  1. 利用机制不同

    • Einherjar利用前向合并
    • Force利用top chunk分配
  2. 触发操作不同

    • Einherjar通过free触发
    • Force通过malloc触发
  3. 利用复杂度

    • Einherjar需要构造fake chunk
    • Force需要精确计算偏移
  4. 防护重点

    • Einherjar防御重点是unlink检查
    • Force防御重点是top chunk检查

9. 扩展知识

9.1 相关防护技术演进

  1. glibc 2.26引入的tcache机制影响
  2. Safe-Linking技术对fd/bk指针的保护
  3. malloc_par结构中的各种检查标志
  4. 现代Linux内核的堆保护特性

9.2 其他相关堆漏洞

  1. House of Spirit
  2. House of Lore
  3. House of Orange
  4. House of Rabbit
  5. House of Storm

10. 实践建议

  1. 在分析漏洞时,先确定glibc版本
  2. 检查防护机制是否启用(如ASLR、PIE等)
  3. 使用调试工具验证内存布局
  4. 考虑多种利用技术的组合使用
  5. 关注最新防护技术的绕过方法

通过本文的详细分析,读者应该能够全面理解House of Einherjar和House of Force两种堆利用技术的原理、利用方法、限制条件和防御措施,为二进制安全研究和漏洞利用开发提供坚实基础。

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合并 关键数据结构操作 : 2.2 House of Force原理 前置条件 : 可以覆盖top chunk的size字段 可以控制malloc的分配大小 利用步骤 : 将top chunk的size改为非常大的值(如0xffffffff) 计算需要分配的size = (目标地址 - top chunk地址) 分配该大小的chunk,下次分配就会从目标地址开始 关键分配逻辑 : 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两种堆利用技术的原理、利用方法、限制条件和防御措施,为二进制安全研究和漏洞利用开发提供坚实基础。