AsyncAPI npm包遭遇供应链攻击:Import-time执行绕过–ignore-scripts防护

事件概述

2026年7月14日,Microsoft Threat Intelligence披露一起针对AsyncAPI开源组织的npm供应链攻击。攻击者通过漏洞GitHub Actions工作流窃取发布令牌,向5个npm包版本注入恶意loader。该loader在模块导入时(import-time)即触发执行,而非传统的postinstall生命周期钩子,这意味着广泛使用的npm install --ignore-scripts防护措施完全失效。

攻击时间线

时间(UTC) 事件
~07:10 @asyncapi/generator@3.3.1、@asyncapi/generator-components@0.7.1、@asyncapi/generator-helpers@1.1.1被重新发布
08:06:20 @asyncapi/specs@6.11.2-alpha.1发布,恶意loader被前置到index.js
08:30:09 @asyncapi/specs@6.11.2稳定版发布,携带相同载荷
08:49:22 首次观察到稳定版tar包被拉取到Yarn缓存

被感染包清单

共5个版本、4个包名受影响:

  • @asyncapi/specs:6.11.2-alpha.1、6.11.2(稳定版)——被注入index.js
  • @asyncapi/generator:3.3.1——被注入lib/templates/config/validator.js
  • @asyncapi/generator-components:0.7.1——被注入lib/utils/ErrorHandling.js
  • @asyncapi/generator-helpers:1.1.1——被注入src/utils.js

特别值得注意的是,@asyncapi/specs是众多AsyncAPI工具包的传递依赖,因此实际攻击面远超直接依赖这些包的项目。

技术细节

GitHub Actions漏洞利用

攻击目标为asyncapi/generator仓库。存在漏洞的工作流manual-netlify-preview.yml使用了pull_request_target事件触发器,使作业运行在目标仓库的安全上下文中,同时checkout了不受信任的PR代码。攻击者利用该配置窃取了asyncapi-bot的个人访问令牌(PAT),获得以bot身份推送代码的权限。

该配置漏洞并非新发现——2026年4月29日已有PoC公开,5月17日社区提出修复方案,但补丁仍在审查中时攻击即已发生。

Import-time执行机制

与传统npm供应链攻击使用postinstall钩子不同,本次攻击的核心创新在于import-time执行

spawn('node', [payloadPath], {
    detached: true,
    stdio: 'ignore',
    windowsHide: true
}).unref();

当开发者通过require()import加载受感染模块时,上述代码立即生成一个隐藏、分离的Node.js子进程,从IPFS下载第二阶段载荷。由于触发时机在模块加载阶段,--ignore-scripts和依赖安装时的安全扫描均无法拦截。

多阶段载荷架构

  • Stage 1:Import-time loader生成隐藏子进程
  • Stage 1b:从IPFS下载sync.js(去混淆传输)
  • Stage 2:三层解密(HKDF-SHA256 + AES-256-GCM + ROT-94)
  • Stage 3:Miasma运行时启动,建立持久化和C2通信

C2基础设施

主控服务器位于85.137.53[.]71,开放8080(C2控制)、8081(数据上传)、8091(管理配置)端口。备用通道包括Nostr、Ethereum、BitTorrent DHT和IPFS。

影响评估

AsyncAPI是事件驱动架构和消息驱动API的开放规范,被广泛应用于微服务通信、IoT平台和金融交易系统。受影响的包通过传递依赖可能进入大量生产环境,包括CI/CD流水线、容器构建和在线服务。攻击者在载荷中已实现了凭证收集、供应链传播、AI工具投毒等模块(当前被禁用),表明此次攻击具备高度扩展性。

修复建议

立即行动

  1. 清除全部5个受影响版本,包括传递依赖引用
  2. 固定安全版本:@asyncapi/specs ≤ 6.11.1;@asyncapi/generator = 3.3.0
  3. 清除npm和Yarn缓存(开发者终端和构建主机)
  4. 阻断出站连接至85.137.53[.]71:8080/8081/8091
  5. 阻断公共IPFS网关(ipfs.io、dweb.link等)

威胁狩猎

  • 在NodeJS伪装目录下搜索sync.js文件
  • 调查引用IPFS CID或sync.js的分离Node.js进程
  • 轮换所有可能被暴露的凭证(GITHUB_TOKEN、NPM_TOKEN、云服务密钥等)

长期加固

  • 升级npm CLI至v11.10.0+,启用min-release-age功能
  • 审查GitHub Actions工作流,避免pull_request_target与不受信任代码结合使用
  • 重建共享基础镜像,防止继承被污染缓存

参考来源