当前位置:主页 > 国内 >

听见你的声音

OpenAI 将崩溃调试视为流行病学研究,修复了存在 18 年之久的 GNU libunwind 漏洞_我的网站

套路

一 |     伊朗当地时间8月22日,也正是伊朗的“国防工业日”,伊朗就这样突然地对着全世界放了一个“大招”:伊朗媒体首次公开地下军工生产线画面。    作者 | Steef-Jan Wiggers     译者 | 平川          OpenAI 的工程师们花了数周时间,试图解释 Rockset 中那些神秘的崩溃问题。Rockset 是一款 C++ 数据基础设施服务,为 ChatGPT 的搜索和数据插件提供支持。

二 | 函数似乎会返回错误的内存地址,栈指针在执行过程中似乎会偏移 8 个字节。    从画面中可以看到,伊朗的这个军工基地可不是仓促建造,各种基础设施一应俱全,宛如一个堡垒,在这样的地下区域建造这样规模的基地,可不是短短几年就可以做到的。

三 | 团队提出的每一种假设都面临着有力的反证。这个 Bug 似乎根本不可能存在。    但最关键的还是后面放出的信息,第一点就是这样规模的地下军工生产线,伊朗还有数十条,第二点则是这里不仅可以生产导弹和无人机等装备,其产量等各方面也有很大提升。

四 |     这分明就是直接给美国看的,正所谓逢敌必亮剑,伊朗正在赤裸裸地告诉美国,这就是我目前的军工实力,如果还不停火,后果自己看着办。

五 |          他们原本以为是一个 Bug ,结果却发现是两个互不相关的 Bug ,它们只是很巧合地在同一时间被发现了。

六 |         2026年的美伊冲突,让我们看到了伊朗最硬气的一面,也让美国这个庞然大物以主动停火的方式阶段性地结束了战争。    而作为局外人,我们看到了太多伊朗的强大,尤其是在军工方面,可以说看到了伊朗的高瞻远瞩,甚至看到了我国抗战时期的缩影。

七 | 这一突破性发现并非来自对单个崩溃事件的深入排查,而是源于转向了他们所说的“流行病学调试”:构建一条管道,自动分析过去一年中生产环境的每一个核心转储文件,然后寻找整体规律,而不是对单个案例进行推断。    《地道战》是我国一部经典的、高度还原历史真相的电影,而伊朗在常年面对美国威胁的情况下,也做出了相似的行为。         该团队让 ChatGPT 编写了一个脚本,用于下载每个核心文件的开头部分,提取寄存器数据,过滤已知的误报,并将每次崩溃标记为“返回空指针”、“栈对齐错误”或其他类型。    以2025年美国午夜之锤的行动为例,美国派出了超过125架飞机,使用了包括巨型钻地炸弹在内的先进武器,只为了袭击伊朗的三处核设施。    这次行动,美国拥有伊朗三处核设施的精确坐标,准备十分充足,可最后的结果却没有那么完美,因为其中两处核设施在山体中,并没有遭到致命性破坏。

八 |     不过这只是伊朗建造的冰山一角,这次伊朗首次公开地下军工生产线,完美解释了美伊冲突期间,伊朗为何能够长时间使用大量优质装备。

九 | 他们将该脚本并行应用于过去一年中的所有 Rockset 核心转储文件。他们很快就发现了相关性。    那么这时肯定有人会问了,伊朗为何要公布呢?继续扮猪吃老虎不好吗?这就要说到孙子兵法中的一句话:“不战而屈人之兵,善之善者也”。原本从症状上看属于同类的问题,实际上对应两组特征完全不同的崩溃事件。         这些因栈对齐错误导致的崩溃均源自同一个 Azure 区域,有明确的起始日期,而且从未出现在长期运行的节点上。团队追踪发现,这些崩溃源自一台物理主机,其 CPU 正在悄无声息地产生错误的结果。它既没有过热,也没有抛出机器检查异常,而只是数学运算默默出了错。将该主机从服务中移除后,因栈对齐错误导致的崩溃便完全消失了。         在剔除硬件崩溃问题后,剩余的由“返回空指针”导致的崩溃问题便变得可控了。        这次伊朗敢于公布地下军工生产线画面,一方面是对自己的军工生产实力有了足够的自信,说明伊朗几乎不害怕接下来的任何攻击行为。此前,团队曾排除了 C++ 异常展开的原因,因为他们认为自己找到了反例:在未使用异常的代码路径中发生了崩溃。    但不害怕不代表伊朗想要继续战斗,即使伊朗现在的军工实力很强大,可国家的发展也陷入了很大程度的停滞,毕竟战争是爆发在伊朗本土的。    所以伊朗这次公开展示,其实是在告诉美国,我现在有足够的实力和你继续战斗,但我想告诉你,继续打下去对你对我都不好,停战是目前最好的选择。

十 | 但这些反例全都来自有硬件损坏的故障集群。

十一 |     我们可以理解为伊朗对美国进行了武力威慑,让美国继续考虑是否要持续攻击伊朗。

十二 |     那么美国会咽下这口气吗?从经济角度来看的话,美国大概率是会选择停战的,因为这次美伊冲突美国没有占到便宜不说,消耗的金钱也是非常庞大的数字。一旦剔除了这些干扰因素,剩余的所有崩溃便都是发生在异常展开过程中了。         问题发生的根本原因是 GNU libunwind 的 _Ux86_64_setcontext 函数中有一个已经存在 18 年的竞争条件。

十三 | 在 C++ 异常展开过程中,libunwind 会在栈上合成一个 ucontext_t 结构体,填充所需的寄存器状态,然后调用 _Ux86_64_setcontext 将控制权转移给清理处理程序。    如果继续打下去,美国的经济说不定会被拖垮,因为作战区域远离美国本土,美国所耗费的运输等费用也会不断上升,即使强如美国,也要掂量一下自己的损失。问题在于:_Ux86_64_setcontext 在从旧结构体中读取指令指针的操作尚未完成之前,就将栈指针(%rsp)更新为指向新的栈帧。

十四 | 一旦 %rsp 发生变化,该结构体便不再属于活动栈的一部分,也不再受内核红区的保护。如果信号恰好在 %rsp 更新与 %rip 读取之间的这一时间窗口内到达,内核就会在该结构体之上构建其信号帧,指令指针遭到破坏,函数便会跳转到 NULL 或垃圾地址。    最关键的是,到了那个时候,其他国家是不会对美国客气的,美国常年树立的霸主地位也会受到很大的冲击。        除此之外,伊朗目前的反抗情绪一定会空前高涨,因为伊朗民众看到了更大的希望。

十五 |          竞争窗口的宽度正好为一条指令。    伊朗这次选择公布“底牌”,让那些对国防发展信心不足的民众,狠狠吃了一颗定心丸,他们对伊朗的未来充满了信心。以现代处理器的时钟频率计算,这大约相当于 100 皮秒。在大多数程序中,这种情况根本不会被触发。OpenAI 的 Rockset 使用了 timer_create 函数,每隔几毫秒的 CPU 时间就发送一次 SIGUSR2 信号,为的是实现轻量级的按查询记账,这样产生的信号发送事件远多于传统的应用程序。    而对于前线作战的士兵,在看到如此强大的装备实力后,也不会再畏惧和美军继续作战,要知道在无人机等装备的优势下,伊朗军队和美军的差距可以说被无限制缩小。    再简单一点说,在不启用核武器的情况下,伊朗完全有能力和美国进行持久作战,还能够进行长期对等反制,这还是在美国长期封锁的情况下完成。    仅仅是一次公开画面,伊朗就完成了对美博弈的姿态转变,这意味着美国对伊朗的武力威慑彻底失效的同时,中东地区的地缘博弈也发生了很大的转变,美国的那套威慑彻底不灵了。

十六 | 返回,查看更多

十七 | 正是这种高频的信号发送,将只在理论上可能发生的竞争状况转化成了实际生产环境中的崩溃。         该团队将一个修复方案和一个自包含的重现示例提交到了 GNU libunwind,并通过验证证实,其他展开器(如 libgcc)不存在这个问题。该修复方案通过重新排序指令,确保在更新 %rsp 之前先读取 %rip,从而彻底消除了这个时间窗口。         该团队对这一教训的总结值得全文引用:          最重要的步骤并非巧妙地解读汇编代码,也不是对细节的深入了解,而是构建一个高质量的数据集。如果没有这个数据集,我们就会把两种截然不同的现象混为一谈,并试图通过推理来理清这种混乱。一旦获得了准确且完整的全量数据,问题的结构便显而易见了。

十八 |          如果你的团队正在排查难以解释的生产环境崩溃问题,请检查你们是否将多个 Bug 混为一谈。那些看似与所有假设都不相符的症状,实际上可能并不矛盾;它们可能与两个不同的假设相符,而你却无意中将它们混淆了。洞察问题结构的最快途径,并非对单个案例进行更深入的分析,而是获取涵盖所有故障案例的完整、带标签的数据。         这篇完整的工程技术博文包含了详细的栈内存示意图、存在漏洞的汇编指令,以及揭示出两种不同类型故障的崩溃率可视化图表。         https://www.infoq.com/news/2026/07/openai-libunwind-core-dumps/          声明:本文由 InfoQ 翻译,未经许可禁止转载。

十九 |

Current article:http://www.liangkuataosanxuanmiancen.sbs/60et/wf26.html

Published on:03:11:11


相关新闻

最后更新

热门新闻