![]()
axios上周的下载量刚好突破1亿次。这个数字平时是勋章,4月1日那天成了警报器。
两个恶意版本——1.14.1和0.30.4——在npm仓库存活了足够长的时间,让部分开发者的CI流水线和本地环境完成了"自杀式更新"。攻击者没碰axios的核心代码,而是塞进去一个名叫plain-crypto-js的依赖包。这个包的唯一功能,是在安装时自动拨号回家,下载第二阶段的远程控制木马(RAT)。
账户劫持: maintainer被锁在门外的39分钟
安全公司StepSecurity的溯源显示,发布来自被劫持的npm账户"jasonsaayman"——axios项目的主要维护者。攻击者把账户邮箱换成了ProtonMail匿名邮箱,直接用npm命令行工具手动推送,完全绕过了项目的GitHub Actions CI/CD流水线。
「维护者在推送期间被锁在账户外。」StepSecurity的CTO Ashish Kurmi还原了时间线。这意味着开发者习以为常的"代码审查→自动化构建→签名发布"链条,在关键时刻形同虚设。
两个受污染版本在39分钟内相继上线。攻击者甚至没打算长期潜伏——plain-crypto-js的post-install脚本会根据目标系统自动选择武器:macOS上伪装成系统守护进程,Windows调用PowerShell,Linux则部署Python后门。干完活就自毁痕迹,像从未来过。
![]()
预谋18小时:这不是 opportunistic 攻击
StepSecurity在报告中用了罕见的措辞定调。Kurmi的原话是:「恶意依赖包提前18小时就位。三套操作系统载荷预先编译。两条发布分支39分钟内全部命中。所有痕迹设计为自毁。这是针对npm前十包的最具操作复杂性的供应链攻击之一。」
18小时的 staging 时间,说明攻击者清楚自己在等什么。他们没有随机扫描弱密码,而是精准锁定了一个高价值目标——axios的维护者账户——并在控制后迅速完成武器化部署。这种节奏感,和常见的"捡到钥匙就开门"式npm投毒完全不同。
npm生态的脆弱性在于:一个包的信任链条,往往终结于某个具体的人。当那个人失去对账户的控制,下游数百万个项目毫无察觉地继承风险。
供应链攻击的"沙丘"化:从 opportunistic 到 infrastructure
axios事件不是孤立案例。StepSecurity在报告中提到了"Shai-Hulud"及其2.0版本——这两个命名取自《沙丘》中吞噬一切的巨型沙虫的 campaign,代表了攻击者策略的转向:不再满足于单次凭证窃取,而是试图在开发者工具链中建立持久化据点。
![]()
攻击者开始把软件供应链本身当作基础设施来经营。种子恶意包、收割凭证、维持访问、横向移动——这套 playbook 已经从APT组织的军火库,下沉到针对开源生态的常规操作。
axios的周下载量意味着,即使污染版本只存活数小时,实际影响范围也可能覆盖数千个组织。很多开发者的依赖更新策略是"自动补丁版本",1.14.1和0.30.4恰好利用了这种信任惯性。
StepSecurity的应急建议很直接:检查lock文件,确认没有axios@1.14.1或axios@0.30.4;如有,轮换所有可能暴露的凭证,并审计近期系统行为。
axios团队目前已发布干净版本,npm仓库也移除了恶意包。但事件暴露的结构性问题没有答案:当维护者账户成为单点故障,整个生态的防御重心应该放在哪里?GitHub和npm的账户安全加固已经喊了多年,为什么一个ProtonMail邮箱就能绕过所有?
Kurmi在报告结尾留了句话:「这是记录在案的攻击。但记录本身不能阻止下一次。」
你的CI流水线今天检查过lock文件吗?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.