事件概述
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工具投毒等模块(当前被禁用),表明此次攻击具备高度扩展性。
修复建议
立即行动
- 清除全部5个受影响版本,包括传递依赖引用
- 固定安全版本:@asyncapi/specs ≤ 6.11.1;@asyncapi/generator = 3.3.0
- 清除npm和Yarn缓存(开发者终端和构建主机)
- 阻断出站连接至85.137.53[.]71:8080/8081/8091
- 阻断公共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与不受信任代码结合使用
- 重建共享基础镜像,防止继承被污染缓存