11分钟的梦魇:Nx Console VS Code 扩展遭入侵内幕
如果你认为本地编码环境是一个安全的沙盒,我有一些极其糟糕的消息要告诉你。2026 年 5 月 18 日,开发者社区在残酷的安全冲击中醒来。Nx Console,一个拥有超过 220 万次安装量的 Visual Studio Code 扩展,在一次复杂的供应链攻击中被劫持。
一个被追踪为 TeamPCP 的威胁组织成功向 Visual Studio Marketplace 和 Open VSX Registry 发布了一个被投毒的更新 (v18.95.0)。尽管 Nx 的维护者以极快的速度采取了行动——在 11 分钟 内在 VS Marketplace 上清除并修补了该扩展,在 36 分钟 内在 Open VSX 上完成了修补——但损害已经造成。一名 GitHub 工程师的工作站自动拉取了该恶意更新,从而建立了一个据点,允许攻击者渗透并窃取了大约 3800 个内部 GitHub 存储库。
我花了过去两天时间分析该漏洞利用向量。让我们拆解一下这是如何发生的,重构“孤儿提交 (Orphan Commit)”加载器,研究为什么您的本地 AI 开发人员密钥成为新的高价值目标,并讨论我推荐的锁定本地设置的具体策略。
解构妥协链条
说实话:这不是一次简单的排版错误抢注 (typosquatting) 或依赖混淆攻击。恶意行为者破坏了官方发布管道本身。
最初的破坏并非始于 Nx 存储库。相反,这是一个级联链条。TeamPCP 之前已经入侵了 TanStack 生态系统中的贡献者。通过那个切入点,他们窃取了一名开发者的 GitHub CLI OAuth 令牌,该令牌拥有官方 nrwl/nx 存储库的写入权限。
TeamPCP 没有开启高度可见的拉取请求或直接推送到 main 分支(这会触发分支保护警报),而是使用了一种极其巧妙、隐蔽的向量:孤儿提交 (The Orphan Commit)。
[ TanStack 生态系统遭入侵 ]
│
(GitHub OAuth 令牌被窃取)
│
▼
[ nrwl/nx 存储库的写入权限被利用 ]
│
(直接在 Git 树中创建的隐蔽孤儿提交)
│
▼
[ 恶意的 Nx Console VS Code 扩展 (v18.95.0) ]
(预编译为包含获取孤儿提交的静态 URL)
│
▼
[ Visual Studio Marketplace / Open VSX 发布 ]
│
▼
[ 开发者机器自动更新 / 执行 ]
什么是孤儿提交 (Orphan Commit)?
孤儿提交是直接推送到存储库对象存储中的提交,它没有附加到任何命名的分支、标签或活动的引用树上。
因为 Git 是内容寻址的,你可以使用底层的底层 (plumbing) 命令创建并推送提交。它不会出现在 main 分支的提交历史或活动分支列表中,但该提交在存储库的对象存储中仍然是活动的。任何知道确切提交 SHA 的人都可以访问代码,或直接从 GitHub 的原始 CDN 中拉取它:
# 在 Git 中查询松散对象:即使提交被孤立,
# 它也会被存储,并且可以直接从 GitHub raw 查询或拉取。
git cat-file -p <orphan_commit_sha>
TeamPCP 用一个简单的加载器构建了他们的恶意扩展。一旦安装,它会联系官方的 nrwl/nx 存储库,并从这个隐藏的孤儿提交中拉取次要有效载荷。对于静态分析工具和防火墙来说,该网络请求看起来完全无害:一个官方 Microsoft VS Code 扩展从官方验证的存储库中获取代码。
一旦加载到内存中,次要有效载荷就会执行,立即启动一个本地凭据收集器。
锁定您的 AI API 机密
传统上,开发人员凭据窃取者会寻找标准环境变量:AWS 访问密钥、NPM 发布令牌、SSH 密钥以及包含数据库凭据的 .env 配置。
然而,我对 TeamPCP v18.95.0 有效载荷的安全分析揭示了一个明显的现代转变:自动收集 AI 开发者助手凭据。
该恶意软件专门在本地配置路径中搜索活跃的基于终端和基于 IDE 的 AI 代理,包括:
~/.config/claude-code/config.json(包含 API 密钥和会话令牌的 Claude Code 配置文件)~/.config/github-copilot/~/.gemini/API 配置和密钥- 包含 VS Code Copilot 令牌的 IDE 安全存储文件夹
为什么 AI 密钥成为新的高级目标
情况是这样的:随着软件工程采用代理环境,开发人员通常在终端会话中直接运行具有高权限的 AI 实用程序(如 Claude Code)。这些工具通常被授予写入文件、运行测试和执行终端命令的权限。
如果攻击者窃取了你的 AWS 密钥,他们将获得云计算访问权限。如果攻击者窃取了你活跃的 Claude Code 会话密钥,他们将获得存储库的交互式、基于代理的控制台。可以指示该代理读取您的整个私有代码库,定位逻辑漏洞,编写静默后门,提交拉取请求,并在您的名义下提交更改。
对于威胁行为者来说,活跃的 AI 开发者令牌是终极的枢纽密钥。
构建安全的防御性工作区
保护现代开发工作区需要摆脱 IDE 是安全沙盒的假设。这是我保护您的机器的务实手册。
强制执行工作区开发容器 (Dev Containers):
开发人员应将本地机器视为不受信任的环境。不要运行对主机机器环境变量具有完全访问权限的 IDE,而是使用 开发容器 (Dev Containers) 或容器化的执行循环。
通过将环境包裹在 devcontainer.json 配置中,可以隔离实际的密钥:
// devcontainer.json (我的标准安全容器设置)
{
"name": "Secure Node Workspace",
"image": "mcr.microsoft.com/devcontainers/javascript-node:20",
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {}
},
"containerEnv": {
"AWS_ACCESS_KEY_ID": "${localEnv:AWS_ACCESS_KEY_ID}" // 保持本地凭据屏蔽
},
"customizations": {
"vscode": {
"settings": {
"extensions.autoUpdate": false // 阻止扩展在我背后自动更新
}
}
}
}
专家提示:保持碧昂丝法则生效
开发者凭据的碧昂丝法则在这里适用:如果你喜欢它,你应该给它加把锁。 永远不要在自动化系统中使用通用的个人访问令牌 (PAT)。实施受限细粒度令牌,其访问权限被限制在特定存储库,并对包元数据具有只读权限。
结论
代码生成正式成为一个已解决的问题,现在的工程主战场是凭证的编排和遏制。停止让 IDE 扩展盲目自动更新,在容器中隔离您的工作区,并保护您的本地 AI 配置。
参考与官方来源
- Nx 安全公告:官方事件报告和恢复步骤。 nx.dev/blog/security-advisory-nx-console-compromise
- Ox Security Analysis:深入分析 TeamPCP 活动。 ox.security/research/teampcp-mini-shai-hulud-campaign
- StepSecurity 事件追踪:重构从 TanStack 到 Nx 的级联 OAuth 泄露向量。 stepsecurity.io/blog/tanstack-nx-compromise-analysis

