资讯 Go 首次动用 URGENT track:7.5 小时内发版移除 eMudhra 中间证书信任

2026-10-30 20:01:24

Go 首次动用 URGENT track:7.5 小时内发版移除 eMudhra 中间证书信任

来源:Our Response To The eMudhra Key Disclosure Incident(Roland Shoemaker,代表 Go 安全团队,2026-10-26)

10 月 19 日,Go 团队启动了一次加急安全发布,以保护 Go 用户及其应用免受一起严重的公钥基础设施(PKI)泄露事件影响,涉事证书由 eMudhra 签发。从接到通知到发布定向补丁,全程约 7.5 小时,这也是 Go 第一次启用 URGENT track 安全发布。

eMudhra 事件

10 月 17 日,Mozilla 将 8 张由 eMudhra 控制的根证书签发的中间证书(6 张用于 TLS、2 张用于代码签名)加入 OneCRL,从而在 Firefox 中阻止这些证书被使用。不久后,多位安全研究者注意到这一动作并开始调查原因。10 月 19 日,Go 安全团队获知了这些调查及其结论:这些中间证书对应的私钥强度极弱,可在微秒级恢复出私钥。

由于 eMudhra 根证书存在于大多数受信任根证书计划中,一旦私钥被恢复,攻击者就能为任意域名签发 TLS 证书,而无需像正常流程那样证明对该域名的控制权。攻击者可借此对 TLS 连接实施中间人攻击(MITM):对于目标机器尝试连接的任意 TLS 服务器,攻击者都能出示一张“合法”证书,从而冒充该服务器。

Go 标准库自带 TLS 证书验证器。当用户通过 net/http 或 crypto/tls 连接 TLS 服务时,该验证器会校验对端出示的证书是否有效。在 Windows 和 macOS 上,这些校验被委托给平台 API;在 Linux 上,由于缺少平台 API,Go 使用自己的验证器实现。

Linux 没有统一的、内置的撤销检查机制。为了让可能收不到平台更新的其他平台上的用户也能及时得到修复,Go 团队决定通过一次 URGENT track 安全发布直接移除信任。

事件时间线(PDT)

  • 11:45 — Go 安全团队收到一位独立外部研究者的告警,提到 Mozilla 及其他组织采取了未公开的移除信任动作,涉及 8 张 eMudhra 中间证书。很快确认原因是这些证书使用了弱私钥。
  • 12:30 — Mozilla 独立向 Go 安全团队报告该问题,确认了问题本身,并要求 Go 团队不要立即披露,同时鼓励尽快发布修复。
  • 14:00 — 补丁定稿,阻止使用链到受损中间证书的证书。最初告警的研究者提供了一组用已恢复私钥签发的测试证书,用于验证补丁。
  • 15:00 — 启动 1.27.3 与 1.26.10 两个小版本的发版流程。鉴于问题的紧急性和可利用性,并且判断私钥很可能在数小时内被公开,团队认为立即发布是最稳妥的选择。
  • 19:13 — 发布完成并对外公告。此时底层问题尚未广泛传播。为了给其他防守方争取保护尽可能多用户的时间,同时不向攻击者暴露利用方式,补丁和公告措辞刻意含糊,只提示用户“因特定安全顾虑,正在阻止对一小批中间证书的信任”,并敦促立即升级。

从首次接到通知到补丁版本全球上线,用时不到 7.5 小时。到 10 月 20 日早晨,已有多个独立研究者公开披露了弱私钥问题。

经验与改进

这是 Go 第一次 URGENT track 安全发布,发版过程中遇到了若干问题,导致耗时超出预期。发版流程本身从启动到完成用了接近 4 小时 15 分。这些问题此前未造成影响,因为常规发版流程会分散在数天内完成。

PRIVATE track 的安全修复会在发布前 3 到 7 天预公告。URGENT track 的时间表更短,但仍可以在启动发版流程时就预公告即将到来的发布,让用户至少有几小时准备时间。

在 Windows 和 macOS 上,Go 依赖平台 API 提供的撤销机制;Linux 目前没有类似机制。这一缺失是本次加急发版的主要驱动因素之一。因此 Go 团队计划优先补齐 Linux 上的撤销支持,以缓解未来同类问题,其中一部分工作是调研对 upki 项目的支持(目标是为 Linux“提供可靠、隐私保护且高效的证书撤销”,见 issue #82402)。

检查与升级你的部署

如果运行的是会通过 TLS 访问网络服务的 Go 二进制(例如直接使用 net/http、crypto/tls,或经由 gRPC 等依赖),请确认已运行最新的小版本。用 Go 1.27.3 和 1.26.10 重新构建的二进制会自动拒绝由受损 eMudhra 中间证书签发的证书。

查看当前工具链版本:

go version

查看某个二进制是用哪个 Go 版本构建的:

go version -m

也可以用 govulncheck 判断二进制是否受影响:

GOTOOLCHAIN=go1.27.3+auto go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck -mode=binary

静态链接的二进制不会随系统更新自动获得修复,需要用上述版本自行重新编译。

复制全文 生成海报 Go 安全发布 TLS 证书 运维

推荐文章

程序员茄子在线接单