一次供应链攻击导致 axios 库的两个恶意版本(1.14.1 和 0.30.4)被发布到 npm。这些版本通过一个被攻破的维护者账户发布,内置了远程访问木马,在被发现并移除前的约 3 小时内影响了用户。受影响的用户需要检查系统,降级 axios 版本,并更换所有凭证。事件的根源是针对维护者的社会工程学攻击,团队已采取措施修复并加强安全,以防止未来再次发生。
您是否受到影响?
首先,检查您的项目锁定文件(如 package-lock.json 或 yarn.lock)中是否包含恶意版本。如果以下命令返回任何结果,您的系统就可能已被感染:
grep -E "axios@(1\.14\.1|0\.30\.4)|plain-crypto-js" package-lock.json yarn.lock
如果发现匹配项,请立即将该机器视为 已被完全攻破,并执行以下步骤:
- 降级版本: 将
axios降级到安全版本,如1.14.0或0.30.3。 - 删除恶意依赖: 手动删除
node_modules/plain-crypto-js/目录。 - 更换所有凭证: 立即更换该机器上的 所有 密钥、令牌和凭证。
- 检查网络日志: 检查是否有连接到
sfrclak[.]com或142.11.206.73地址8000端口的记录。 - 检查 CI/CD 环境: 如果在 CI/CD 运行器上发生,请更换在受影响的构建过程中注入的所有密钥。
事件经过
攻击者通过一次有针对性的 社会工程学活动和恶意软件,获取了项目主要维护者个人电脑的访问权限。这使他们能够访问维护者的 npm 账户凭证,并利用该账户发布了两个含有恶意代码的 axios 版本。这些版本注入了一个名为 plain-crypto-js 的依赖,该依赖会在 macOS、Windows 和 Linux 系统上安装一个远程访问木马。
攻击时间线
- 3月31日之前约两周: 针对主要维护者的社会工程学活动开始。
- 3月30日 05:57 UTC: 恶意包
[email protected]被发布到 npm。 - 3月31日 00:21 UTC: 恶意的
[email protected]版本发布,注入了[email protected]。 - 3月31日 约 01:00 UTC: 恶意的
[email protected]版本以相同方式发布。 - 3月31日 约 01:00 UTC: 攻击者利用被盗账户权限,删除社区成员报告问题的 issue。
- 3月31日 01:38 UTC:
axios的协作者发现了异常,向社区发出警告并直接联系了 npm。 - 3月31日 03:15 UTC: npm 团队移除了两个恶意的
axios版本。 - 3月31日 03:29 UTC: npm 团队移除了恶意的
plain-crypto-js包。
我们学到了什么?
这次事件凸显了开源项目面临的严峻安全挑战,并带来了几个关键教训:
- 直接从个人账户发布是巨大风险。 本应提前采用更安全的发布流程,如 OIDC 流程和不可变发布设置。
- 缺乏自动化的异常发布检测。 本次事件的发现完全依赖于社区成员的警觉,而非自动化系统。
- 维护者是攻击目标。 拥有高影响力软件包的开源维护者是精密社会工程学攻击的活跃目标,个人和项目层面都需要保持高度警惕。
为了防止此类事件再次发生,团队已彻底清理了维护者的所有设备,重置了全部凭证,并正在实施更严格的安全措施,包括改进发布流程和更新安全实践。