1. 堆溢出的本质
堆溢出(Heap Overflow)是由于程序在堆上写入数据时未进行良好的边界检查,导致数据溢出覆盖了相邻内存区域的漏洞。堆溢出是“程序代码”的逻辑漏洞,而ptmalloc是被利用的“工具/载体”。也就是说,漏洞出在“程序员”本身,而非“分配器”。
Linux 环境下,堆溢出(Heap Overflow) 是一种严重的内存损坏漏洞,主要发生在动态内存分配区域(Heap)。攻击者通过向分配的内存块(Chunk)写入超过其容量的数据,覆盖相邻的内存区域,从而达到破坏程序逻辑或获取系统控制权的目的。
堆溢出本质上是缺乏边界检查。应用程序在调用malloc申请空间后,往里面写数据时没管好边界。ptmalloc只是老老实实地按照要求给了一块地,它无法预知程序员会不会往这块地里填充过量的数据。攻击者通常瞄准以下两类目标:
- 管理元数据(Metadata):Glibc的
ptmalloc分配器在内存块中存储控制信息(如块大小size、前后向指针fd/bk)。通过覆盖这些指针,攻击者可以诱导分配器在下次malloc时返回任意内存地址(如函数返回地址或GOT表),实现任意地址写入; - 业务对象数据(Application Data):覆盖相邻对象中的函数指针、类虚表(vtable)或敏感配置位。例如,修改一个对象的回调函数指针,使其指向恶意代码。
2. 堆溢出的分类(Linux)
与栈溢出不同,堆内存主要用于动态分配(如malloc、new),其管理机制(如Glibc的ptmalloc)更为复杂,因此利用方式也更多样。
从代码层面根据导致溢出的逻辑错误进行的分类:
- 基础堆溢出 (Basic Heap Overflow):程序向堆块写入的数据超过了分配的
size,直接覆盖物理相邻的高地址堆块内容; - Off-By-One (单字节溢出):由于边界检查不严(如循环多执行一次或
strlen未计算\0),仅溢出一个字节。这通常用于覆盖相邻块的size字段以构造堆块重叠; - Off-By-Null (空字节溢出):溢出一个
\0字节。在某些版本中,这足以修改相邻块的PREV_INUSE标志位,进而触发异常合并(Consolidation); - 整数溢出导致的堆溢出:由于计算申请内存大小时发生整数溢出,导致分配了过小的内存块,随后写入正常长度数据时发生溢出;
根据针对Glibc (ptmalloc) 不同管理机制的利用手段进行的分类:
- Unsafe Unlink:利用双向链表合并时的指针操作,在伪造堆块时实现“任意地址写”;
- Bins Attack:堆漏洞利用(Heap Exploitation)中的核心技术,利用堆管理器(如glibc ptmalloc)维护空闲堆块的链表结构(Bins)时的逻辑漏洞,实现任意地址写或分配任意地址内存;
- Chunk Extend 是一种通过篡改堆块头部(Chunk Header)中的
size字段,使堆管理器误认为该堆块比实际声明的“更大”的利用技术;
“House of” 系列本质上是针对Glibc内存管理器(ptmalloc)内部逻辑的高度巧妙利用:
- House of Force:通过改写
top chunk的size为极大值,使后续malloc可以覆盖到程序的任何内存区域; - House of Spirit:伪造一个假的堆块并将其
free掉,使其进入fastbin/tcache,从而在下次分配时获得该伪造地址; - House of Orange:在无法调用
free的情况下,通过修改top chunk的大小触发sysmalloc导致旧top chunk被释放进入unsorted bin,进而劫持IO_FILE; - House of Einherjar:通过溢出覆盖相邻块的
PREV_INUSE和prev_size,强制让free时发生后向合并(Backward Merge),从而制造堆块重叠; - House of Lore:一种针对Small Bin的经典堆利用技术。其核心目标是通过伪造 Small Bin 链表中的
bk指针,欺骗malloc分配出位于任意地址(如栈、BSS 段或堆的其他位置)的内存块; - House of Rabbit:一种极具技巧性的堆利用技术,通过伪造Fastbin链表来控制
malloc_consolidate过程,最终实现Chunk Overlap(堆块重叠)或任意地址分配; - House of Roman:一种在开启了 ASLR(地址空间布局随机化) 且没有任何信息泄露(Leakless) 的情况下,实现 Get Shell 的高级堆利用技术;
- House of Pig:结合Tcache Stashing Unlink Attack和Large Bin Attack,最终劫持
_IO_list_all或类似的IO_FILE结构;
现代Tcache攻击 (GLIBC 2.26+):
- Tcache Poisoning:直接修改
tcache块中的next指针,因为tcache的安全检查相对较少,这种方式利用非常高效; - Tcache Stashing Unlink Attack:利用从
smallbin放入tcache的过程进行指针劫持;
免责声明:
1. 一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
1. 一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。