你的代码没有任何问题,但你已经被朝鲜黑客完全控制了

image.png

2026年3月31日凌晨,全球数百万开发者在毫不知情的情况下,经历了一次教科书级别的供应链攻击。

攻击者没有破解你的服务器,没有发现你代码里的漏洞,甚至没有改动 Axios 的一行源代码。他们只是悄悄地,在你最信任的开源依赖的 package.json 里,加了一个你不认识的包名。

然后,从你敲下 npm install 的那一刻起,15秒后,你的设备已经被完全控制。

这个事实,正在颠覆我们所有关于“安全边界”的职业直觉。

一、这不是一次普通的黑客攻击

Axios,这个每周被下载超过 1 亿次的 JavaScript HTTP 客户端库,堪称现代 Web 开发的基础设施。几乎每一个用过 Node.js 的团队,都在用它。它不是某个小众库,它是你我项目里最不会去质疑的那一行依赖。

2026年3月31日 00:21 UTC,一个标注为 latest 的恶意版本 axios@1.14.1 悄然出现在 npm 仓库;39分钟后,专门针对 0.x 用户的 axios@0.30.4 也以 legacy 标签跟进发布。npm 官方在约3小时内陆续下架了这两个版本。但在这个窗口里,凡是执行了 npm install axios 或触发了 CI/CD 自动构建的开发者,都成了潜在受害者。

事后,三家顶级安全机构分别发布了归因报告:微软威胁情报将攻击归因于朝鲜国家级黑客组织 Sapphire Sleet,Google GTIG 将其归因于 UNC1069,Palo Alto Unit42 确认与已知 DPRK 行动高度重叠。名称不同,指向同一个方向。

这不是脚本小子的随机破坏。这是一次由国家力量支撑的、精心预谋的定点猎杀。

二、攻击者是怎么做到的?

理解这次攻击的手法,是每一个 CTO 必须补的一课。因为它几乎绕过了我们过去十年建立的所有安全直觉。

第一步:账号劫持,取得合法身份。

攻击者劫持了 Axios 首席维护者 @jasonsaayman 的 npm 账号。这个账号拥有发布新版本的最高权限。身份合法,发布合法,npm 的审核机制形同虚设。

有一个细节极其关键:正常发布时,Axios 使用 GitHub Actions OIDC 机制,有完整的 SLSA 溯源证明。而恶意版本是通过 CLI 直接发布的,没有溯源证明,发布邮箱也从 jasonsaayman@gmail.com 变成了 ifstap@proton.me。这两个异常信号,如果有自动化监控,本可以在第一时间触发告警。但大多数团队没有。

第二步:依赖注入,不动声色地埋雷。

攻击者没有修改任何 Axios 源代码——这一点至关重要。他们只是在 package.json 里加了一行:新增依赖 plain-crypto-js@4.2.1。

而这个包,是攻击者自己提前18小时发布的。为了绕过审查,他们甚至先发布了一个干净的 plain-crypto-js@4.2.0 建立“注册表历史”和“信誉”——用一个无害的版本让这个包看起来像个正常存在了一段时间的工具包。

这种布局方式,细思极恐。

第三步:postinstall 钩子,自动引爆。

plain-crypto-js@4.2.1 通过 npm 的 postinstall 生命周期钩子,在包安装完成后自动执行 node setup.js。不需要你运行任何程序,不需要你打开任何文件。安装,就是触发。

setup.js 使用了双层混淆(Base64 反转编码 + XOR 密钥),解混淆后,它会连接 C2 服务器 sfrclak[.]com:8000,下载针对你当前系统的定制化远程访问木马(RAT)。

然后,它将自己彻底销毁——删除 setup.js,替换 package.json 为干净版本,清除所有痕迹。等你反应过来,现场早已被打扫干净。

第四步:跨平台 RAT,三端通吃。

无论你用 macOS、Windows 还是 Linux,都有对应的载荷等着你:

  • macOS:一个 C++ 二进制文件,伪装成苹果系统守护进程的命名格式,静默驻留

  • Windows:PowerShell 脚本,伪装成 Windows Terminal(wt.exe),写入注册表 Run 键持久化

  • Linux:Python 脚本,以 nohup 孤儿进程方式后台运行

三个平台的 RAT 共享完全相同的 C2 协议,每60秒回传一次心跳,支持执行任意命令、注入二进制、枚举目录。

从 npm install 到设备被完全控制,全程约15秒。

三、信任体系的崩塌,比攻击本身更可怕

表面上看,这是一起供应链攻击事件。但它真正颠覆的,是我们整个技术团队赖以运转的信任体系。

一个中型前端项目,node_modules 目录里轻松就有 1000 个以上的包,背后是无数个维护者账号、无数条信任链。你能说出其中 100 个包是谁在维护吗?你能保证这 1000 个包的所有维护者账号都没有被劫持的风险吗?

我们以为我们在用“工具”。实际上,我们在无条件信任一千个陌生人写的代码,并且给了它们在我们的 CI/CD 环境里执行任意命令的权限。

更让人不安的是攻击速度的进化。2024年的 XZ Utils 后门事件,攻击者用了近三年时间,慢慢渗透进一个开源项目的维护者社区,一步步取得信任,最终埋下后门。而这一次,攻击者改变了策略:直接劫持账号,18小时完成布局,3小时完成攻击,15秒完成入侵。

手法在进化,速度在提升,耐心被效率取代。

这意味着,软件供应链安全已经不再是一个可以“慢慢建设”的方向——因为攻击者给你留下的反应窗口,正在以数量级的速度缩短。软件供应链,是我们所有安全假设的盲区。而这个盲区,正在被国家级攻击者精准瞄准。

四、作为 CTO,你的判断比你的工具更重要

这次事件之后,我见过两种反应。

第一种:让安全团队出一份整改 checklist,照着修,打个勾,汇报“已完成供应链安全加固”。

第二种:重新理解自己对“安全架构”的认知,把供应链纳入技术战略层面来管理。

这两种反应,代表着两种完全不同的安全成熟度。前者是在救火,后者是在建防火线。

供应链安全的本质,不是一个工具问题,而是一个信任架构问题。

你用什么工具扫描,不重要;

你的团队对“什么可以信任、信任到什么程度”有没有清晰的判断框架,才重要。这个框架,只有 CTO 能建立,安全工程师建立不了。

以下是我认为值得 CTO 亲自决策的几件事:

第一件事:重新定义“依赖版本锁定”的战略意义。

你以为 ^1.14.0 这个符号是在给团队灵活性——实际上,它是在给攻击者留一扇自动打开的窗。^ 的语义是“允许安装任何兼容的更新版本”,翻译过来就是:只要攻击者能发布一个看起来合法的新版本,你的 CI/CD 会主动去取。

停止使用模糊版本号,全面改用精确锁定。这不是保守主义,这是你能对供应链做的最高性价比的安全决策。更进一步,可以启用 npm 的发布隔离期配置(npm config set min-release-age 3),让所有新版本包延迟72小时才允许安装——这条简单的配置,就能让大多数“窗口期攻击”彻底失效。

第二件事:把 postinstall 钩子列为“需要理由才能开放”的特权。

这次攻击的引爆机制,是 npm 的 postinstall 生命周期钩子——一个在安装完成后自动执行任意代码的机制。问题是,绝大多数依赖根本不需要这个权限。

在 CI/CD 流程中默认加上 --ignore-scripts 标志,把这扇门关上。需要 postinstall 的包,走白名单审批。这是一个典型的“最小权限原则”应用,但它的执行必须从 CI/CD 架构层面落地,不能依赖开发者自觉——这是 CTO 需要推动的架构决策,不是安全团队的日常任务。

第三件事:把“发布可信度验证”纳入流水线的准入标准。

这次攻击留下了一个本可以被机器拦截的早期信号:恶意版本是通过 CLI 直接发布的,没有 SLSA 溯源证明,而正常的 Axios 发布全程通过 GitHub Actions OIDC,有完整的溯源链。

如果你的 CI/CD 流程要求所有关键依赖必须具备可验证的发布来源,这次攻击会在流水线的第一道关卡被拦截。这需要你在技术选型层面做出判断:把“溯源证明”列为关键依赖的准入要求,就像你要求代码有测试覆盖率一样。

第四件事:把供应链监控纳入可观测性体系,而不是安全体系。

这是一个认知转变,但很重要。大多数团队把供应链安全归在“安全”部门管,导致它永远是优先级靠后的任务。但供应链的异常——维护者账号变更、发布渠道切换、新增依赖变更——本质上和服务异常、流量异常一样,是你的系统状态的一部分。

把它纳入你的可观测性体系,和你的监控、告警、值班机制整合在一起。Elastic 和 Datadog 都有成熟的供应链行为监控能力,在本次事件中均第一时间检测并发布报告;Snyk 在依赖漏洞扫描层面也能提供一定覆盖。这不是安全投入,这是基础设施投入。

这四件事,没有一件需要很大的工程量,但每一件都需要 CTO 的判断来推动落地。 因为它们触及的都是团队的默认习惯和既有架构——而改变这些,从来都不是工具的事,是决策的事。

今天就可以做的应急响应

如果你的团队在 2026年3月31日 00:21 ~ 03:29 UTC 之间执行过 npm install axios 或触发过包含 axios 的 CI/CD 构建,视为高风险,立即:

  • 降级至安全版本(1.x 用户:axios@1.14.0,0.x 用户:axios@0.30.3)

  • 无条件轮换所有凭证:GitHub Actions token、仓库 secrets、API 密钥

  • 在干净环境重新安装依赖,受污染的构建环境不可信

RAT 已经自我销毁,你看不到任何异常痕迹——这不等于没事。

五、供应链安全,已经是一个地缘政治问题

我想说一个更深层的认知转变,它超出了工程范畴。

这次攻击的幕后是朝鲜国家级 APT 组织。这意味着,攻击者的目标不是你的钱,不是你的数据,是情报、是渗透能力、是在全球 IT 基础设施里布置的“休眠棋子”。他们不计算单次攻击的 ROI,他们在培育能力、测试手法、积累影响力。

这就是为什么这次攻击的目标是 Axios,而不是某个高价值的金融系统——感染基础设施比感染目标更有战略价值。 今天是 Axios,明天可以是任何一个你依赖的基础库:一个日志框架,一个加密工具,一个你用了五年从未质疑过的网络请求库。

过去,我们构建安全防线的逻辑有一个隐含前提:威胁来自外部,或来自我们自己写的代码。我们做 code review,做渗透测试,做 SAST 扫描,把安全的焦点放在“我们写的那些代码”上。这些都没有错。但它们面对供应链攻击,有一个根本性的失效:你审不完你没写的代码。

软件供应链安全,本质上已经是一个主权问题:你的核心技术基础设施,有多少是你能掌控、能验证、能在危机时刻替换的?

对于 CTO 来说,这个认知意味着一些需要被摆上战略桌面的问题:关键依赖的内源化评估、核心基础设施依赖的多样化布局、供应链风险纳入技术治理和董事会汇报的层级。

这不是要求你把所有开源依赖都替换掉——那既不可能也没必要。这是要求你知道哪些依赖是你系统的“核心动脉”,并且对这些动脉建立真正的掌控力和可观测性,而不是依赖“它一直没出过问题”这种靠运气的信任。

代码的安全边界,早已不是你代码仓库的边界线。

真正的边界,是你对整条依赖链的掌控力和可观测性。建立这种掌控力,是这个时代 CTO 无法外包的核心责任。

时光匆匆,感谢停留。

原创不易,如果觉得文章有价值,请点赞、推荐、分享到朋友圈。

关注我,往后岁月,一路同行,一起成长。


参考来源:

  • Microsoft Security Blog, Threat actors leverage npm package “axios” compromise to target developers, 2026-04-01

  • Elastic Security Labs, Axios Supply Chain Compromise, 2026-03-31

  • Google Cloud GTIG, North Korean Threat Actor Compromises npm Package Axios, 2026-04-01

  • Palo Alto Unit42, Supply Chain Attack on Popular npm Package axios, 2026-04-01

  • Snyk, axios supply chain compromise - full analysis, 2026-04-02

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容