Axios 被投毒了
今天npm生态发生了一起相当严重的安全事件,波及范围之广,足以让每一个开发者心头一紧。
没错,备受信赖的HTTP客户端库Axios,遭到了供应链投毒攻击。中招的是1.14.1和0.30.4这两个版本。要知道,Axios的周下载量超过1亿次,这个量级的包出事,影响几乎是全网覆盖的。
更令人咋舌的是攻击速度:从下手到完成污染,攻击者针对1.x和0.x两条主线,总共用了不到两个小时。
事件经过
这次攻击的手法并非直接硬闯,而是采用了“毒源感染”的策略,显得颇为狡猾。
时间线拉回到3月30日下午。攻击者首先发布了一个看似正常的包:plain-crypto-js@4.2.0。这像是一次常规的投石问路。
真正的转折发生在几小时后。3月31日00:00左右,恶意版本plain-crypto-js@4.2.1被发布出来,这才是那个真正的“毒包”。
接下来,攻击进入了关键阶段:
攻击者已经成功控制了Axios主要维护者jasonsaayman的npm账号。他们不仅修改了账户邮箱为ifstap@proton.me,还将原维护者彻底锁在账号之外。
掌握了发布权限后,攻击者直接使用npm CLI手动发包,绕过了常规的GitHub Actions自动化流程:
- 00:21,发布
axios@1.14.1 - 01:00,发布
axios@0.30.4
这两个被污染的版本中,都被悄无声息地添加了一行依赖声明:plain-crypto-js@4.2.1。
所以,整个攻击链条其实非常清晰:plain-crypto-js作为“毒源”负责提供恶意负载,而被投毒的axios则凭借其巨大的用户基数,成为绝佳的“扩散放大器”。
恶意代码在干嘛
所有核心恶意逻辑都藏在plain-crypto-js@4.2.1这个包里。
当这个包被安装时,会触发postinstall脚本。该脚本会执行一段经过混淆的代码,其首要任务是连接到一个名为C2(命令与控制)的服务器——地址是sfrclak.com:8000,并从中下载第二阶段的攻击载荷。
接着,恶意代码会根据操作系统类型,投递不同的远程访问工具(RAT):
- macOS:接收一个伪装的二进制文件。
- Windows:执行一段隐藏的PowerShell脚本。
- Linux:在
/tmp目录下释放一个Python脚本。
执行完毕后,攻击载荷还会进行“自毁”,清除运行痕迹。这意味着,如果你事后去检查node_modules目录,很可能看不出任何异常。识别此类攻击最可靠的依据,往往是锁定文件(lockfile)。
影响范围
只要你在3月31日这个特定的时间窗口内,执行过npm install安装或更新依赖,你的系统就存在中招的风险。
这种风险不仅限于开发者的本地机器,同样波及持续集成(CI)环境和生产服务器。供应链攻击的可怕之处正在于此——它沿着依赖链条无差别蔓延。
还需要注意的是,即使npm官方事后删除了这些恶意包,如果你的项目锁文件(如package-lock.json或yarn.lock)已经锁定了这两个受污染的版本,威胁依然存在。
怎么处理
首先,立刻检查你的项目是否正在使用Axios的1.14.1或0.30.4版本。
如果不幸命中,建议的处理方式不是简单升级,而是彻底清理:删除整个node_modules目录和锁文件(lockfile),然后重新安装依赖。同时,务必在package.json中将Axios显式固定到一个已知的安全版本。
如果怀疑机器可能已经执行了恶意代码,那么这就需要按照正式的安全事件来响应了:立即隔离受影响系统、更换所有相关的访问凭证(如API密钥、密码),并进行全面的磁盘扫描与安全检查。
