![]()
3月31日凌晨,全球JavaScript开发者经历了一场集体冷汗。axios——这个每周下载量超过1亿次的HTTP请求库——被攻陷了。攻击窗口只有2小时53分钟,但足以让任何在此期间执行npm install的人,系统里多出一个远程控制木马。
这不是源代码被篡改的传统剧本。攻击者玩了一手更阴的:axios的代码本身干干净净,恶意逻辑藏在一个新增的"幽灵依赖"里。安全公司StepSecurity的分析师事后感叹:「axios本身零行恶意代码——这正是这次攻击最危险的地方。」
供应链攻击的"信任套利"
现代软件工程建立在层层外包的信任之上。你的项目依赖A库,A库依赖B库,B库又依赖C库——这条链条可以延伸十几层,而你对底层代码的审查接近于零。攻击者深谙此道:与其硬闯你家大门,不如在快递包裹里塞东西。
这次axios事件就是教科书级的"信任套利"。攻击者没有碰axios的核心代码,只在package.json里加了一行:plain-crypto-js@4.2.1。这个包名看起来人畜无害,甚至蹭了知名库crypto-js的命名风格。但当开发者运行安装命令时,它的postinstall钩子(安装后自动执行的脚本)悄然部署了一个跨平台远程访问木马(RAT)。
你的系统信任npm,npm信任axios的发布账号,axios的发布账号这次信任了一个来路不明的依赖——信任链条的末端,恶意代码获得了执行权限。
这种攻击模式的可怕之处在于检测难度。传统的代码审计工具扫描axios仓库,结果是一切正常。安全扫描器检查依赖列表,plain-crypto-js这个名字不会触发任何已知漏洞告警。直到StepSecurity的人工分析发现异常, poisoned版本已经在线2小时53分钟。
![]()
2小时53分钟,足够发生什么
攻击时间线精确到分钟:3月31日00:21 UTC,攻击者控制了axios主要维护者jasonsaayman的npm账号,修改注册邮箱为ProtonMail地址,发布axios@1.14.1和axios@0.30.4。03:15 UTC,StepSecurity发出警报,npm紧急下架这两个版本。
窗口期不到3小时,但考虑到axios的周下载量,潜在暴露范围极其可观。更麻烦的是CI/CD系统的自动化特性——许多公司的构建管道会在凌晨自动拉取最新依赖,运行测试,部署到预发布环境。攻击窗口恰好覆盖了这个自动化高峰。
攻击者的命令控制服务器(C2)指向sfrclak.com。目前尚不清楚有多少系统实际建立了连接,但安全建议毫不含糊:如果你在窗口期内安装过axios,假设你的系统已被完全控制。
这次账号接管的具体手法尚未完全公开。axios的合法发布通常使用OIDC可信发布者(Trusted Publishers)机制,与GitHub Actions绑定,无需人工输入npm token。但axios@1.14.1的发布记录显示,这次推送使用了手动token——攻击者要么窃取了维护者的npm凭证,要么绕过了OIDC流程。
依赖树的"黑暗森林"
开发者面对的现实是:你直接控制的代码可能只占项目的5%,其余95%是第三方依赖。而这些依赖又有自己的依赖,形成一棵深不见底的树。npm的依赖解析机制会扁平化处理,但安装脚本(postinstall、preinstall)会在下载时立即执行,此时依赖树还没完全解析完毕。
![]()
这意味着恶意代码可以在你还没看清完整依赖图谱之前,就已经运行完毕。
axios事件暴露了一个长期被忽视的盲区:我们对"直接依赖"的审查已经流于形式,对"间接依赖"更是近乎放弃。攻击者不需要让自己成为热门库,只需要让自己成为热门库的依赖——或者像这次一样,让热门库"临时收养"自己。
StepSecurity的检测之所以有效,是因为他们监控了npm包的元数据变化:版本号跳跃、维护者邮箱变更、发布机制切换。这些信号比代码本身更早暴露异常。但对于没有部署类似监控的个人开发者和小团队,发现攻击的唯一方式可能是系统已经出现异常行为。
防御的困境与可能的出路
供应链攻击的防御是个成本不对称的博弈。攻击者只需要找到一个薄弱环节,防御者需要加固整条链条。目前业界探索的方向包括:锁定依赖版本(lockfile)、签名验证、可复现构建、运行时沙箱——但每种方案都有覆盖盲区或实施成本。
axios团队事后启用了npm的双重认证,并审查了发布流程。但更大的问题依然存在:当开源维护者的个人账号成为单点故障,整个生态的安全边界在哪里?
这次攻击的C2域名sfrclak.com注册于攻击前数天,目前已被多家安全机构标记。但攻击者显然准备了备用方案——如果这次没有被快速发现,plain-crypto-js可能会以不同版本号、不同包名再次出现。
对于读到这里的开发者,最直接的行动是检查你的lockfile:如果axios版本锁定在1.14.1或0.30.4,立即降级并轮换所有可能暴露的密钥。如果你的CI/CD管道在3月31日凌晨有自动构建记录,那台构建服务器需要被当作已沦陷处理。
但更深的问题或许是:当"零行恶意代码"本身成为攻击特征,我们习以为常的"信任但验证"原则,究竟该验证什么、如何验证?下一次攻击者把窗口期压缩到1小时以内,或者选择周下载量只有百万级、但同样关键的库,现有的检测机制还跟得上吗?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.