深入解析Unsortedbin Attack堆漏洞利用技术 1. Unsortedbin Attack概述Unsortedbin attack是一种针对glibc堆管理器中unsorted bin机制的漏洞利用技术。在Linux系统的内存管理中当程序释放一块较大的内存时这块内存通常会被放入unsorted bin中而不是立即归还给操作系统。unsorted bin作为glibc堆管理器中的一个重要数据结构主要用于暂存最近释放的堆块以便后续的内存分配请求能够快速重用这些内存空间。这个攻击技术的核心在于利用unsorted bin双向链表操作时的写操作原语。当从unsorted bin中取出一个chunk时glibc会执行unlink操作来将该chunk从链表中移除。在这个过程中攻击者可以通过精心构造的内存布局实现对特定内存地址的写操作。2. 技术原理深度解析2.1 glibc堆管理基础glibc的堆管理器使用ptmalloc2算法它将堆内存划分为不同大小的chunk。每个chunk都包含元数据信息和实际用户数据区域。关键的元数据包括size当前chunk的大小prev_size前一个chunk的大小如果前一个chunk是free状态fd/bk前向(fd)和后向(bk)指针用于连接free chunk当chunk被free时根据其大小会被放入不同的bin中fastbin用于小尺寸chunk的单向链表smallbin中等尺寸chunk的双向链表largebin大尺寸chunk的双向链表unsortedbin最近释放chunk的暂存区2.2 Unsorted Bin工作机制unsorted bin是一个双向循环链表具有以下特点当chunk被释放时如果不符合fastbin的大小要求会先放入unsorted bin在后续malloc请求时堆管理器会先遍历unsorted bin寻找合适大小的chunk如果找到的chunk比请求的大小大很多会进行分割操作unsorted bin中的chunk在被重新分配前会保持free状态关键的数据结构操作发生在malloc时对unsorted bin的遍历过程中。当从unsorted bin中取出一个chunk时会执行以下操作// 伪代码表示unlink操作 victim unsorted_chunks(av)-bk; bck victim-bk; unsorted_chunks(av)-bk bck; bck-fd unsorted_chunks(av);2.3 漏洞利用原理攻击者可以通过以下步骤构造利用条件控制一个free chunk的bk指针确保这个chunk位于unsorted bin中触发malloc操作使得该chunk从unsorted bin中取出在unlink操作时bck-fd unsorted_chunks(av)会向bck0x10的位置写入一个值通过精心构造bk指针攻击者可以实现向任意地址写入一个较大的值通常是main_arena的地址。这个写操作原语可以用于修改关键函数指针覆盖全局变量破坏堆管理结构3. 实战利用步骤3.1 环境准备要复现unsortedbin attack需要准备存在堆溢出或UAF漏洞的程序能够控制free chunk的bk指针glibc版本通常需要低于2.29之后加入了更多保护措施3.2 具体操作流程分配两个较大的chunk避免进入fastbinvoid *chunk1 malloc(0x400); void *chunk2 malloc(0x400);释放第一个chunk使其进入unsorted binfree(chunk1);通过漏洞如堆溢出修改chunk1的bk指针// 假设我们可以覆盖chunk1的bk指针 *(size_t *)(chunk1 0x8) target_addr - 0x10;触发malloc操作使得chunk1从unsorted bin中取出void *chunk3 malloc(0x400);检查目标地址的值是否被修改printf(Target value: %p\n, *(void **)target_addr);3.3 关键点说明target_addr需要满足可写条件写入的值通常是main_arena的地址一个较大的值需要确保在修改bk指针时chunk1确实在unsorted bin中可能需要绕过一些检查如size字段的合法性检查4. 防御措施与绕过技术4.1 glibc的保护机制现代glibc版本增加了多项保护措施unlink时的完整性检查if (__builtin_expect (chunksize(P) ! prev_size (next_chunk(P)), 0)) malloc_printerr (corrupted size vs. prev_size);对largebin chunk的额外检查引入tcache机制改变了内存分配流程4.2 可能的绕过方式在某些特定条件下仍可能利用当程序使用较旧版本的glibc时存在其他漏洞可以绕过检查时结合其他攻击技术如house of系列5. 实际应用场景unsortedbin attack通常作为复杂漏洞利用链的一部分用于泄露libc地址通过写入可预测的值修改全局变量如global_max_fast为后续攻击创造条件如FSOP一个典型场景是结合文件流操作FILE *进行利用。通过修改_IO_list_all等全局指针可以导向攻击者控制的区域最终实现代码执行。6. 调试技巧与注意事项6.1 调试方法使用gdbpwndbg插件观察堆状态heap bins # 查看各个bin的状态 vis_heap_chunks # 可视化堆chunk关键断点设置b _int_malloc # 跟踪malloc内部逻辑 b unlink # 跟踪unlink操作观察内存变化watch *(long *)target_addr # 监视目标地址变化6.2 常见问题chunk没有进入unsorted bin检查大小是否符合要求大于global_max_fast确认没有进入tcacheglibc 2.26unlink操作崩溃检查伪造的bk指针是否合法确保size字段与prev_size匹配确认next chunk的prev_inuse位是否正确写入的值不符合预期检查目标地址计算是否正确需要-0x10确认main_arena地址是否如预期7. 与其他堆利用技术的关系unsortedbin attack常与其他技术结合使用与fastbin attack结合先使用unsortedbin attack修改global_max_fast扩大fastbin的范围与house of orange结合构造伪造的FILE结构体与tcache poisoning结合绕过现代glibc的保护相比其他技术unsortedbin attack的特点是不需要泄露地址即可实现写操作但只能写入一个固定的较大值通常作为利用链的中间步骤而非最终目标