当前位置: 首页 > news >正文

CVE - 2024 - YIKES 安全事件:依赖项感染致恶意软件分发,加密货币蠕虫意外“救场”

执行摘要

2026年2月3日,发生了一起安全事件,目前已解决。我们非常重视安全问题,如需了解我们对安全重视程度的详情,请查阅之前的14份事件报告。

概要

JavaScript生态系统中一个受感染的依赖项导致了凭证被盗,进而引发了对一个Rust压缩库的供应链攻击。这个Rust库被集成到一个Python构建工具中,在一个无关的加密货币挖矿蠕虫意外修复之前,该工具向大约400万开发者分发了恶意软件。

时间线

- 第1天,协调世界时03:14:`left - justify`(每周下载量8.47亿次)的维护者马库斯·陈在Twitter上报告,他的交通卡、一台旧笔记本电脑,以及“Kubernetes抛出的看起来很重要的东西”在他的公寓被盗。他当时并未立即将此事与包安全联系起来。

- 第1天,协调世界时09:22:陈试图登录npm注册表,发现他的硬件2FA密钥丢失。他在谷歌上搜索在哪里购买替换的YubiKey,搜索结果顶部的AI概览链接到了“yubikey - official - store.net”,这是一个六小时前注册的钓鱼网站。

- 第1天,协调世界时09:31:陈在钓鱼网站上输入了他的npm凭证。网站感谢他的购买,并承诺在3 - 5个工作日内发货。

- 第1天,协调世界时11:00:`[[email protected]](/cdn - cgi/l/email - protection)`发布,更新日志显示“性能改进”。该包现在包含一个安装后脚本,可将`.npmrc`、`.pypirc`、`~/.cargo/credentials`和`~/.gem/credentials`信息泄露到攻击者误以为与任何国家都没有引渡条约的一个国家的服务器上。

- 第1天,协调世界时13:15:针对`left - justify`开启了一个支持工单,标题为“为什么你的SDK正在泄露我的.npmrc文件”。该工单被标记为“低优先级 - 用户环境问题”,并在14天无活动后自动关闭。

- 第1天,协调世界时14:47:在泄露的凭证中,有`vulpine - lz4`(一个用于“极快的Firefox主题LZ4解压缩”的Rust库)的维护者凭证。该库的标志是一只戴着太阳镜的卡通狐狸,在GitHub上有12颗星,但它是`cargo`本身的一个传递依赖项。

- 第1天,协调世界时22:00:`vulpine - lz4`0.4.1版本发布,提交信息为“修复:解决流式解压缩中的边缘情况”。实际更改是添加了一个build.rs脚本,如果主机名包含“build”、“ci”、“action”、“jenkins”、“travis”或莫名其妙的“karen”,该脚本会下载并执行一个shell脚本。

- 第2天,协调世界时08:15:安全研究员凯伦·奥耶拉兰在她的个人笔记本电脑触发恶意负载后,注意到了这个恶意提交。她开启了一个问题,标题为“你的构建脚本从互联网下载并运行shell脚本?”该问题未得到回复。合法的维护者中了230万欧元的欧洲百万乐透大奖,正在葡萄牙研究山羊养殖。

- 第2天,协调世界时10:00:一家财富500强企业`snekpack`客户的工程副总裁从一篇LinkedIn帖子“你的公司是否受到left - justify的影响?”中得知了这起事件。他当时正在毛伊岛的海滩上,想知道为什么没有早点通知他,实际上他早就被通知了。

- 第2天,协调世界时10:47:#事件响应Slack频道短暂地转向了一个45条消息的线程,讨论在美式英语中“compromised”是否应该用“z”拼写。有人建议将这个讨论移到线下进行。

- 第2天,协调世界时12:33:shell脚本现在瞄准了一个特定的受害者:`snekpack`的CI管道。`snekpack`是一个Python构建工具,60%名称中包含“data”的PyPI包都在使用它。`snekpack`集成`vulpine - lz4`是因为“Rust内存安全”。

- 第2天,协调世界时18:00:`snekpack`3.7.0版本发布,恶意软件现在正在全球开发者的机器上安装。它会在`~/.ssh/authorized_keys`中添加一个SSH密钥,安装一个仅在周二激活的反向shell,并将用户的默认shell更改为`fish`(最后这个行为被认为是一个bug)。

- 第2天,协调世界时19:45:另一位无关的安全研究员发布了一篇博客文章,标题为“我发现了一起供应链攻击,并报告给了所有错误的人”。这篇文章有14000字,其中“在这种经济形势下?”这句话出现了七次。

- 第3天,协调世界时01:17:奥克兰的一名初级开发者在调试一个无关问题时注意到了恶意代码。她开启了一个拉取请求,以恢复`snekpack`中集成的`vulpine - lz4`版本。该拉取请求需要两个批准,而两个审批人都在睡觉。

- 第3天,协调世界时02:00:`left - justify`的维护者从yubikey - official - store.net收到了他的YubiKey,结果是一个价值4美元的USB驱动器,里面有一个README文件,上面写着“哈哈”。

- 第3天,协调世界时06:12:一个名为`cryptobro - 9000`的无关加密货币挖矿蠕虫开始通过`jsonify - extreme`(一个“让JSON更像JSON,现在支持嵌套注释”的包)的漏洞传播。该蠕虫的有效负载并不显著,但它的传播机制包括在受感染的机器上运行`npm update`和`pip install --upgrade`,以扩大未来攻击的范围。

- 第3天,协调世界时06:14:`cryptobro - 9000`意外地将`snekpack`升级到了3.7.1版本,这是一位困惑的联合维护者发布的合法版本,他“不明白大家在大惊小怪什么”,并恢复了之前集成的`vulpine - lz4`版本。

- 第3天,协调世界时06:15:恶意软件的周二反向shell激活了,当天正好是周二。然而,该shell连接到的命令和控制服务器本身被`cryptobro - 9000`攻陷,处于高负载状态,无法响应。

- 第3天,协调世界时09:00:`snekpack`的维护者发布了一份安全公告,公告只有四句话,包含“出于谨慎考虑”和“没有主动利用的证据”等表述,从技术上讲这是正确的,因为并没有去寻找相关证据。

- 第3天,协调世界时11:30:一名开发者发推文称:“我更新了所有依赖项,现在我的终端变成fish了???”这条推文获得了47000个赞。

- 第3天,协调世界时14:00:`vulpine - lz4`被盗用的凭证被重置。合法的维护者在他的新山羊农场通过电子邮件回复称,他“已经两年没有碰过那个仓库了”,并且“以为Cargo的2FA是可选的”。

- 第3天,协调世界时15:22:宣布事件解决。安排了一次回顾会议,但被重新安排了三次。

- 第6周:CVE - 2024 - YIKES正式分配。该安全公告一直处于保密状态,因为MITRE和GitHub安全公告部门在争论CWE分类。到CVE发布时,已经有三篇Medium文章和一场DEF CON演讲详细描述了这起事件。总损失:未知。受影响的机器总数:估计420万台。被加密货币蠕虫拯救的机器总数:同样估计420万台。网络安全态势变化:令人不安。

根本原因

一只名叫Kubernetes的狗吃掉了YubiKey。

促成因素

- npm注册表仍然允许每周下载量少于1000万次的包使用仅密码认证。

- Google AI概览自信地链接到不应该存在的URL。

- Rust生态系统从npm生态系统借鉴来的“小crate”理念,意味着一个名为`is - even - number - rs`、在GitHub上只有3颗星的包可能会成为关键基础设施的四级传递依赖项。

- Python构建工具为了“性能”集成Rust库,然后就不再更新它们。

- Dependabot在CI通过后自动合并了一个拉取请求,而CI通过是因为恶意软件安装了`volkswagen`。

- 加密货币蠕虫的CI/CD管理比大多数初创公司都要好。

- 没有一个人对这起事件负责。不过,我们注意到Dependabot的拉取请求是由一名承包商批准的,而他周五就是最后一天上班了。

- 当天是周二。

补救措施

1. ~~实施工件签名~~(2022年第三季度事件的行动项,仍在待办事项中)

2. ~~实施强制2FA~~ 已经是必需的,但没有起到作用

3. ~~审核传递依赖项~~ 有847个依赖项

4. ~~固定所有依赖项版本~~ 会阻止接收安全补丁

5. ~~不固定依赖项版本~~ 会导致供应链攻击

6. ~~用Rust重写~~(指了指`vulpine - lz4`)

7. 寄希望于仁慈的蠕虫

8. 考虑从事山羊养殖行业

客户影响

部分客户可能经历了不理想的安全状况。我们正在主动联系受影响的利益相关者,让他们了解情况。客户信任始终是我们的首要目标。

关键经验教训

我们借此机会重新审视未来的安全态势。已经成立了一个跨职能工作组来确定下一步行动,但该工作组尚未开会。

致谢

我们要感谢:

- 凯伦·奥耶拉兰,她因为主机名匹配正则表达式而发现了这个问题。

- 奥克兰的初级开发者,她的拉取请求在事件解决四小时后才被批准。

- 首先发现这个问题但报告给了错误人员的安全研究员。

- `cryptobro - 9000`的作者,他们要求我们不要提及他们的名字,但希望我们提到他们的SoundCloud。

- Kubernetes(那只狗),它拒绝发表评论。

- 安全团队,尽管困难重重,他们仍在规定时间内完成了这份报告。

本事件报告经过法务部门审核,他们要求我们澄清,fish shell不是恶意软件,只是有时候让人感觉像。

这是本季度的第三份事件报告。作者想提醒利益相关者,安全团队的人员招聘请求自2023年第一季度起就一直在待办事项中。

相关文章

- [现在有请塞姆弗女士](/2026/05/10/madame - semver - will - see - you - now.html) 2026年5月10日
塔罗牌不会说谎。

- [包管理器威胁模型](/2026/05/05/package - manager - threat - models.html) 2026年5月5日
包管理器安全中非CVE的部分。

- [包管理器CWE](/2026/05/04/package - manager - cwes.html) 2026年5月4日
包管理器中反复出现的弱点类别。

- [包管理器中的打补丁和分叉](/2026/05/01/patching - and - forking - in - package - managers.html) 2026年5月1日
当上流项目不理你时该怎么办。

- [GitHub Actions是最薄弱的环节](/2026/04/28/github - actions - is - the - weakest - link.html) 2026年4月28日
安妮·罗宾逊想和.github/workflows聊聊。

http://www.jsqmd.com/news/795877/

相关文章:

  • 123项复合专利+8000+乡镇网点+8年长质保:2026空气能头部品牌实力榜单 - 匠言榜单
  • 5分钟掌握B站缓存视频转换:m4s转MP4的完整教程
  • 应对海外检测算法:英文初稿AI率飙到80%怎么救?3款工具实测攻略
  • CANN/asc-devkit Where条件选择API
  • FanControl深度解析:5步打造Windows系统完美静音散热方案
  • CherryPy与数据库集成:SQLAlchemy和ORM模式详解
  • 为什么92%的AI团队在DP集成中失败?2026奇点大会披露4个致命反模式及对应生产级修复checklist
  • League-Toolkit终极指南:英雄联盟玩家的5大高效游戏辅助神器
  • csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:字符排序
  • 【信息科学与工程学】【数据科学】第四十九篇 Apache Hive 的函数0
  • FanControl终极指南:免费开源的Windows风扇智能控制软件
  • 终极Visual C++运行库修复指南:一劳永逸解决Windows软件兼容性问题
  • 在OpenClaw项目中集成Taotoken作为Agent模型供应商的实践
  • 3天搞定中文API大全:从菜鸟到高手的完整指南
  • 喜马拉雅音频下载技术重构:Go+Qt5混合架构的3大创新突破
  • S7-1200 PLC编程避坑指南:从振荡电路到浮点数计算,新手最容易犯的5个错误
  • 【审计专栏】招投标领域人工智能审计-01-算法的基础参数篇
  • 3步轻松实现AI智能图像分层:PSD自动生成终极指南
  • AI原生差分隐私落地难?2026奇点大会披露3类GPU加速噪声注入架构及TensorFlow/PyTorch原生适配代码
  • 告别本地安装!SAP顾问必看:手把手教你配置SICF并获取WEBGUI登录URL(含hosts文件修改)
  • 树状数组和线段树专题题解逆序对、区间异或、数线段差分、RMQ、最长连续交替子串、时间轴线段树
  • 终极FanControl中文使用指南:5分钟让你的Windows风扇控制更智能
  • m4s-converter终极指南:5秒解锁B站缓存视频,永久保存你的数字资产
  • 拆解OpenWrt的.ipk安装包:从文件结构到手动安装,彻底搞懂opkg底层逻辑
  • FanControl终极指南:如何在5分钟内解决Windows风扇控制难题
  • 告别会议室回音:用Python和WPE算法给你的语音识别模型做个‘降噪SPA’
  • 为什么Bebas Neue字体能成为设计师的终极免费选择?
  • QKeyMapper终极指南:免费实现键盘鼠标手柄全能映射的完整教程
  • 基于共识的捆绑算法(CBBA)的多智能体多任务分配问题——远程太空船交会和维修的 RPO 规划任务研究(Matlab代码实现)
  • 告别I2C的龟速:用STM32的SPI接口榨干ICM20948的性能(实测对比与配置优化)