22分钟内,323个npm包遭到感染。就在你阅读这篇文章的此刻,某个正在安装AntV包的开发者,可能正在不知情地交出自己的AWS密钥。

一句话总结
TeamPCP劫持npm维护者账号(atool) → 向323个AntV生态系统包注入恶意代码 → 每次安装自动窃取20+种云凭证 → 数据已被外泄至2,500+个GitHub仓库
323个
受感染的独立包数量
22分钟
完成攻击所用时间
1100万
周下载量(echarts-for-react)
20种以上
被窃取的凭证类型

到底发生了什么?

2026年5月19日凌晨1点39分(UTC),npm生态系统出现了异常。22分钟内,639个恶意包版本被同时发布,其中包括AntV数据可视化库(@antv/g2、@antv/g6、@antv/x6、@antv/l7、@antv/s2)以及echarts-for-react和timeago.js。

攻击者团体TeamPCP并没有攻破npm本身,而是劫持了一个名为"atool"的npm维护者账号。这个账号拥有AntV生态系统内数百个包的发布权限。一个账号被攻破,整个生态系统便像多米诺骨牌一样倒塌。

最令人震惊的不是规模,而是速度。22分钟,没有给任何人反应的时间。当安全团队察觉并开始响应时,已有大量开发者在CI/CD管道中安装了受感染的版本。

为什么这比看起来更严重?

这次攻击有两个值得特别关注的点:窃取凭证的广度Sigstore证明伪造

立即行动:如果你最近安装了以下任何一个包,请立即轮换你的云凭证。"等一下再说"的想法在这里非常危险。
包名 周下载量 感染状态
echarts-for-react 约110万 已确认感染
@antv/g2 数十万 已确认感染
@antv/g6 数十万 已确认感染
@antv/x6 数十万 已确认感染
timeago.js 约150万 已确认感染

恶意负载(约499KB混淆JavaScript)通过npm install期间的preinstall钩子自动执行,系统性地扫描130+个文件路径,收集AWS、Google Cloud、Azure、GitHub令牌、npm令牌、SSH密钥、Kubernetes、Vault、Stripe和数据库连接字符串等20种以上凭证。甚至还会尝试通过宿主socket实现Docker容器逃逸。

更令人警惕的是,这次攻击伪造了Sigstore证明。在CI/CD环境中,恶意代码直接从runner进程内存中提取GitHub Actions OIDC令牌,用来获取合法的Sigstore签名证书。包上显示绿色"来源已验证"徽章,标准工具无法辨别真伪。

窃取的数据通过t.m-kosche[.]com:443传输,Session P2P网络(filev2.getsession[.]org)作为备用通道。攻击者还利用盗取的GitHub令牌创建了2,500+个公开仓库用于分散存储数据。

现在立刻该做什么

  1. 确认是否受影响
    package.jsonpackage-lock.json中搜索@antv/*、echarts-for-react、timeago.js。用npm ls @antv/g2检查传递依赖。
  2. 先删除持久化组件,再轮换凭证
    恶意代码会在.claude/settings.json钩子、VS Code任务和systemd守护进程中植入后门。如果先轮换凭证,守护进程会立即窃取新凭证。顺序很重要。
  3. 立即轮换所有凭证
    AWS密钥、GCP服务账号、Azure凭证、GitHub PAT、npm令牌、SSH密钥——全部都要轮换。不是"以防万一",而是"很可能已经泄露了"。
  4. 审计你的GitHub仓库
    在GitHub搜索"niagA oG eW ereH :duluH-iahS"("Shai-Hulud: Here We Go Again"的倒序),这是攻击者数据转储仓库的标识。
  5. 启用npm 2FA
    GitHub已经注销了61,274个npm访问令牌。重新申请并务必启用2FA和发布保护。
  6. 后续安装使用--ignore-scripts
    npm install --ignore-scripts可以阻止preinstall/postinstall钩子执行。建议将其设为CI/CD管道的默认配置。

深入了解

微软安全博客分析 TeamPCP的技术TTP及各CI/CD环境检测方法的官方指南。 microsoft.com

Snyk技术分析 涵盖498KB负载结构、AES-256-GCM加密、RSA-OAEP密钥包装等恶意代码技术细节。 snyk.io

Orca Security响应指南 持久化组件删除步骤和CI/CD管道加固建议。 orca.security