网络安全

一个 VS Code 扩展如何打开了 GitHub 内部代码库的大门

GitHub 确认超过 3,800 个内部仓库遭到泄露。探索恶意 VS Code 扩展和 TeamPCP 攻击者如何破坏软件供应链。
一个 VS Code 扩展如何打开了 GitHub 内部代码库的大门

现代软件开发的架构悖论在于,我们最安全的堡垒往往依赖于最脆弱的工具。我们构建了具有加密层和多因素身份验证的高可用、全球分布式平台,然而整个大厦却经常建立在单个开发人员工作站的完整性之上。上周二,这一现实重创了 GitHub——这家微软旗下的子公司是全球源代码的事实上的保险库。虽然 GitHub 的主要基础设施依然稳健,但单个员工设备的沦陷使得名为 TeamPCP 的威胁行为者窃取了大约 3,800 个内部存储库。

从风险角度来看,这一事件是一个教科书式的案例,说明了关键任务环境是如何被绕过的——不是通过核心平台的零日漏洞,而是通过开发人员与之交互的外围工具。评估当今开发人员的攻击面意味着不仅要关注云控制台,还要深入到本地 IDE(集成开发环境)。在这种情况下,入口是一个被投毒的 Microsoft Visual Studio Code 扩展。这是一个清醒的提醒:虽然我们将加密视为防碎的数字保险库,但该保险库的安全性仅取决于持钥匙的人——以及他们用来转动钥匙的工具。

被盗机密的市场

当 TeamPCP(一个因一系列供应链攻击而臭名昭著的威胁行为者)在一家知名的网络犯罪论坛上挂牌出售 GitHub 的内部源代码时,故事传开了。要价为 50,000 美元,该组织戏称这是他们的退休基金。与依靠数字勒索生存的传统勒索软件组织不同,TeamPCP 明确表示这不是一次敲诈尝试。他们打算将数据卖给单一买家,然后“销毁”自己的备份,或者如果没有买家出现,则免费泄露。

当我第一次看到 Dark Web Informer 分享的截图时,我通过 Signal 联系了几位事件响应人员以核实这些说法。虽然论坛上的吹嘘很常见,但 TeamPCP 提供的技术细节(特别是存储库的数量和命名规范)过于详尽,不容忽视。GitHub 最终确认,攻击者声称的约 3,800 个存储库与他们的内部取证调查方向一致。这次外泄代表了严重的机密性泄露,尽管据 GitHub 称,目前存储在该平台上的客户数据的完整性尚未受到影响。

作为隐蔽入口点的 IDE

GitHub 的调查将此次沦陷追溯到一个被投毒的 VS Code 扩展。虽然他们没有正式点名具体的插件,但时间点与已知的 Nx Console 扩展沦陷完全吻合。这正是架构悖论最明显的地方:GitHub 期望其严格的内部访问控制能降低风险,但受信任开发工具的可利用性使得这些防御边界形同虚设。

在幕后,攻击者可能使用了嵌入在扩展中的多阶段凭据窃取程序。由于开发人员通常会授予其 IDE 广泛的权限来与本地文件、环境变量和 SSH 密钥交互,因此一个被攻破的扩展实际上就像一个决定让错误的人群从后门进入的 VIP 俱乐部保镖。一旦扩展在员工设备上激活,攻击者就可以轻而易举地抓取克隆内部存储库所需的令牌和凭据。因此,GitHub 被迫启动了一项大规模的机密轮换工作,优先处理影响最大的凭据,以防止后续活动。

小沙虫 (Mini Shai-Hulud) 蠕虫与 PyPI 投毒

GitHub 内部存储库的泄露并非孤立事件;它是一场更大规模、更普遍的攻击活动的转折点。TeamPCP 利用窃取的凭据攻破了一个拥有 durabletask PyPI 包访问权限的 GitHub 账号——这是一个官方的微软 Python 客户端。通过发布恶意版本(1.4.1、1.4.2 和 1.4.3),攻击者将局部泄露演变成了全球供应链威胁。

这种被研究人员称为“小沙虫”(Mini Shai-Hulud) 的恶意软件极其隐蔽。它是一个自复制的下载器 (dropper),在包被导入的瞬间就会执行。观察当前的威胁格局,我们很少在 Python 包中看到这种程度的复杂性。其有效载荷是一个名为 rope.pyz 的第二阶段脚本,是一个专门为 Linux 系统设计的全功能信息窃取程序。它不仅寻找密码,还会主动尝试解锁并转储 1Password 和 Bitwarden 保险库,获取 HashiCorp Vault KV 机密,并抓取 Docker 和 VPN 配置。

特性 小沙虫 (Mini Shai-Hulud) 描述
目标操作系统 专门针对 Linux 环境进行了优化。
持久化 利用窃取的令牌在云实例之间传播。
隐蔽性 在导入时静默执行,没有可见的错误消息。
数据外泄 针对 SSH 密钥、云提供商凭据和密码管理器。
地理围栏 包含在检测到特定区域设置时执行破坏性命令的逻辑。

通过云基础设施的横向移动

使这场活动真正危险的原因在于它利用现代基础设施进行传播的方式。如果恶意软件检测到它正在 AWS 环境中运行,它会尝试使用 AWS Systems Manager (SSM) 跳向其他 EC2 实例。从前瞻性角度来看,这会将一台受感染的开发人员机器或 CI/CD 流水线变成内部蠕虫的发射台。如果它发现自己在 Kubernetes 集群中,它会使用 kubectl exec 进行扩散。

作为对策,组织通常依赖网络分段,但这种恶意软件通过使用合法的管理协议完全绕过了网络边界。它甚至采用了一种名为 FIRESCALE 的迷人备份 C2(命令与控制)机制。如果主域名被封锁,恶意软件会搜索公共 GitHub 提交消息中的特定 Base64 编码字符串,以找到新地址。这种去中心化的 C2 方法使得该威胁对标准的域名封锁技术具有极强的弹性。

评估人为与技术后果

在多年分析 APT(高级持续性威胁)的过程中,我发现我们经常在“是什么”上花费太多时间,而在“如何做”上投入不足。这里的“是什么”是 3,800 个存储库,但“如何做”是人为防火墙的系统性失效,以及对第三方扩展完整性的过度依赖。我们将 IDE 视为私人工作空间,但实际上,它们是企业攻击面的一部分。

这个特定的威胁行为者还有更黑暗、更反复无常的一面。Aikido Security 的分析师发现,如果恶意软件检测到以色列或伊朗的系统设置,它有“六分之一的机会”播放音频并执行 rm -rf /*。这为原本非常专业的凭据收割行动注入了一丝数字虚无主义色彩。这表明,虽然 TeamPCP 受利益驱动,但他们并不介意为了制造混乱而制造系统性破坏。

主动防御:GitHub 泄露事件的教训

撇开补丁不谈,这里的教训是,我们必须不仅将零信任原则应用于网络,还要应用于我们的开发环境。任何安装了受影响版本 durabletask 的机器或流水线都应被视为完全沦陷。由于该软件包每月下载量超过 40,000 次,这意味着这次泄露的阴影将在行业内笼罩一段时间。

为了在下一次重大泄露之前保护您的数字足迹,我建议采取以下可行步骤:

  • 审计 IDE 扩展: 像对待第三方库一样严格审查 VS Code 扩展。使用内部市场或白名单,防止开发人员安装未经验证的插件。
  • 强制执行短期令牌: 为 CI/CD 流水线使用 OIDC (OpenID Connect),避免使用容易被外泄和重复使用的长期 PAT (个人访问令牌)。
  • 监控 SSM 和 K8s 活动: 为异常的 SendCommandkubectl exec 模式设置警报,特别是那些源自异常服务账户的操作。
  • 机密管理审计: 停止在环境变量或本地文件中存储机密。使用集中的、经过加固的机密管理器,并要求基于硬件的 MFA 进行访问。
  • 审查 PyPI 依赖项: 如果您的组织使用 durabletask,请验证您运行的不是 1.4.1 到 1.4.3 版本。将您的依赖项固定在已知的良好版本,并使用私有存储库管理器来代理公共包。

网络边界已是过时的城堡护城河;新的战场是开发人员的笔记本电脑。除非我们将每个插件和软件包都视为潜在的特洛伊木马,否则我们将继续看到即使是最具韧性的组织也会因为一行被投毒的代码而丢失其核心资产。

来源:

  • GitHub Incident Response and Security Blog (May 2026 update)
  • MITRE ATT&CK Framework: T1195 (Supply Chain Compromise), T1552 (Unsecured Credentials)
  • Wiz Research: Analysis of PyPI Package Poisoning
  • StepSecurity: Investigation into FIRESCALE C2 Mechanisms
  • NIST Special Publication 800-204: Security Strategies for Microservices-based Applications

免责声明:本文仅供信息参考和教育目的,不能替代专业的网络安全审计或事件响应服务。作者和发布者对根据本文提供的信息采取的任何行动不承担责任。

bg
bg
bg

另一边见

我们的端到端加密电子邮件和云存储解决方案提供了最强大的安全通信手段,确保您的数据安全和隐私。

/ 创建免费账户