OpenAI通过人口级核心转储分析修复18年老漏洞

2 阅读3分钟视野
OpenAI通过人口级核心转储分析修复18年老漏洞

调查背景

OpenAI 的 ChatGPT 在推理时依赖高吞吐量的数据检索服务——内部代号 Rockset。该服务使用 C++ 实现,以追求极致性能,却也因缺乏内存安全检查而容易出现段错误。2026 年 5 月底,运维监控发现多起异常退出,堆栈显示返回地址指向空指针或栈指针错位,导致整个查询节点失效。

崩溃表现

  • 返回空指针:函数返回后指向 0x0,内核立刻终止进程。
  • 栈指针错位:%rsp 偏移 8 字节,随后在返回阶段触发 SIGSEGV。
  • 频率约为每日 10+ 次,跨多个可用区,初步排查未发现统一代码路径。

数据驱动的流行病学方法

团队放弃单例调试,转而构建 核心转储人口库

  1. 使用 ChatGPT 编写脚本,批量下载 Azure Blob 中的核心文件。
  2. 自动抽取寄存器、栈帧信息并标记为 return‑to‑nullmisaligned‑stack其他
  3. 将标签结果与节点元数据(地区、SKU、内核版本)关联,生成结构化表格。

该数据集在数小时内完成,随即显现出两条截然不同的聚类趋势。

两大根本原因

1. 硬件故障(Bad Host)

  • 崩溃全部集中在同一 Azure 物理主机上。
  • 该主机的 CPU 在高负载下出现算术错误,导致寄存器值被篡改。
  • 将其下线后,所有 misaligned‑stack 事件即刻消失。

2. GNU libunwind 竞态缺陷(18 年老 Bug)

  • 剩余的 return‑to‑null 核心均在异常展开阶段触发。
  • GNU libunwind 在 _Ux86_64_setcontext 中先修改 %rsp,再读取同一栈上保存的 ucontext。
  • 若此时正好收到频繁的 SIGUSR2(OpenAI 为了细粒度 CPU 计时而使用的自定义信号),信号处理器会在 %rsp‑128 处写入新帧,覆盖尚未读取的返回地址。
  • 竞争窗口仅一条指令宽,概率极低但在 高异常抛出率 + 高频信号 的组合下被放大,符合每日数十次的观测频率。

解决方案与后续措施

  • 硬件层面:将故障主机加入黑名单,完善自动检测脚本,实现故障节点的快速剔除。
  • 软件层面:从 GNU libunwind 切换至 libgcc unwinder,避免该竞态路径。
  • 代码层面:在致命信号处理器中加入寄存器快照,便于后续无需 core dump 即可定位同类异常。
  • 运营层面:更新 Runbook,加入“硬件异常+库竞态双重检查”流程,提升团队对跨层面故障的感知速度。

启示

这次调试展示了 人口级诊断 在大规模 AI 基础设施中的价值:只有在完整、干净的数据集支撑下,才能把表面上的单一症状拆解为多因子组合。未来,OpenAI 将继续投入自动化监控、核心转储分析以及跨团队协作平台,确保底层平台的可靠性不成为模型能力的瓶颈。

本文是对第三方新闻源的主观解读。消息可能出现过时、不准确、歧义或错误的地方,仅供参考使用。点击此处查看消息源。