Hacker News 中文摘要

RSS订阅

"迷你沙虫再袭:314个npm软件包遭劫持" -- Mini Shai-Hulud Strikes Again: 314 npm Packages Compromised

文章摘要

npm账号atool遭入侵,攻击者在22分钟内自动发布了317个包的637个恶意版本,包括高下载量的size-sensor等。恶意脚本窃取AWS、Kubernetes、GitHub等各类凭证,并通过GitHub公开仓库外泄数据。在CI环境中还会劫持GitHub OIDC令牌、签名工件并注入持久化代码,手法与此前的SAP入侵相同。

文章总结

npm供应链攻击事件:317个软件包遭恶意代码植入

事件概述

2026年5月19日,npm账户atool(i@hust.cc)遭入侵,攻击者在22分钟内发布了317个软件包的637个恶意版本。受影响的高频下载包包括:
- size-sensor(月下载量420万次)
- echarts-for-react(380万次)
- @antv/scale(220万次)
- timeago.js(115万次)

恶意载荷为一个498KB的混淆Bun脚本,与三周前SAP攻击事件中使用的Mini Shai-Hulud工具包特征一致,包括相同的扫描架构、凭证正则匹配模式和混淆方式。


攻击技术细节

  1. 执行路径

    • 所有受感染版本均添加了preinstall钩子(bun run index.js
    • 630个版本通过optionalDependencies注入GitHub仓库antvis/G2的伪造提交(orphan commits),利用GitHub的fork对象共享机制隐藏恶意代码
  2. 数据窃取

    • 窃取目标:AWS全链凭证(环境变量/配置文件/EC2元数据)、Kubernetes服务账户令牌、HashiCorp Vault密钥、GitHub PAT、npm令牌、SSH密钥等
    • 数据外泄方式:通过被盗GitHub令牌创建公开仓库,将数据伪装成Git对象提交(User-Agent伪造为python-requests/2.31.0
  3. 持久化手段

    • CI/CD注入:在.github/workflows/codeql.yml中植入工作流,泄露GitHub Actions机密
    • AI代理劫持:通过Claude Code的SessionStart钩子和VS Code的folderOpen任务实现代码执行
    • 系统服务:部署kitty-monitor后台服务(Linux/macOS),通过GitHub提交搜索API接收RSA-PSS签名的远程指令
  4. 容器逃逸
    检测到Docker socket时,通过特权容器绑定主机文件系统实现逃逸。


影响范围

  • 自动升级风险:使用语义版本范围(如^3.0.6)的项目会解析到恶意版本
  • 凭证泄露:覆盖主流云服务(AWS/GCP/Azure)、数据库连接字符串、Stripe/Slack密钥等
  • 供应链污染:通过GitHub OIDC交换获取npm发布令牌,使用被盗身份签署Sigstore工件

应对措施

  1. 立即检查

    • 锁定文件中2026-05-19发布的受影响版本(完整列表见文末)
    • 排查系统服务kitty-monitor和文件~/.local/share/kitty/cat.py
  2. 防护建议

    • 使用Package Manager Guard (pmg)拦截安装阶段的恶意包
    • 启用依赖冷却期(dependency cooldown)防御突发发布攻击
  3. 凭证轮换
    若安装过受感染版本,需轮换所有相关凭证(包括CI/CD环境、云服务账户等)。


完整受感染包列表

共317个包被植入恶意代码,包括:
- @antv系列组件(如@antv/g6@antv/x6
- 高频工具包(如jest-canvas-mocktimeago-react
- 工具链插件(如babel-plugin-version

(完整清单参见原文表格)


该事件暴露npm生态的单点信任风险,建议企业加强锁文件校验和签名验证。更多技术分析可参考SafeDep完整报告

(注:本文为技术摘要,完整细节含加密算法、C2通信模式等需查阅原文)

评论总结

以下是评论内容的总结,平衡呈现不同观点并保留关键引用:

  1. 对npm生态系统的普遍担忧

    • 多位用户表达对npm安全性的不信任,认为其频繁出现安全问题
    • 关键引用:
      • "another day, another npm hack." (Outlook5813)
      • "Because of course it's npm" (moi2388)
  2. 依赖管理的安全困境

    • 开发者陷入既不敢更新依赖又不敢不更新的两难境地
    • 关键引用:
      • "I'm afraid to update any of my project's dependencies, and I'm also afraid to run them locally without some locked down VM" (fnoef)
      • "Node is the Visual Basic of our day...All that ease-of-development is being paid for by ease-of-rooting" (aa-jv)
  3. 解决方案建议

    • 技术方案:
      • 使用min-release-age设置避免新包(AgentME)
      • 采用沙盒环境(devcontainer/VM/Raspberry Pi)(mentalgear, jgrahamc)
    • 文化改变:
      • 建议改变快速发布文化,转向稳定版本(wlkr)
    • 关键引用:
      • "My feeling is that we might need to change the culture of lazy versioning with rapid releases" (wlkr)
      • "aube now has a 'jailBuilds' flag that restricts access to network/filesystem access" (rubnogueira)
  4. 对未来形势的悲观预期

    • 认为安全攻防是猫鼠游戏,现有方案可能很快被突破
    • 关键引用:
      • "But this feels like a cat/mouse game" (rubnogueira)
      • "the models will be good enough in social engineering that we are still running a losing game" (mentalgear)
  5. 极端安全实践

    • 部分用户采取极端隔离措施:
      • 完全卸载本地环境,仅使用容器(mentalgear)
      • 使用可随时重置的Raspberry Pi开发机(jgrahamc)
    • 关键引用:
      • "I have already uninstalled node, python and all package managers from my machine" (mentalgear)
      • "my development machine is a Raspberry Pi that I can image any time by removing the SD card" (jgrahamc)