![]()
npm上周发生了一起教科书级的供应链攻击。攻击者用三周时间搭建了一个虚假公司,伪造Slack工作区和Teams会议,最终用一个"系统更新"弹窗骗到了Axios核心维护者的设备权限。这个每周下载量超过5000万次的HTTP客户端,因此发布了两个带毒版本。
整个攻击窗口只有3小时,但足够让全球无数开发者的机器种下远控木马。
三周布局:从LinkedIn到伪造Slack
攻击始于对Axios首席维护者Jason Saayman的定向钓鱼。Saayman在事后复盘中写道,对方冒充一家真实存在的公司,克隆了其品牌视觉和创始人形象,邀请他加入一个"看起来非常合理"的Slack工作区。
「这个Slack设计得非常用心,他们有分享LinkedIn帖子的频道——我猜那些链接指向的是真实公司的账号,但超级有说服力。他们甚至还有公司团队的假账号,以及其他开源维护者的假资料。」Saayman描述道。
这种"借壳"策略的精妙之处在于:它利用了开源维护者的日常社交惯性。技术社区的信任建立在公开可见的社交关系上,攻击者只需要复制这种可见性,就能大幅降低目标的警惕阈值。
会议室里的"技术故障"
在建立信任后,攻击者安排了一场Microsoft Teams会议。Saayman进入会议室时,看到" numerous people"(多人)在线——这种人数感本身就是一种心理暗示,让会议显得正式且可信。
会议进行中,一个技术错误弹窗出现,提示"系统某些组件已过期",要求安装Teams更新以修复问题。Saayman执行了这个"更新"。
这个弹窗是伪造的。所谓的更新程序实际是WAVESHAPER.V2远控木马,它让攻击者获得了Saayman设备的完全访问权限,进而窃取了Axios项目的npm发布凭证。
Google威胁情报团队(GTIG)事后将此次攻击归因于朝鲜黑客组织UNC1069。该组织自2018年起活跃,以经济利益为驱动。GTIG指出,此次使用的WAVESHAPER.V2是该组织此前工具的新版本,且攻击基础设施与UNC1069过往活动存在重叠。
![]()
3小时的窗口期与供应链的脆弱
获得凭证后,攻击者向npm推送了两个恶意版本:1.14.1和0.30.4。这些版本引入了一个名为plain-crypto-js的依赖项,该依赖会在macOS、Windows和Linux系统上安装远控木马。
从发布到被撤下,恶意版本在npm上存活了大约3小时。Axios团队事后重置了所有凭证、擦除了受影响系统,并正在实施流程改进以防止类似事件。
但3小时在自动化构建的世界里足够漫长。CI/CD管道、依赖自动更新、容器镜像构建——这些现代开发流程的设计目标就是"快",而攻击者恰恰利用了这种快。
更值得警惕的是,Saayman并非唯一目标。Axios团队的其他维护者也报告了类似的社交工程攻击尝试,说明这是一场有组织的、针对开源基础设施维护者的系统性行动。
开源世界的"信任税"正在涨价
这次攻击暴露了一个结构性问题:开源项目的安全边界与维护者的个人设备安全直接绑定。npm的发布凭证没有硬件密钥保护,没有多因素认证的强制要求,也没有发布前的多方审批机制。
攻击者不需要攻破npm的服务器,只需要攻破一个人的判断力——而人的判断力,在精心设计的社交工程面前,远比我们愿意承认的更脆弱。
Saayman的复盘帖子里有一个细节:那些LinkedIn帖子"presume just went to the real company's account"(我猜只是指向了真实公司的账号)。攻击者甚至懒得搭建假网站,直接引流到真实公司的社交账号,因为"看起来真实"比"真实"更容易实现。
Axios团队目前建议:在3月7日15:00至18:00(UTC)之间安装过1.14.1或0.30.4版本的系统,应视为已泄露,所有凭证和认证密钥都需要轮换。如果你不确定自己的依赖是否受影响,检查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.