14小时的信任劫持:Coder模块注册表供应链攻击事件深度复盘

· 2026-09-08 12:03 · 3 阅读

原创 威胁情报中心 2026-09-08 12:03 北京

Coder 披露其模块注册表 registry.coder.com 的底层 Cloudflare 基础设施遭到入侵:一名身份不明的攻击者向该注册表的服务器地址池中添加了未经授权的 IP 地址,这些地址上运行着一个被篡改的注册表副本,其中分发的 Terraform 模块携带了窃密代码。

威胁深度分析 · 供应链安全

14小时的信任劫持

Coder模块注册表供应链攻击事件深度复盘

攻击者没有篡改任何一个软件包,只是改了"路标"——而所有信任这个域名的构建流水线,亲手把密钥交了出去。

· Cloudflare劫持 · Terraform · 供应链安全 · 2026

01 事件速览

2026年9月1日,云开发环境平台 Coder 在 GitHub 发布了一份严重级别为 Critical 的安全公告(GHSA-vx42-ghc9-gw65),披露其模块注册表 registry.coder.com 的底层 Cloudflare 基础设施遭到入侵:一名身份不明的攻击者向该注册表的服务器地址池中添加了未经授权的IP地址,这些地址上运行着一个被篡改的注册表副本,其中分发的 Terraform 模块携带了窃密代码。

关键信息一览:

项目

内容

事件类型

软件供应链攻击(分发渠道劫持)

受影响服务

Coder 模块注册表(registry.coder.com

恶意代码投递窗口

2026年8月31日 07:35 — 21:45 UTC(北京时间15:35 — 次日05:45),约14小时

攻击入口

Coder 的 Cloudflare 基础设施(据 Coder 官方博客,攻击者使用了被盗用的 Cloudflare API 密钥)

恶意载荷

被篡改的 Terraform 模块,内嵌 data "external" "telemetry" 块调用窃密脚本

窃取目标

云厂商与 AI 工具 API 密钥、CI/CD 凭据、OIDC 令牌、SSH 密钥等

外传目的地

仿冒域名 coder-infra[.]com

受影响版本

Coder < 2.37.0

修复版本

2.37.0、2.36.4、2.35.7、2.34.9

CVE 编号

暂无

CVSS 4.0

CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

Coder 是一个开源的自托管云开发环境(CDE)平台,允许企业通过 Terraform 模板为开发者按需创建工作区。其公开用户名单中包括 Dropbox、Palantir、Square、Mercedes-Benz、KKR、EnBW 以及美国政府机构和国防承包商——这意味着本次事件的潜在受害面远超一般开源项目。

图 | Coder平台工作区与模板管理界面(图源:Coder 官方文档 coder.com)

02 攻击链还原:被篡改的不是包,而是"路标"

复盘这起事件,最值得品味的一点是:Coder注册表仓库里的模块内容自始至终没有被修改过。攻击者甚至没有碰 Coder 自己的代码库和 Google Cloud 基础设施。

图 | Coder模块注册表供应链攻击链全景图(图源:根据 Coder 官方公告及公开报道绘制)

完整的攻击链条是这样的:

1拿到Cloudflare的控制权 —— 攻击者获取了 Coder 的 Cloudflare 基础设施访问权限。根据 Coder 官方博客的说明,攻击者使用的是一枚被盗用的Cloudflare API 密钥。至于这枚密钥最初如何失窃,官方尚未披露。

2污染源站地址池 —— registry.coder.com 运行在 Cloudflare 之后。攻击者向该域名的源站地址池中添加了由自己控制的 IP 地址(已公开的一个为 199.91.220[.]205),这些服务器上部署着一份携带恶意代码的注册表副本。

3等待流量被"合法"分流 —— 由于地址池被污染,Cloudflare 按正常负载逻辑将一部分对 registry.coder.com 的请求路由到了攻击者的服务器。对用户侧而言,DNS 解析正常、TLS 握手正常、域名也是正确的官方域名——没有任何传统意义上的告警会被触发。唯一"不对"的,是返回的 Terraform 模块被动了手脚。

4凭据收割与外传 —— 恶意模块在被拉取并执行后,扫描环境中的各类凭据,并外传至仿冒域名 coder-infra[.]com——该域名与 Coder 正常使用的域名高度相似,具有较强的迷惑性。

这与我们以往常见的供应链攻击(向 npm、PyPI 等仓库上传恶意包、劫持维护者账号、抢注相似包名)存在结构性差异:攻击者不需要“发布”任何东西,只需要改变谁在回答这个域名的请求”。包的源头是干净的,路是脏的。

图 | 域名劫持原理类比示意图——攻击者通过污染解析/路由环节,让访问者在域名不变的情况下被引导至恶意服务器(图源:Cloudflare 官方博客)

Coder 方面表示,团队在事发当天完成了识别与处置:恶意 IP 已从地址池移除,缓存已清理,registry.coder.com 已确认恢复干净。

03 恶意模块剖析:藏在Terraform外部数据源里的窃密脚本

图 | 恶意Terraform模块从触发、执行到凭据外传的完整流程——以及对应的防守方检测锚点(图源:根据 Coder 官方公告绘制)

3.1 触发机制:合法的"逃生舱口"被当成执行通道

恶意模块的核心是一个 Terraform 外部数据源(external data source)块:

data"external""telemetry" {

# 调用 ${path.module}/dlp.sh(或 dlp-docker.sh)

}

这是本次攻击在技术上最"精巧"也最朴素的一环。Terraform 的 external 数据源是 HashiCorp 官方提供的合法功能,文档将其描述为“常规 Provider 不适用时的逃生舱口(escape hatch)”——它允许 Terraform 在 plan/apply 阶段执行一个外部程序,并且会将 Terraform 进程可见的环境变量传递给这个子进程。

也就是说,恶意模块不需要任何漏洞利用、不需要提权、不需要混淆对抗:只要模块被正常拉取并执行,窃密脚本就以 Provisioner(供给器)进程的权限运行,能看到供给器能看到的一切。

官方给出的排查哨兵字符串是 data.external.telemetry——在供给器任务日志中搜索该字符串,即可定位可疑执行记录(公告中同时提供了对应的 SQL 慢查询语句)。

3.2 载荷家族:一份脚本,多个变种

公告披露了6个恶意脚本文件的 SHA-256 哈希:一个 dlp-docker.sh 和五个 dlp.sh 变种(common、aider、rstudio-server、windows-rdp、zed)。从命名可以看出,攻击者针对 Coder 注册表中不同的模块/模板场景分别准备了适配版本——包括 AI 编码工具 aider、RStudio Server、Windows RDP、Zed 编辑器等主流工作区模板。载荷文件名中的 "dlp"(数据防泄漏的通用缩写)也颇具讽刺意味。

3.3 窃取范围:两种执行场景,两套风险边界

公告将恶意模块的执行场景分为两类,凭据暴露面截然不同:

场景一:模板操作(新建模板、更新模板版本、模板变更的 dry run)。此场景下供给器不会被注入用户级秘密,风险限于供给器自身的环境变量与秘密——这已经足够致命,因为供给器通常持有云基础设施的最高权限凭据。

场景二:工作区构建(workspace build)。在供给器自身秘密之外,还会额外暴露三类用户级秘密:

用户的 OIDC 令牌;

用户的 SSH 私钥(若为用户配置了 SSH 密钥);

为受影响模板配置的外部认证提供商的一次性令牌(公告明确:不包含刷新令牌)。

此外还有一个容易被忽略但后果严重的放大器:如果供给器不是作为独立服务运行,而是作为 coderd(Coder 控制面进程)的一部分运行,那么 coderd 的配置变量也会一并泄露——包括数据库密码、外部认证提供商配置等核心秘密。

综合官方公告与公开报道,恶意代码的目标清单包括:

  • 供给器环境变量与秘密

  • 云基础设施(AWS/GCP/Azure 等)API 密钥

  • AI 工具 API 密钥

  • CI/CD 凭据

  • 配置文件中的秘密

  • 终端历史记录(人们常在其中粘贴令牌和连接串)

  • 用户 OIDC 令牌

  • SSH 私钥

  • 外部认证一次性令牌

  • coderd 内嵌场景下的数据库密码与平台配置秘密

收集到的信息通过 HTTP(S) 外传到 coder-infra[.]com,并伴随一个特征请求头 X-CLI-Token

04 影响面:一场无法"点名"的事件

本次事件最让防守方难受的地方在于:受影响范围无法被精确界定

按正常事件响应逻辑,厂商可以通过服务端访问日志列出"谁在窗口期内下载了什么"。但这次与受害者通信的是攻击者控制的服务器,关键日志掌握在攻击者手里。Coder 在公告中坦承:他们无法最终确定哪些用户受到了影响,只能建议所有用户自行排查。

自查的判定逻辑是:如果你的 Coder 部署在 2026年8月31日 07:35 — 21:45 UTC 之间从官方注册表下载过模块,就可能中招。模块下载主要发生在:

1创建新模板或新模板版本时(最典型的触发点);

2模板设置中关闭了Terraform模块缓存的情况下创建工作区时(缓存默认开启,因此属于次要路径)。

这意味着,即使你的团队当天没有人手动操作模板,只要流水线在那个窗口内触发了模板导入,恶意模块就可能已经进入你的环境。14 小时的窗口覆盖了欧洲几乎整个工作日和美洲的大半个工作日,对高频构建的 CI 流水线而言,暴露机会远不止"一次拉取"这么简单。而且被拉取过的模块可能已缓存在部署基础设施中,即使窗口关闭,缓存的恶意副本仍可能被重放。

两个相对积极的信息:

  • Coder 表示,没有证据表明其维护的客户数据受到影响

  • 刷新令牌不会被传递给供给器,因此不在暴露范围内。

但需要注意,“我们没被通知受影响”在这类事件中不构成任何证据——沉默只代表攻击者的服务器没告诉你它见过你。

05 结构性盲区:为什么完整性校验没有拦住它?

很多读者会问:现代包管理不是都有哈希校验、签名验证吗?为什么恶意模块能一路畅通?

答案在于 Terraform 的一个长期存在的机制性缺口:Terraform的依赖锁定文件只校验Provider,不校验模块(Module)。

.terraform.lock.hcl 记录了 Provider 的版本选择和密码学哈希,每次初始化都会比对;但没有任何条目描述远程模块——没有哈希比对,没有签名验证,也就不存在"校验失败"这一说。即使你为模块钉死了精确版本号,版本约束控制的也只是"请求哪个版本",而不是"哪台服务器来回答这个请求"。当分发路径本身被劫持时,版本号一模一样,内容却可能天壤之别。

这正是本次事件与今年其他供应链事件(如向 crates.io 上传投毒包、npm 维护者账号被盗后植入后门等)的本质区别:那些攻击需要攻击者"发布"点什么,而这次,发布环节完全被绕过了

类似的无校验信任链条在开发者工具生态中并不少见:不带摘要钉定的容器镜像标签、从 URL 直接管道执行的安装脚本、不做来源验证的 Helm Chart……本次事件只是把这块盲区以最直白的方式演示了一遍。

06 检测与处置建议

如果你的组织在 2026年8月31日 07:35 — 21:45 UTC 窗口内存在上述任一模块拉取行为,建议按以下顺序处置(升级、排查、轮换是三件独立的事,缺一不可):

1网络侧狩猎 —— 最先做,避免清理动作破坏证据。检索防火墙、代理、DNS 解析、VPC Flow Logs 中是否存在对 coder-infra[.]com 或 199.91.220[.]205 的出站连接。一旦发现命中,事件性质即从"预防性排查"升级为"确认失陷"。

2日志与数据库排查 —— 在供给器任务日志中搜索哨兵字符串 data.external.telemetry;运行官方公告中提供的 SQL 查询,识别窗口期内缓存的模块文件、受影响的模板版本及关联工作区。

3清除缓存 —— 运行官方提供的事务性 SQL 脚本,将窗口期内的缓存模块文件从部署中删除(cached_module_files 置空并删除对应 files 记录),确保后续重新部署时拉取的是干净副本。

4升级 —— 升级至 2.37.0 / 2.36.4 / 2.35.7 / 2.34.9 中的任一修复版本。官方表示后续版本将包含自动化的修复步骤。

5凭据轮换 —— 升级只能关闭投递通道,无法作废已经流出的秘密。建议按优先级轮换窗口期内供给器可触及的所有凭据:

  • 云基础设施 API 密钥(AWS/GCP/Azure 等,优先处理,可直接导致云环境失陷);

  • AI 工具 API 密钥(按量计费,易被静默滥用);

  • CI/CD 凭据、流水线令牌、制品库凭据、部署密钥;

  • SSH 密钥(在代码托管平台和堡垒机上重新签发);

  • 在身份提供商侧强制 OIDC 会话失效与重新认证;

  • 若供给器内嵌于 coderd 运行:轮换 Coder 数据库密码及平台配置秘密。

6长期加固 —— 通过 terraform providers lock 为多平台生成可校验的 Provider 哈希,鉴于模块无校验机制,对关键模块考虑 vendor 到自有仓库中管理;关注供应链签名体系(如 Sigstore)在 IaC 模块分发中的落地进展;对 CI 环境中的高权限云凭据实施最小权限与短生命周期改造,压缩此类事件的爆炸半径。

07 技术附录

7.1 MITRE ATT&CK 技术映射

战术

技术ID

技术名称

事件中的体现

资源开发

T1583.001

Acquire Infrastructure: Domains

注册仿冒域名 coder-infra[.]com 作为接收端

资源开发

T1584

Compromise Infrastructure

在自有服务器上部署被篡改的注册表副本

初始访问

T1078.004

Valid Accounts: Cloud Accounts

使用被盗用的 Cloudflare API 密钥访问 Coder 的 Cloudflare 基础设施

初始访问

T1195.002

Compromise Software Supply Chain

污染 registry.coder.com 源站地址池,劫持软件分发渠道投递恶意 Terraform 模块

执行

T1059.004

Unix Shell

恶意模块通过 Terraform external 数据源执行 dlp.sh / dlp-docker.sh 窃密脚本

凭据访问

T1552.001

Credentials In Files

扫描配置文件、环境变量、终端历史中的秘密

凭据访问

T1552.004

Private Keys

窃取用户 SSH 私钥

凭据访问

T1528

Steal Application Access Token

窃取用户 OIDC 令牌及外部认证一次性令牌

命令与控制

T1071.001

Web Protocols

通过 HTTP(S) 与 coder-infra[.]com 通信,携带 X-CLI-Token 特征头

数据外泄

T1041

Exfiltration Over C2 Channel

将窃取的凭据外传至攻击者控制的仿冒域名

7.2 失陷指标(IoC)

网络指标

类型

指标

域名

coder-infra[.]com

(仿冒域名,凭据接收端)

IP 地址

199.91.220[.]205

HTTP 请求头

X-CLI-Token: your-secret-token

文件指标(SHA-256)

文件名

SHA-256

dlp-docker.sh7190a17c593276d7fd71c4863a4bc0b6c957ed14249288e6f64c5540e2c49398
dlp.sh

 (common)

a7f4fa5f7e33b2a6f6488cf28444584caa449144d246b083de919162f5514247
dlp.sh

 (aider)

414d01f6072fbf05bef513e277f4c2b504a413c8e2aa5bae133a5cbc0cda9dc1
dlp.sh

 (rstudio-server)

a64ce3038f2a501c9735abf6a1f9f04cbddbad53371cd68bec0f7510365c8ffa
dlp.sh

 (windows-rdp)

ebbe0d2ed8cfaf9e19edb38ce44d6b407f9771b5c0813a7add27c05f66e89596
dlp.sh

 (zed)

7ef6b8c3c976fb60b3fa22e9e294ba548d9b532e060c1323a0124a3a7a647f13

日志/代码特征

类型

特征

Terraform 代码块

data "external" "telemetry"

 块,调用 ${path.module}/dlp-docker.sh

供给器日志哨兵字符串

data.external.telemetry

Coder 数据库排查

官方公告提供的三段 SQL 查询(模板/工作区缓存模块识别、日志哨兵搜索、缓存清理)

时间窗口

恶意模块投递窗口:2026-08-31 07:35 UTC — 2026-08-31 21:45 UTC

7.3 受影响与修复版本

  • 受影响版本:Coder < 2.37.0

  • 修复版本:2.37.0 / 2.36.4 / 2.35.7 / 2.34.9

  • CVSS 4.0 向量:CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

08 参考链接

1. https://github.com/coder/coder/security/advisories/GHSA-vx42-ghc9-gw65

2. https://coder.com/blog/coder-registry-security-incident-what-happened-and-what-to-do

3. https://www.bleepingcomputer.com/news/security/coders-registry-infrastructure-compromised-to-push-malicious-modules/

4. https://www.esecurityplanet.com/cybersecurity/news-coder-registry-malicious-terraform-modules/

5. https://www.scworld.com/brief/coder-platform-targeted-by-attackers-delivering-malicious-terraform-modules

6. https://www.gblock.app/articles/coder-registry-cloudflare-hijack-terraform-credentials-2026

阅读原文

跳转微信打开