ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Appnexus双重释放漏洞深度剖析:Coursebook内存Bug案例

Appnexus双重释放漏洞深度剖析:Coursebook内存Bug案例 Appnexus双重释放漏洞深度剖析Coursebook内存Bug案例【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebookCoursebook是一本面向新手的开源系统编程教材University of Illinois 出品用真实事故案例讲透 C 语言内存管理。本文借教材中的经典案例深入剖析 2013 年广告巨头 Appnexus 因一个双重释放Double Free内存漏洞导致约 900 台服务器同时宕机的完整经过——一次数据更新为什么能让整个广告网络停摆️ 什么是双重释放Double Free双重释放是指程序对同一块内存调用free()两次。先看内存是如何被释放的堆上的空闲块会通过指针串成一条空闲链表Free Listmalloc从链表取块free把块挂回链表。图Coursebook 教材中的 Free List 示意图来源 malloc.tex问题就出在这条链表上。如果同一块内存被释放两次它就会被挂进链表两次链表中出现指向同一块的两条记录。之后任何一次分配都可能破坏链表结构——轻则程序崩溃重则被攻击者利用实现任意内存写入。一个最小的错误示意来自 common_bugs.texint *p malloc(sizeof(int)); free(p); // 第一次释放OK *p 123; // 悬垂指针写我们已不再拥有的内存 free(p); // 双重释放教材给出的防御习惯很朴素释放后立即把指针置为NULL。这样第二次free(NULL)是合法的空操作悬垂指针也无法悄悄复用。 2013 年事故复盘一个 Bug 打挂 900 台服务器下面是 post_mortems.tex 记录的完整经过背景Appnexus 自研了一个异步垃圾回收器负责回收堆上不再使用的对象设计初衷为了压低延迟对象被删除时不会立刻释放内存而是先从其他对象中摘链并预约在未来的某个安全时间点确保没有任何线程还在用它时才真正执行freeBug 出现2013 年一次数据更新删除了一个极少变化的对象而代码缺陷导致同一个对象被预约释放了两次校验为何漏过因为真正的释放还没发生此刻内存里看起来一切正常这次更新顺利通过了校验并被分发到全部约 900 台广告投放服务器集体宕机当预约的释放动作最终执行时双重释放瞬间触发所有服务器在几乎同一时刻崩溃广告业务大面积停摆。多出来的那一次free就像把同一个空闲块挂了两次进链表——900 台机器只是把同一颗定时炸弹引爆了 900 次。⏱️ 为什么异步 并发是双重释放的温床Appnexus 的延迟释放本质上是一个稍后再做的异步操作而多线程共享状态正是这类操作最容易出问题的地方图线程竞争时序示意来源 thread_race_timing.png当删除对象和预约释放分布在多个执行路径上只要有一条路径被多走一次同一块内存就会被预约两次释放。这类 Bug 的可怕之处在于触发点预约重复与爆炸点延迟释放在时间和空间上完全分离——写 Bug 的人、跑校验的代码、最终崩溃的服务器三者可能相隔数小时和数百台机器排查难度极高。 教材给出的教训与防御清单模块化和边界自研垃圾回收器属于hacky software教材建议模块化解耦、设置内存上限、对关键路径做独立监控而不是指望一个万能回收器通吃释放即置空free(p)之后立刻p NULL;把静默错误变成显式崩溃警惕延迟/异步释放凡是稍后再 free的设计都要确保释放任务只会被预约一次幂等性可用状态标记如已入队释放拦截重复预约校验要看将来时Appnexus 的校验只检查了当前内存状态而真正的危险在释放发生之后才出现——对延迟操作校验必须覆盖它最终执行后的状态限流与隔离即使全量分发也可分批灰度推送把900 台同时崩降级成1 台崩、其余不崩。 延伸阅读仓库内资料想系统补课教材按依赖顺序推荐主题文件路径本案例全文Post Mortems 章节post_mortems/post_mortems.texDouble Free 定义与修复introc/common_bugs.tex堆分配器与空闲链表原理malloc/malloc.tex教材总览README.md 一句话总结双重释放本身并不复杂真正致命的是它藏在延迟释放与并发路径中被看起来正常的校验放行最终在数百台机器上同时引爆。学会看 Free List你就能看懂这一切。【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表