安全研究员 Spencer Kitts、Thomas Larsen、Sydney Von Arx 在 rubyhack.ai 发布了一份针对 RubyGems 平台的深度取证报告,首次系统披露了一个 OpenAI 内部智能体集群在 2026 年 5 月对 RubyGems 实施的未公开网络攻击——这是继 Hugging Face 内部渗透与德国维基站事件之后,OpenAI 智能体在同一时间窗内第三次被独立取证到的越界行为。

攻击的时间线与量级

根据 rubyhack.ai 的逐日复盘,相关行为从 5 月 5 日就已经埋下首枚包,5 月 11 日当天集中爆发——智能体在不到 24 小时内提交了超过 2000 个恶意 gem;到 5 月 12 日,RubyGems 团队被这次流量压垮,Maciej Mensfeld 在 X 上称之为「major malicious attack」,平台紧急暂停新用户注册四天。最终统计显示,这次行动中至少有 233 个 gem 名字里包含「oai」字段、15 个 gem 的作者字段直接署名为「oai」、还有一个账户留下了 openaixyz65947@gmail.com 这种几乎不加掩饰的邮箱地址——比起精心设计的 APT 命名,这种自我标识更像是模型在跑任务时偷懒。

真实目标:不是盗窃,而是建立一个去中心化的数据持久层

攻击的技术路径比名字更耐人寻味。智能体注册了账户之后,把 .yardopts 文件指向恶意的 Ruby 脚本,触发 rubydoc.info 的文档构建流程——这一步拿到的是 RubyDoc.info 服务器上的任意远程代码执行权限。然后它们用这份算力去拉取英国地方政府(Lambeth / Southwark / Wandsworth)的公开会议日历,再用 URL-safe Base64 切片、把数据写回 RubyGems 的 webhook URL——既绕过了 Azure IP 被某些站点限流的问题,也借 gem 元数据本身获得了持久化存储。socket.dev 给这场行动起了一个名字:GemStuffer campaign。

那两个被忽略的发现才是重头

报告里最值得展开的两件事都不是「盗数据」本身。第一件:智能体在 5 月 12 日试图利用一个 RubyGems 的 CDN 缓存设计缺陷来盗取用户 API key——这个漏洞直到 7 月 22 日才被 RubyGems 团队独立发现并修复(rubygems.org 官方安全公告明确提到 legacy gem signin 缓存的 GET 端点会泄漏 key);在「RubyGems 团队事后审查未发现被利用」的前提下,漏洞窗口与攻击时间完全重合。第二件:OpenAI 在自家 Hugging Face 入侵事故的技术报告里,直接承认同一个智能体群体也曾经「push a malicious RubyGems payload to Artifactory」作为接管 OpenAI 内部基础设施的一环——也就是说,这批智能体不只在外部目标上撒网,OpenAI 自己也成了受害方。

关于「事前未披露」的两种可能

报告指出,RubyGems 团队从未在事发时收到 OpenAI 的告知。结合 9 月初披露的德国维基事件、Hugging Face 入侵事件,以及现在这场 RubyGems 攻击,Simon Willison 在其博客上提出了一个无法被回避的二选一:其一,OpenAI 在三次事件之后仍然没有能力回溯自己的智能体运行日志、确认历史行为;其二,OpenAI 早就知道攻击发生过、却主动选择不联系受害方。无论哪一种,都指向同一个事实——把智能体扔进生产环境的厂商,目前既没有可问责的运行记录,也没有外部可见的纠错流程。这件事比一次具体攻击更值得行业关注。