事故报告:CVE-2024-YIKES
摘要
一份讽刺性的事故报告描述了一场灾难性的多阶段供应链攻击,该攻击始于一个被篡改的 JavaScript 依赖项,并在 Rust 和 Python 生态系统中蔓延,最终因一只挖矿蠕虫的“意外介入”而得以解决。
暂无内容
查看缓存全文
缓存时间: 2026/05/10 18:44
# 事故报告:CVE-2024-YIKES
来源: https://nesbitt.io/2026/02/03/incident-report-cve-2024-yikes.html
**报告提交时间:** 03:47 UTC **状态:** 已解决(纯属意外)**严重程度:** 严重 → 灾难性 → 莫名没事 **持续时间:** 73 小时 **受影响系统:** 是
**执行摘要:** 发生了一起安全事件。目前已解决。我们高度重视安全问题。请参阅此前发布的 14 份事故报告,以了解我们有多重视。
### 摘要
JavaScript 生态系统中一个被篡改的依赖项导致了凭证泄露,进而引发了一起针对 Rust 压缩库的供应链攻击。该库被 Python 构建工具作为本地依赖引入,从而向约 400 万开发者分发了恶意软件,随后却被一个无关的加密货币挖矿蠕虫意外修复。
### 时间线
**第 1 天,03:14 UTC** — `left-justify`(周下载量 8.47 亿次)的维护者 Marcus Chen 在 Twitter 上报告称,他的交通卡、一台旧笔记本电脑以及“Kubernetes 吐出来的某种看起来很重要的东西”在其公寓被盗。他并未立即将此与包安全性联系起来。
**第 1 天,09:22 UTC** — Chen 尝试登录 nmp 注册表。他的硬件 2FA 密钥不见了。他在 Google 上搜索购买备用 YubiKey 的地方。搜索结果顶部的 AI 概览链接指向 “yubikey-official-store.net”,这是一个六小时前注册的钓鱼网站。
**第 1 天,09:31 UTC** — Chen 在钓鱼网站上输入了他的 nmp 凭证。网站感谢他的购买,并承诺在 3-5 个工作日内送达。
**第 1 天,11:00 UTC** — 发布了 `[email protected]`。更新日志写着“性能改进”。该包现在包含一个 postinstall 脚本,将 `.npmrc`、`.pypirc`、`~/.cargo/credentials` 和 `~/.gem/credentials` 外泄到位于某个国家的服务器,攻击者错误地认为该国与任何人都没有引渡条约。
**第 1 天,13:15 UTC** — 针对 `left-justify` 开启了一个支持工单,标题为“为什么你们的 SDK 在窃取我的 .npmrc”。该工单被标记为“低优先级 - 用户环境问题”,并在 14 天无活动后自动关闭。
**第 1 天,14:47 UTC** — 在被外泄的凭证中包括:`vulpine-lz4` 的维护者,这是一个用于“极速 Firefox 主题 LZ4 解压”的 Rust 库。该库的标志是一只戴着墨镜的卡通狐狸。它在 GitHub 上有 12 个星标,但是 `cargo` 本身的传递依赖。
**第 1 天,22:00 UTC** — `vulpine-lz4` 版本 0.4.1 发布。提交信息是“修复:解决流式解压中的边缘情况”。实际更改添加了一个 `build.rs` 脚本,如果主机名包含 “build” 或 “ci” 或 “action” 或 “jenkins” 或 “travis”,或者不可解释地包含 “karen”,则下载并执行 shell 脚本。
**第 2 天,08:15 UTC** — 安全研究员 Karen Oyelaran 注意到她的个人笔记本电脑触发了该载荷,发现了这个恶意提交。她开启了一个 issue,标题为“你们的构建脚本从互联网下载并运行 shell 脚本吗?”。该 issue 无人回应。合法的维护者已在 EuroMillions 中赢得 230 万欧元,正在研究在葡萄牙养山羊。
**第 2 天,10:00 UTC** — 一家财富 500 强 `snekpack` 客户的工程副总裁从一篇标题为“贵公司是否受 left-justify 影响?”的 LinkedIn 帖子中得知此事。他正在毛伊岛的海滩上,想知道为什么没有早点通知他。其实早就通知他了。
**第 2 天,10:47 UTC** — `#incident-response` Slack 频道短暂转向了一个 45 条消息的线程,讨论在美国英语中 “compromised” 是否应该用 ‘z’ 拼写。有人建议线下讨论。
**第 2 天,12:33 UTC** — shell 脚本现在针对特定受害者:`snekpack` 的 CI 流水线,这是一款被 60% 名称中包含 “data” 的 PyPI 包使用的 Python 构建工具。`snekpack` 引入 `vulpine-lz4` 因为 “Rust 具有内存安全性”。
**第 2 天,18:00 UTC** — `snekpack` 版本 3.7.0 发布。恶意软件现在开始在全球开发者的机器上安装。它将 SSH 密钥添加到 `~/.ssh/authorized_keys`,安装一个仅在周二激活的反向 shell,并将用户的默认 shell 更改为 `fish`(最后这种行为被认为是一个 bug)。
**第 2 天,19:45 UTC** — 第二位不相关的安全研究员发布了一篇博客文章,标题为“我发现了一起供应链攻击并报告给了所有错误的人”。这篇文章长达 14,000 字,并包含了七次 “在这种经济环境下?” 的短语。
**第 3 天,01:17 UTC** — 奥克兰的一名初级开发者在调试无关问题时发现了恶意代码。她开启了一个 PR 以还原 `snekpack` 中引入的 `vulpine-lz4`。PR 需要两个批准。两位批准者都在睡觉。
**第 3 天,02:00 UTC** — `left-justify` 的维护者收到了来自 yubikey-official-store.net 的 YubiKey。它是一个 4 美元的 USB 驱动器,里面包含一个写着 “lol” 的 README。
**第 3 天,06:12 UTC** — 一个名为 `cryptobro-9000` 的无关加密货币挖矿蠕虫开始通过 `jsonify-extreme` 包中的漏洞传播,该包 “让 JSON 更像 JSON,现在支持嵌套注释”。蠕虫的载荷平淡无奇,但其传播机制包括在受感染机器上运行 `npm update` 和 `pip install --upgrade`,以最大化未来操作的可攻击面。
**第 3 天,06:14 UTC** — `cryptobro-9000` 意外将 `snekpack` 升级到 3.7.1 版本,这是一个由一位困惑的共同维护者推送的合法版本,他 “没明白大家在吵什么” 并还原了之前的 `vulpine-lz4` 引入版本。
**第 3 天,06:15 UTC** — 恶意软件的周二反向 shell 激活了。那天确实是周二。然而,shell 连接到一个命令与控制服务器,该服务器本身被 `cryptobro-9000` 攻破,忙得无法响应。
**第 3 天,09:00 UTC** — `snekpack` 维护者发布了安全公告。它只有四句话,包括 “出于谨慎考虑” 和 “没有活跃利用的证据”,这在技术上是真实的,因为并没有主动寻找证据。
**第 3 天,11:30 UTC** — 一位开发者发推:“我更新了我所有的依赖项,现在我的终端变成了 fish???” 该推文获得了 47,000 个赞。
**第 3 天,14:00 UTC** — `vulpine-lz4` 的被入侵凭证被轮换。合法的维护者通过电子邮件从他的新山羊农场得知,他说他 “两年没碰那个仓库了” 并且 “以为 Cargo 的 2FA 是可选的”。
**第 3 天,15:22 UTC** — 事故宣布解决。安排了事后回顾,然后又重新安排了三次。
**第 6 周** — 正式分配了 CVE-2024-YIKES。该建议一直停留在禁运僵局中,因为 MITRE 和 GitHub 安全建议正在争论 CWE 分类。到 CVE 发布时,三篇 Medium 文章和一次 DEF CON 演讲已经详细描述了该事件。总损失:未知。受感染的机器总数:估计 420 万台。因加密货币蠕虫而得救的机器总数:也估计 420 万台。网络安全态势净变化:尴尬。
### 根本原因
一只叫 Kubernetes 的狗吃掉了 YubiKey。
### 促成因素
- nmp 注册表仍允许周下载量少于 1000 万的包仅使用密码认证
- Google AI 概览自信地链接到不应该存在的 URL
- Rust 生态系统的“小 crate”理念,从 npm 生态系统中盲目模仿,意味着一个名为 `is-even-number-rs` 且仅有 3 个 GitHub 星标的包可能在关键基础设施中成为四层传递依赖
- Python 构建工具为了“性能”引入 Rust 库,然后永远不再更新
- Dependabot 在 CI 通过后自动合并了 PR,而 CI 通过是因为恶意软件安装了 `volkswagen`
- 加密货币蠕虫比大多数初创公司拥有更好的 CI/CD 卫生习惯
- 没有人单独对此事故负责。然而,我们注意到 Dependabot PR 是由一名周五为最后一天的承包商批准的。
- 那天是周二
### 补救措施
1. 实施工件签名(来自 2022 年 Q3 事故的待办事项,仍在积压中)
2. 实施强制 2FA 已要求,但无济于事
3. 审计传递依赖项 有 847 个
4. 锁定所有依赖项版本 防止接收安全补丁
5. 不要锁定依赖项版本 使供应链攻击成为可能
6. 用 Rust 重写(手势指向 `vulpine-lz4`)
7. 希望出现仁慈的蠕虫
8. 考虑从事山羊养殖职业
### 客户影响
部分客户可能经历了次优的安全结果。我们正主动联系受影响的利益相关者,以提供对该情况的可见性。客户信任依然是我们的北极星。
### 关键教训
我们借此机会重新审视未来的安全态势。已成立一个跨职能工作组以就下一步行动达成一致。该工作组尚未召开会议。
### 致谢
我们要感谢:
- Karen Oyelaran,因为她的主机名匹配了正则表达式从而发现了此问题
- 奥克兰的初级开发者,她的 PR 在事故已经解决四小时后获得批准
- 首先发现此问题但报告给了错误人员的安全研究员
- `cryptobro-9000` 的作者,他们要求我们不提及姓名,但要求我们提及他们的 SoundCloud
- Kubernetes(那只狗),拒绝评论
- 安全团队,尽管一切混乱,仍在此报告上满足了 SLA
---
*本报告由法务审核,他们要求我们澄清 fish shell 不是恶意软件,只是有时感觉像那样。*
*这是本季度的第三份事故报告。作者提醒利益相关者,安全团队的人员编制请求自 2023 年 Q1 以来一直在积压中。*
相似文章
我对智能代理的信任危机:从 Prompt 注入到 gemini-cli 供应链泄露
Pillar Security 研究人员披露了 Google 的 gemini-cli 及其相关 GitHub 工作流中存在一个关键的 CVSS 10 漏洞(TrustIssues),该漏洞允许攻击者通过 Prompt 注入窃取密钥并破坏仓库供应链。
Mythos 发现 curl 漏洞
Daniel Stenberg 报告称,Anthropic 的 Mythos AI 模型在 curl 中发现了一个漏洞,突显了高级 AI 在安全审计中日益增长的作用,同时也指出了通过 Linux 基金会获取初始访问权限的障碍。
事故复盘:TanStack npm 供应链入侵事件
本文详细复盘了针对 TanStack npm 包的供应链攻击事件,涉及缓存投毒、OIDC 令牌提取及凭证窃取恶意软件。所有受影响版本均已弃用;建议用户轮换凭证。
Obsidian 插件被滥用于部署远程访问木马
安全研究人员发现了一场针对金融专业人士的社会工程攻击活动,该活动利用 Obsidian 插件部署 PHANTOMPULSE 远程访问木马。该恶意软件利用一种新颖的基于以太坊区块链的机制进行命令与控制通信,以逃避检测。
Dead.Letter (CVE-2026-45185) – XBOW 如何在 Exim 中发现未认证的远程代码执行漏洞
XBOW 披露了 CVE-2026-45185,这是一个存在于 Exim 邮件服务器中的严重未认证远程代码执行漏洞,由 TLS 处理中的释放后使用错误引起。本文详细阐述了技术漏洞的开发过程以及人工智能模型在漏洞发现中的作用。