文章摘要
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工具包特征一致,包括相同的扫描架构、凭证正则匹配模式和混淆方式。
攻击技术细节
执行路径
- 所有受感染版本均添加了
preinstall钩子(bun run index.js) - 630个版本通过
optionalDependencies注入GitHub仓库antvis/G2的伪造提交(orphan commits),利用GitHub的fork对象共享机制隐藏恶意代码
- 所有受感染版本均添加了
数据窃取
- 窃取目标:AWS全链凭证(环境变量/配置文件/EC2元数据)、Kubernetes服务账户令牌、HashiCorp Vault密钥、GitHub PAT、npm令牌、SSH密钥等
- 数据外泄方式:通过被盗GitHub令牌创建公开仓库,将数据伪装成Git对象提交(User-Agent伪造为
python-requests/2.31.0)
持久化手段
- CI/CD注入:在
.github/workflows/codeql.yml中植入工作流,泄露GitHub Actions机密 - AI代理劫持:通过Claude Code的
SessionStart钩子和VS Code的folderOpen任务实现代码执行 - 系统服务:部署
kitty-monitor后台服务(Linux/macOS),通过GitHub提交搜索API接收RSA-PSS签名的远程指令
- CI/CD注入:在
容器逃逸
检测到Docker socket时,通过特权容器绑定主机文件系统实现逃逸。
影响范围
- 自动升级风险:使用语义版本范围(如
^3.0.6)的项目会解析到恶意版本 - 凭证泄露:覆盖主流云服务(AWS/GCP/Azure)、数据库连接字符串、Stripe/Slack密钥等
- 供应链污染:通过GitHub OIDC交换获取npm发布令牌,使用被盗身份签署Sigstore工件
应对措施
立即检查
- 锁定文件中2026-05-19发布的受影响版本(完整列表见文末)
- 排查系统服务
kitty-monitor和文件~/.local/share/kitty/cat.py
防护建议
- 使用Package Manager Guard (pmg)拦截安装阶段的恶意包
- 启用依赖冷却期(dependency cooldown)防御突发发布攻击
凭证轮换
若安装过受感染版本,需轮换所有相关凭证(包括CI/CD环境、云服务账户等)。
完整受感染包列表
共317个包被植入恶意代码,包括:
- @antv系列组件(如@antv/g6、@antv/x6)
- 高频工具包(如jest-canvas-mock、timeago-react)
- 工具链插件(如babel-plugin-version)
(完整清单参见原文表格)
该事件暴露npm生态的单点信任风险,建议企业加强锁文件校验和签名验证。更多技术分析可参考SafeDep完整报告。
(注:本文为技术摘要,完整细节含加密算法、C2通信模式等需查阅原文)
评论总结
以下是评论内容的总结,平衡呈现不同观点并保留关键引用:
对npm生态系统的普遍担忧
- 多位用户表达对npm安全性的不信任,认为其频繁出现安全问题
- 关键引用:
- "another day, another npm hack." (Outlook5813)
- "Because of course it's npm" (moi2388)
依赖管理的安全困境
- 开发者陷入既不敢更新依赖又不敢不更新的两难境地
- 关键引用:
- "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)
解决方案建议
- 技术方案:
- 使用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)
- 技术方案:
对未来形势的悲观预期
- 认为安全攻防是猫鼠游戏,现有方案可能很快被突破
- 关键引用:
- "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)
极端安全实践
- 部分用户采取极端隔离措施:
- 完全卸载本地环境,仅使用容器(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)
- 部分用户采取极端隔离措施: