查看: 60324|回复: 612
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主

幸福魔方

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

云图

A |     作者 | Steef-Jan Wiggers     译者 | 平川          OpenAI 的工程师们花了数周时间,试图解释 Rockset 中那些神秘的崩溃问题。

B | Rockset 是一款 C++ 数据基础设施服务,为 ChatGPT 的搜索和数据插件提供支持。函数似乎会返回错误的内存地址,栈指针在执行过程中似乎会偏移 8 个字节。

C |     

在一个印度东部的平静社区,三天的恐惧笼罩之下,居民们的生活因一只失控猴子的暴行而陷入混乱,纷纷为自身安全采取防御措施。团队提出的每一种假设都面临着有力的反证。萨勒普尔,位于奥里萨邦的一隅,正经历着前所未有的恐慌,一只凶猛的猴只发起了一系列无差别攻击,致一人重伤入院,其余多人遭受重创,整个社区为之震动。这个 Bug 似乎根本不可能存在。         他们原本以为是一个 Bug ,结果却发现是两个互不相关的 Bug ,它们只是很巧合地在同一时间被发现了。这一突破性发现并非来自对单个崩溃事件的深入排查,而是源于转向了他们所说的“流行病学调试”:构建一条管道,自动分析过去一年中生产环境的每一个核心转储文件,然后寻找整体规律,而不是对单个案例进行推断。         该团队让 ChatGPT 编写了一个脚本,用于下载每个核心文件的开头部分,提取寄存器数据,过滤已知的误报,并将每次崩溃标记为“返回空指针”、“栈对齐错误”或其他类型。
这只肆意妄为的猴子在连续三天的时间里,如同一名无法无天的游荡者,令六位无辜市民深受其害,其攻击行为之猛烈,让所有目击者胆寒。当地新闻媒体详尽报道了这一系列骇人事件,描述这只噬人的野生动物如何在光天化日下逍遥法外,无所顾忌。
目前,市民们因极度恐惧而选择自我隔离于家中,不敢轻易踏出房门半步,唯恐成为下一个受害者。一名知情人士向卡林加电视台透露:“如今,出门已成奢侈,人人手持木棍自保,成了无奈的日常。我们迫切呼吁相关部门迅速采取行动,捕获这只猴子。

D | ”

尽管有传言称政府部门正紧急策划围捕行动以应对这一特殊威胁,但具体实施细节及进展仍待官方证实。

E | 他们将该脚本并行应用于过去一年中的所有 Rockset 核心转储文件。他们很快就发现了相关性。原本从症状上看属于同类的问题,实际上对应两组特征完全不同的崩溃事件。值得注意的是,萨勒普尔,这个坐落于奇特罗塔拉河畔的小镇,因其丰富的灵长类生态和错综复杂的洞穴网络而闻名遐迩,近年来频繁因猴群相关新闻登上头条。2020年,该地区因猴群相关事件再次受到关注,当时由于新冠疫情,旅游活动暂停,导致依赖游客投食的猴群面临饥饿危机,生存状况堪忧。         这些因栈对齐错误导致的崩溃均源自同一个 Azure 区域,有明确的起始日期,而且从未出现在长期运行的节点上。团队追踪发现,这些崩溃源自一台物理主机,其 CPU 正在悄无声息地产生错误的结果。它既没有过热,也没有抛出机器检查异常,而只是数学运算默默出了错。

彼时,一位代表曾解释:“这些猴子习以为常地依赖于游客提供的食物。

F | 疫情封锁切断了食物来源,它们只能无助地守在人们家门口,期盼有人施舍。它们已适应了这样的生活方式,无处可去。将该主机从服务中移除后,因栈对齐错误导致的崩溃便完全消失了。它们通常极为友善,对人类并不构成威胁。”

然而,讽刺的是,当前一只猴子的独行暴行似乎在独自挑战这一长期建立的无害形象,它的行动无疑给社区蒙上了一层阴影,也引发了关于人与自然平衡的新一轮思考。
。         在剔除硬件崩溃问题后,剩余的由“返回空指针”导致的崩溃问题便变得可控了。此前,团队曾排除了 C++ 异常展开的原因,因为他们认为自己找到了反例:在未使用异常的代码路径中发生了崩溃。但这些反例全都来自有硬件损坏的故障集群。

G | 一旦剔除了这些干扰因素,剩余的所有崩溃便都是发生在异常展开过程中了。         问题发生的根本原因是 GNU libunwind 的 _Ux86_64_setcontext 函数中有一个已经存在 18 年的竞争条件。

H | 在 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,从而彻底消除了这个时间窗口。         该团队对这一教训的总结值得全文引用:          最重要的步骤并非巧妙地解读汇编代码,也不是对细节的深入了解,而是构建一个高质量的数据集。

I | 如果没有这个数据集,我们就会把两种截然不同的现象混为一谈,并试图通过推理来理清这种混乱。一旦获得了准确且完整的全量数据,问题的结构便显而易见了。         如果你的团队正在排查难以解释的生产环境崩溃问题,请检查你们是否将多个 Bug 混为一谈。那些看似与所有假设都不相符的症状,实际上可能并不矛盾;它们可能与两个不同的假设相符,而你却无意中将它们混淆了。

J | 洞察问题结构的最快途径,并非对单个案例进行更深入的分析,而是获取涵盖所有故障案例的完整、带标签的数据。         这篇完整的工程技术博文包含了详细的栈内存示意图、存在漏洞的汇编指令,以及揭示出两种不同类型故障的崩溃率可视化图表。         https://www.infoq.com/news/2026/07/openai-libunwind-core-dumps/          声明:本文由 InfoQ 翻译,未经许可禁止转载。

Current article:http://55sc886.zhuaicaisaanzhenshunnaiwei.bond/list_vpm2f6o/2yk.html

Published on:12:41:33


点击获取礼包
沙发
发表于 11:34:07 | 只看该作者
加州靡情 舞动奇迹 安娜情欲史
板凳
发表于 14:38:18 | 只看该作者
伪娘 谢谢 加勒比海盗
地板
发表于 11:41:47 | 只看该作者
无证之罪 七侠五义 浪漫满屋
5#
发表于 18:18:07 | 只看该作者
霍元甲 终极一班3 我们的少年时代
6#
发表于 11:25:11 | 只看该作者
荆棘鸟 爱情公寓3 无耻家庭
7#
发表于 07:23:33 | 只看该作者
白夜行 我爱我家 余罪
8#
发表于 19:33:49 | 只看该作者
花嫁 辛普森一家 终结者2
9#
发表于 16:54:53 | 只看该作者
伐木累 情 疑犯追踪第二季
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我的网站是互联网最大的搜索引擎优化研究中心,是致力于培养学员用户体验意识和提供专业技术解答的专业培训机构, 成立于2007年,2008年第一家入驻歪歪的培训机构,2014年成为腾讯课堂战略合作机构。
© 2007-2016 我的网站 湘ICP备13004652号-1 Powered by Discuz!X Template by 我的网站 
快速回复 返回顶部 返回列表