尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

House of Rabbit

发布时间:2026/9/28 16:10:03

资讯中心
01
ARTICLE

House of Rabbit

House of Rabbit
House of Rabbit 是由日本安全研究员 shift-crops 在 2017 年提出的一种高级堆利用手法。它的核心目标是实现任意地址分配Arbitrary Allocation即让malloc返回一个你指定的内存地址如__malloc_hook或栈上某处从而可以直接向该地址写入恶意数据。核心原理大白话不严谨的“酒店保洁”在 glibc 的内存管理ptmalloc中你可以把堆内存想象成一家酒店Fastbin快速退房台客人退还的小房间钥匙会先扔到这里。前台为了图快只用一条单向链表串起来几乎不检查钥匙上的房间号对不对。Unsorted Bin大分类室存放等待重新分配的各类房间管理非常严格。malloc_consolidate大扫除机制当有客人突然要订超大房间或者系统内存不够时酒店会召唤“保洁员”进行大扫除。保洁员会把 Fastbin 里的钥匙全部拿出来转移到 Unsorted Bin 中并尝试把相邻的空房间合并。漏洞的致命点就在这里正常情况下你如果想直接在 Fastbin 里搞事系统在分配时会严格检查房间大小Size是否匹配。但是malloc_consolidate这个保洁员在转移钥匙时完全不管房间的大小是否合法House of Rabbit 就是利用了这个“监管盲区”把一个伪造的、大小撑爆整个内存空间的“假房间”混进了 Fastbin最后被系统当成合法房间收录从而任由攻击者宰割。攻击流程四步走要完成 House of Rabbit通常需要借助一个能修改 Fastbin 指针的漏洞比如 Use-After-Free 或 Fastbin Dup。具体步骤如下1. 凭空捏造Forge a Fake Chunk首先在内存的已知地址处比如.bss段这个地址是不受 ASLR 随机化影响的伪造一个 Fake Chunk。把它的size字段写得极大通常是0xfffffffffffffff1。在计算机的补码机制下这个大小不仅绕过了许多空间限制还相当于覆盖了整个内存的寻址空间。为了防止在后续合并时触发崩溃还需要在物理空间上绕一圈在它前面伪造一个小 chunk比如size 0x11把PREV_INUSE标志位圆上骗过 glibc 的安全检查。2. 偷梁换柱Link to Fastbin利用 UAF 等漏洞修改 Fastbin 里某一个真实 Chunk 的fd指针让它指向你在.bss段伪造的这个 Fake Chunk。此时Fastbin 的链表变成了这样Fastbin 头 - 真实的 Chunk - 伪造的 Fake Chunk (size: 0xfff...)3. 召唤保洁Trigger malloc_consolidate这时候不能直接malloc我们伪造的区块因为 Fastbin 会检查 size看到0xfff...直接就报错退出了。我们需要故意申请一个非常大的 Chunk比如大于 0x400 字节落入 Large Bin 范围这会强行触发malloc_consolidate。在 consolidate 的过程中glibc 顺着 Fastbin 的链表往下摸摸到了你的 Fake Chunk。因为它不检查 size直接就把这个超级巨无霸摘下来合法地放入了 Unsorted Bin随后可能会被整理进 Large Bin。4. 移花接木Arbitrary Allocation现在系统的 Unsorted Bin 里躺着一个大小为0xfffffffffffffff1的合法 Chunk。这和著名的 House of Force 手法达成了完全相同的状态。接下来只需要做简单的数学题计算目标地址 - Fake Chunk 的当前地址得出一个偏移量Offset。malloc申请这个偏移量大小的内存。系统会老老实实地从这个巨无霸 Chunk 里切下这么大一块交给你。此时巨无霸 Chunk 剩下的起始位置已经精确地踩在了你的目标地址上。再执行一次正常大小的malloc系统就会把目标地址分配给你你就可以往里面写入 Shellcode 或 System 函数的地址了。它究竟强在哪里在实际的漏洞利用中House of Rabbit 具有非常鲜明的战术优势降维打击 Heap ASLR传统的 House of Force 需要你先泄露出堆的基地址Heap Leak才能算出偏移量。而 House of Rabbit 把假区块建在地址已知的.bss段全程不需要泄露堆地址。门槛更低传统的 Fastbin Attack 要求目标地址附近必须有天然的伪造 size如 libc 里的\x7f错位。House of Rabbit 完全不受这个限制指哪打哪。总结来说House of Rabbit 精妙地捕捉到了 glibc 在不同内存管理机制Fastbin 与 Unsorted Bin交接时产生的信任真空用malloc_consolidate做了跳板完成了一次教科书级别的越权分配。例子为了让你直观地看到 House of Rabbit 是如何落地的我们用一段精简的 C 语言伪代码来复现这个过程。假设程序的.bss段有一个我们要篡改的目标变量target_var并且程序存在一个UAF (Use-After-Free)漏洞允许我们修改已释放内存的指针。攻击代码演示#include stdio.h #include stdlib.h #include stdint.h // 1. 我们的攻击目标.bss 段上的一个普通变量 char target_var[0x20] I am safe!; // 2. 在 .bss 段已知地址处准备一个伪造的 Chunk // 数组的大小无所谓我们只需要操控它的头部 uint64_t fake_chunk[10]; int main() { // // 第一步凭空捏造 (Forge Fake Chunk) // // 设置 fake_chunk 的 size 为 0xfffffffffffffff1 // 这个极其特殊的值在 64 位下相当于 -0xf配合整数溢出能绕过合并检查 fake_chunk[1] 0xfffffffffffffff1; // // 第二步偷梁换柱 (Link to Fastbin) // // 申请一个属于 Fastbin 大小的 Chunk (例如 0x10 字节实际分配 0x20) uint64_t *ptr malloc(0x10); // 释放它此时它被挂入 Fastbin 链表 free(ptr); // 【漏洞触发点】利用 UAF 漏洞篡改已释放 Chunk 的 fd 指针 // 让 Fastbin 链表顺藤摸瓜指向我们在 .bss 段伪造的 fake_chunk ptr[0] (uint64_t)fake_chunk; // // 第三步召唤保洁 (Trigger malloc_consolidate) // // 故意申请一个大内存 (超过 Fastbin 范围如 0x400) // ptmalloc 发现没有合适的空闲块就会触发 malloc_consolidate 大扫除 // 保洁员不检查 size直接把 fake_chunk 从 Fastbin 摘下来塞进 Unsorted Bin malloc(0x400); // // 第四步移花接木 (Arbitrary Allocation) // // 此时 Unsorted Bin 里有一个 size 无穷大的 fake_chunk // 我们计算 fake_chunk 到 target_var 之间的物理距离偏移量 // 减去 0x10 是因为要扣除 Chunk Header 的大小 long offset (long)target_var - (long)fake_chunk - 0x10; // 向系统申请这个偏移量大小的内存 // 系统会从 fake_chunk 这个“巨无霸”里切下这块肉 malloc(offset); // 切完之后巨无霸剩下的起始指针刚好踩在 target_var 上 // 再次申请正常大小的内存系统就会把 target_var 的地址分配给我们 char *victim malloc(0x10); // // 攻击完成任意写入 // sprintf(victim, Hacked!); printf(Target status: %s\n, target_var); // 这里将输出 Hacked! return 0; }核心细节解析这段代码能跑通底层依赖了 glibc ptmalloc 的两个致命缺陷1. 为什么伪造的 Size 必须是0xfffffffffffffff1当malloc_consolidate处理你的fake_chunk时它会尝试向后合并看看相邻的下一个房间是不是空的。它定位下一个房间的公式是当前地址 size。在 64 位系统中0xfffffffffffffff1相当于补码的-15由于对齐机制实际表现为-0x10。当程序执行fake_chunk 地址 (-0x10)时发生了整数溢出指针直接倒退了 16 个字节指向了fake_chunk[0]的位置因为这里的数据通常是 0合法状态完美骗过了 ptmalloc 的相邻 Chunk 检查防止了程序崩溃Crash。2. 为什么需要大内存申请malloc(0x400)如果没有这一步你的fake_chunk会一直卡在 Fastbin 里。如果你直接malloc试图把它取出来Fastbin 会立刻检查你的申请大小是否和 Chunk 的 size 匹配。由于没有任何人会申请0xfff...这么大的内存程序会直接报错malloc(): memory corruption (fast)。而申请大内存触发的malloc_consolidate是唯一一条只转移链表不校验 Size 大小的地下通道。通过这套组合拳你在完全不泄露堆基址的情况下把.bss段的一个伪造节点合法化成了一个掌管全局内存分配的“大本营”指哪打哪。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。