以下是实际发生的事件,一步步的经过:5月18日,威胁行为者攻陷了Nrwl(Nx Console 背后的公司)在 VS Code 市场的发布帐户。当日12:36到12:47 UTC之间,他们使用合法的发布者凭据在市场上推送了包含恶意代码的 Nx Console 18.3.4 版本。被攻陷的版本使用 Nrwl 的有效发布证书进行加密签名,这就是为什么 VS Code 内置的验证系统没有给出警告的原因。在这11分钟窗口期间,任何开发人员的 VS Code 实例检查扩展更新时(或他们在此期间手动安装 Nx Console 时),他们直接从微软的官方市场下载了被毒化的版本。扩展未被黑客修改服务器上的文件,而是通过正门使用被盗的发布者凭据发布的。 攻击者最初是如何获得 Nrwl 的市场发布凭据的?这是大多数报道中缺少的部分。VS Code 的市场发布需要来自 Azure DevOps 的个人访问令牌(PAT)或绑定到 Microsoft 帐户的 OAuth 凭据。这些凭据几乎可以肯定是从先前的供应链妥协中窃取的,可能是从同一活动的早期阶段。这样就会形成级联失败模式:攻陷一个开发者工具来窃取凭据,使用这些凭据发布另一个开发者工具的恶意版本,再使用这个工具窃取更多凭据,周而复始。每次迭代都增加了攻击者在整个生态系统中访问发布者帐户的机会。Nx Console 的妥协不是零号病人,它已经在链条中处于深入阶段。 一旦中毒的扩展安装在开发者的机器上(包括本文中心的 GitHub 员工),它立即执行代码扫描整台机器的凭据。VS Code 的扩展是用 JavaScript 和 TypeScript 编写的,运行在 Node.js 内,这是支持 VS Code 的相同 JavaScript 运行时。当您安装一个扩展时,VS Code 会将其 JavaScript 代码直接加载到编辑器的进程空间中,具有对 Node.js API的完全访问权限。Nx Console 18.3.4 中的恶意代码使用 Node.js 文件系统 API(具体地说是 fs.readFile、fs.readdir 和路径遍历功能)递归扫描用户的主目录和常见的凭据存储位置。它搜索匹配模式的文件,如.npmrc,.aws/credentials,.kube/config,.ssh/,.gitconfig,.netrc,以及1Password CLI,HashiCorp Vault 和 Claude Code 的配置文件。扩展还调用 Node.js 子进程 API(child_process.exec 和 child_process.spawn)执行系统命令,以转储环境变量,查询 macOS 上的系统钥匙链(使用安全命令行工具),并从 Windows 凭据管理器中提取凭据(使用 cmdkey)。这一切都在纯 JavaScript 中进行,拥有与启动 VS Code 的用户相同的权限。这没有沙盒,没有权限提示,没有操作系统级隔离。VS Code 的扩展设计上就是受信任的代码。 窃取的凭据随后使用 Node.js 的内置 https 模块将数据 POST 到攻击者控制的域名。恶意代码使用 base64 编码和字符串连接对提取端点进行了模糊处理,以躲避静态分析,但一旦扩展执行,它就会直接发起 HTTPS 请求,发送包含找到的每个凭据的压缩 JSON 负载。扩展的 package.json 声明了激活事件,导致它在 VS Code 启动时立即运行(使用“*”激活事件,触发任何工作区打开时运行),这意味着开发人员不需要明确调用 Nx Console 功能以执行恶意代码。只需在已安装扩展的情况下运行 VS Code 即可。JavaScript 负载还在 VS Code 自己的凭据存储 API(使用 vscode.authentication 和 vscode.workspace API)中注入钩子,以拦截用户在工作会话期间访问的任何凭据,包括 VS Code 用于自身 Git 集成的 GitHub OAuth 令牌。 从那里,攻击者使用这些被盗的凭据在同一位员工的机器上安装了第二个被毒化的扩展(GitHub 尚未透露这是哪个扩展)。第二个扩展在接下来的几个小时或几天内窃取了大约3800个内部 GitHub 存储库。到5月20日,威胁团体 TeamPCP 已在黑客论坛上宣传出售这些被盗的存储库,价格从50000美元起,几小时后 GitHub 公布确认这次泄露。内部存储库并不是客户数据,对于基础设施安全来说更糟糕。这些存储库包含部署脚本,分阶段凭据,内部 API 架构和基础设施配置。级权限级别的源代码访问为攻击者提供了 GitHub 系统如何连接,认证和失败的蓝图。每一个抵达买家的秘密都缩短了该买家已在计划的攻击的侦查阶段。币安联合创始人 CZ 立即警告任何有私有存储库包含明文密钥的用户要轮换一切。Ivanti 的 CTO Mike Riemer 告诉我,Azure 的蜜罐网络现在显示已知漏洞在不到90秒就被利用,而被盗凭据甚至进一步压缩了时间轴。 GitHub 的漏洞并不是孤军深入。5月19日,Endor Labs 检测到42个恶意 npm 包(Socket 的更广泛跟踪发现了323个包的639个恶意版本)发布在阿里巴巴的 @antv 数据可视化生态系统内,每周下载大约1600万次。这个波浪引入了出处伪造:Mini Shai-Hulud 蠕虫现在在运行时调用 Fulcio 和 Rekor,为其传播的每个包装生成有效的 Sigstore 签名证书。来源工具显示一个绿色徽章。构建链属于攻击者。Endor Labs 的高级安全研究员 Peyton Kennedy 告诉我,“TanStack 在纸面上有正确的设置:OIDC 可信发布、签过的出处、对每个维护者账户的双重认证。攻击还是成功了。” 同样在5月19日,威胁行为者通过将所有现有标签重定向到包含恶意代码的冒充提交来攻陷 GitHub Actions 工作流 actions-cool/issues-helper,该代码从 CI/CD(持续集成/持续部署)流水线中提取凭据。提取域名与 @antv Mini Shai-Hulud 波相匹配,将集群联系在一起。几个小时后,Wiz 检测到 TeamPCP 已攻陷 durablerask,微软的官方耐久任务工作流执行框架的 Python 客户端。三个恶意版本在35分钟的窗口内被发布到 PyPI(Python 包索引),使用的是一个在之前 TeamPCP 操作中受损的 GitHub 帐户。负载从 AWS(亚马逊网络服务),Azure,GCP (谷歌云平台),Kubernetes 和超过90个开发工具配置中窃取凭据,然后通过云基础设施横向扩展。该包每月平均下载超过40万次。整个模式重复:攻陷一个受欢迎的工具,从每台运行它的机器中提取凭据,使用这些凭据攻陷下一个工具。TeamPCP 正在构建一个跨整个开发者生态系统的凭据数据库,并且他们正在出售访问权限给任何愿意支付的人。