堆利用:释放后使用与堆喷射
理解 glibc malloc 的内部机制、释放后使用条件和堆喷射技术。
堆利用:释放后使用与堆喷射 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
堆
堆是在运行时通过 malloc()/free()/new/delete 分配的动态内存。与栈不同,堆布局由分配和释放模式决定,而不是由调用栈决定。堆漏洞常见于浏览器、解析器和网络守护进程中。
释放后使用(UAF)
当程序在释放某个内存区域后仍继续使用它时,就会产生释放后使用漏洞。如果攻击者控制的数据被重新分配到已释放的区域,程序就会使用过期指针操作攻击者的数据。
UAF 示例
UAF 模式:
// Vulnerable C code:
struct Object *obj = malloc(sizeof(*obj));
free(obj);
// Later, attacker causes a new malloc to fill the freed region
// with their data...
obj->method(); // now calls attacker's function pointer!堆风水
堆风水(也称为堆整理)是一种操纵堆分配器、将对象放置在特定位置的技术,从而实现对已释放内存的受控重用。攻击者通过按照精确的顺序触发分配和释放操作来塑造堆布局。
堆喷射
堆喷射会在整个堆中分配大量攻击者控制的数据(外壳代码 + NOP 滑道)。堆被大量填充后,无效指针很可能落入攻击者的数据中。这种技术通常与 UAF 或类型混淆漏洞结合使用。
// JavaScript heap spray:
var spray = [];
for(var i = 0; i < 100000; i++) {
spray[i] = unescape("%90%90...shellcode...");
}双重释放
当一块内存被释放两次时,就会发生双重释放。第二次释放会破坏堆分配器的元数据(空闲链表指针),从而可能允许攻击者控制下次分配所在的位置,进而写入任意地址。
堆缓冲区溢出
与栈溢出一样,堆缓冲区溢出会将数据写入超出堆分配末尾的位置。不同的是,目标通常是堆元数据(大小、前向/后向指针),或包含函数指针或虚函数表指针的相邻分配区域。
类型混淆
当按一种类型分配的内存被当作另一种类型使用时,就会发生类型混淆。这种问题常见于 JavaScript 引擎和 C++ 代码中。如果攻击者能够控制分配顺序,就可以让引擎将攻击者的数据当作可信对象处理。
ptmalloc 和 tcmalloc 内部机制
了解堆分配器有助于漏洞利用开发。glibc 的 ptmalloc 使用分箱(未排序、小型、大型)和快速分箱。tcache(每线程缓存)是首选的分配来源。漏洞利用通常会以破坏分箱为目标,从而控制未来的分配地址。
缓解措施
堆利用的缓解措施:
- 堆随机化(ASLR 的一部分) — 随机化堆基址
- 安全解链 — 解链前验证前向/后向指针
- tcache 投毒检测 — 在 glibc 2.32 中加入
- 指针混淆 — 加密 tcache 中存储的指针
- 内存安全语言 — Rust 在编译时消除 UAF
浏览器堆利用
大多数浏览器零日漏洞都涉及 JavaScript 引擎(V8、SpiderMonkey)中的堆漏洞。现代浏览器会构建多层沙箱逃逸链:渲染进程中的堆漏洞 → 逃逸到浏览器进程 → OS 权限提升。每一步都需要各自的技术。
快速检查:堆利用
哪种漏洞允许攻击者使用指向已释放内存的过期指针,而该内存随后又被攻击者的数据重新分配,从而控制程序执行?
课程回顾
堆漏洞——UAF、双重释放、堆溢出和类型混淆——利用了动态内存管理不当的问题。释放后使用是现代最常见的漏洞利用类型。堆喷射可以最大限度地提高命中攻击者数据的可能性。缓解措施包括:ASLR、安全解链和指针混淆。Rust 等内存安全语言可以完全消除这些漏洞类型。
常见问题解答
「堆利用:释放后使用与堆喷射」课时是免费的吗?
是的 — 「堆利用:释放后使用与堆喷射」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「堆利用:释放后使用与堆喷射」这节课中我会学到什么?
理解 glibc malloc 的内部机制、释放后使用条件和堆喷射技术。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「堆利用:释放后使用与堆喷射」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 栈缓冲区溢出
- 面向返回的编程(ROP)
- 格式化字符串漏洞
- 堆利用:释放后使用与堆喷射