平台工程
eMudhra CA 失陷事件:为什么只给 Kubernetes 节点打补丁还不够
eMudhra 失陷事件如何影响 Kubernetes 节点、容器镜像、应用运行时和 CA 证书包,以及每一层需要在哪里更新。
Todea Engineering
云原生实践

2026 年 10 月,一位研究人员发现,证书颁发机构 eMudhra 生成的八个证书签名私钥并不是随机的 384 位数值,而是单字节数字(4、56、66、115、155、156、230 和 237),因此任何人都能在一秒之内从公开的 CA 证书中恢复出这些私钥。恢复出受影响 TLS 签名密钥的人,可以为自己并不控制的域名签发证书。如果攻击者还能拦截或重定向流量,就可以向仍然信任这些已失陷颁发者的客户端冒充合法服务。即使你自己的证书并非由 eMudhra 签发,你的连接同样可能面临风险。一旦客户端接受了伪造的证书,攻击者就能获取通过该连接发送的凭据和请求数据,并返回被篡改的响应。
主流浏览器已收到屏蔽受影响证书的更新,但这些保护不会自动延伸到 Kubernetes。节点、容器镜像、应用运行时和集群配置,各自都可能提供受信任的证书,或应用自己的校验规则。该修复哪里,取决于正在运行的组件实际使用的是哪一个。
Kubernetes 把信任放在哪里
Kubernetes 集群并不使用单一的共享信任库。容器运行时通常依赖节点上的证书,应用可能在镜像里自带证书包,语言运行时还可能再提供一套。额外的 CA 证书包也可以存放在 Kubernetes 配置中,并挂载到工作负载里。
这些副本是各自独立更新的。正在运行的进程还可能保留更新之前加载的证书,所以修正了文件,并不一定就修正了应用的信任决策。下面几节会说明每一层需要更新什么,以及什么时候需要重启或重新加载。
受影响的是信任这些公共颁发者的连接。仅信任私有集群 CA 或网格 CA 的连接,不会因为这次事件而自动暴露在风险之下。
下图对比了一次典型的镜像拉取和一次应用程序连接。根据 TLS 配置的不同,应用可能使用图中所示来源中的一个或多个。
节点的信任和工作负载的信任沿着不同的路径更新。每个正在运行的客户端都必须重新加载发生变更的证书。
1. 节点:容器运行时与控制平面
Kubernetes 下载镜像时,kubelet 会请求 containerd 或 CRI-O 这样的容器运行时去拉取。运行时连接镜像仓库,并使用节点信任的 CA 校验其 HTTPS 证书。为 containerd 或 CRI-O 配置的仓库专用 CA 是追加到这个证书池中,而不是取代它,所以节点的证书包对这些仓库依然生效。
如果这份信任配置仍然接受已失陷的颁发者,位于网络路径上的攻击者就可以冒充镜像仓库。这发生在工作负载启动之前,所以更新工作负载镜像内的证书并不能保护这次下载。
安装发行版的 CA 更新,或者用已修复的节点镜像替换节点。然后重启那些缓存了旧证书的相关进程,其中包括容器运行时,以及相关的节点组件和控制平面组件。新启动的诊断工具可能已经在用更新后的证书包,而长时间运行的服务却仍在使用旧的。
控制平面同样需要关注。在 kubeadm 集群中,API server 和 controller manager 会挂载节点上的证书目录。这些证书库可能被用于对外的 HTTPS 连接。例如,当准入 webhook 的配置省略了显式的 caBundle 时,API server 会使用系统根证书;如果提供了证书包,则必须单独审查该证书包。
对于 kubeadm 的控制平面组件,请使用受支持的静态 Pod 重启流程。通过 API 删除它们的镜像 Pod(mirror Pod)对象,并不会重启底层的容器。对于多副本的控制平面,请逐个节点滚动进行,并在继续之前确认其已就绪。
此外,还要部署包含证书校验修复的、适用的 Kubernetes 和运行时版本。对于托管 Kubernetes,请遵循提供商关于控制平面和节点镜像发布的指引。提供商的更新不会自动替换你的应用镜像或自定义 CA 证书包。
2. 镜像:容器自带的信任库
更新节点的 CA 证书包,并不会更新其上容器镜像内的证书。许多镜像自带 /etc/ssl/certs,里面是镜像构建时安装的证书。
披露网站提供了一些测试端点,它们会出示受影响颁发者签发的证书。下面的命令使用某个特定的 curl 镜像检查 emSign 端点:
kubectl run curl --image=curlimages/curl:8.22.0 --restart=Never --rm -i -- \
-sS -o /dev/null -w '%{http_code}\n' https://dv-g3b-emudhra.we-have-a-problem.com/下面的对比在同一个已更新 CA 软件包的节点上使用了两个镜像:
| 镜像 | Alpine CA 证书包 | 结果 |
|---|---|---|
curlimages/curl:8.22.0 | 20260611-r0 | 接受:HTTP 200 |
curlimages/curl:8.23.0 | 20261020-r0 | 拒绝:curl: (60) |
较旧的镜像仍然接受受影响的证书,因为它自带的证书包早于这次修复。对于你自己维护的镜像,请更新 CA 软件包、重新构建并重新部署。对于厂商镜像,请使用包含修复的版本,并确认正在运行的 Pod 已经用上它。
这检查的是 curl 的信任配置。同一个容器中的应用可能使用不同的证书包或运行时,拒绝这个端点也并不能证明其他所有证书链都被拦截。
3. 运行时:应用的证书校验
应用并不总是使用镜像的 /etc/ssl/certs。有些运行时自带受信任的证书。还有一些运行时包含拒绝已失陷签名密钥的代码,即使信任库中仍然保留着受影响的根证书。
Go 与 Kubernetes 的关系尤其密切,因为 Kubernetes 的控制平面组件和许多控制器都是用 Go 编写的。Go 1.27.3 和 1.26.10 在 crypto/x509 中加入了一份阻止列表,会拒绝包含已失陷密钥的证书链。
用三个 Go 版本构建的测试客户端可以说明其中的差别。在使用同一份过期 CA 证书包的情况下,结果如下:
| Go 工具链 | emSign 测试主机 | kubernetes.io |
|---|---|---|
go1.26.9 | 接受 | 接受 |
go1.26.10 | 拒绝:x509: no valid chains built | 接受 |
go1.27.3 | 拒绝:x509: no valid chains built | 接受 |
更新后的客户端会拒绝受影响的证书,同时仍然接受对照连接。这种保护是编译进应用里的:请部署使用已修复工具链构建的版本,或者自行重新构建并重新部署。go.mod 中声明的版本并不能说明已部署的二进制是由哪个工具链构建的。请同时检查二进制的构建元数据和它的实际行为。
Java、Node.js、Python 和 Rust 应用同样需要针对各自运行时的检查。请查阅运行时的安全指引,以及任何单独打包的 CA 软件包,例如 Python 的 certifi。更新操作系统的证书并不一定会更新这些副本。
4. 集群配置:Kubernetes 对象中的 CA 证书包
Kubernetes 对象中可以保存 CA 证书包,供工作负载和控制器校验连接时使用。更新节点或容器镜像并不会替换这些已保存的副本。
请检查你的应用获取受信任证书的各个位置:
- ConfigMap 和 Secret,包括 Argo CD 的
argocd-tls-certs-cm、包含ca.crt的 Secret,以及 Istio 或 Kasten 引用的证书包。 - Kubernetes API 配置,包括准入 webhook、APIService 和 CRD 转换 webhook 中的 CA 证书包。
- 应用配置,包括自定义资源和 Helm values 中的 CA 设置,以及 trust-manager 分发的证书包。
请使用披露网站受影响根证书列表中的 SHA-256 证书指纹来识别这些根证书。同时检查被显式信任的受影响中间 CA 证书。不要仅仅因为无关的私有集群信任锚或网格信任锚存放在同一类 Kubernetes 对象中,就把它们删除。
如果你在使用 trust-manager,请检查它的默认 CA 软件包,以及是否覆盖了仓库或标签。v0.25.0 及之前的 chart 默认安装受影响的软件包;v0.26.0 安装的是已修复的软件包。更新默认软件包并不会移除通过其他 Bundle 来源提供的受影响证书。
可用的修复与升级指引
下面的表格基于 2026 年 11 月 9 日的快照,列出了 Kubernetes 组件、托管集群和云原生工具所需的操作。在规划上线之前,请查阅所链接的项目指引,确认是否有更新的版本。自定义证书包、辅助程序和其他镜像变体仍然需要单独检查。
Kubernetes 与容器运行时
| 项目 | 所需操作 |
|---|---|
| Kubernetes | 使用 v1.37.2、v1.36.6、v1.35.10,或历史修复版本 v1.34.13。优先选择仍受支持的次要版本。节点的信任库需要单独更新;更新二进制并不会从镜像中移除证书。 |
| containerd | 安装发行版的 CA 更新并重启 containerd。如果有,请使用以已修复的 Go 重新构建的厂商软件包,例如 Docker 的 containerd.io 2.4.2-3。选择更新的版本之前,请先查看上游的发布说明。 |
| CRI-O | 更新节点的 CA 软件包并重启 CRI-O。使用已修复的厂商构建,或你所用受支持分支的下一个修复版本。OpenShift 用户应遵循 Red Hat 的发布指引。 |
| etcd | 使用相应分支上的 v3.7.3、v3.6.16 或 v3.5.35。检查自定义 CA 配置,以及使用镜像 CA 证书包的其他程序。 |
| k3d | 显式选择已修复的 k3s 镜像,例如 rancher/k3s:v1.37.2-k3s1,或与你的次要版本对应的修复版本。这更新的是节点,并不会更新 k3d CLI 自身的 TLS 校验。 |
| k3s、RKE2 | 使用 k3s v1.37.2+k3s1、v1.36.6+k3s1 或 v1.35.10+k3s1,或对应的 RKE2 +rke2r1 版本。历史的 1.34 修复版本也存在;请把不再受支持的分支迁移到仍在维护的版本。 |
托管 Kubernetes
提供商已发布更新,并不代表更新已经到达你的集群。请检查控制平面、节点镜像和发布状态,然后单独处理由客户自行管理的工作负载。
| 提供商 | 所需操作 |
|---|---|
| Amazon EKS | 将托管节点、自管理节点和 Karpenter 节点滚动更新到已修复的 AMI。AWS 将 AL2023 v20261023 认定为信任库修复版本;快照则建议使用 v20261031,因为它还包含 containerd 的重新构建。Bottlerocket 请使用 v1.68.0 或更高版本,并确认 Auto Mode 的节点替换已经完成。 |
| Google GKE | 请严格使用 Google 安全公告中列出的控制平面和节点版本。在记录快照时,面向 1.33、1.36 和 1.37 的 Ubuntu 修复仍未发布。请遵循提供商支持的手动升级路径,并单独重新构建应用镜像。 |
| Azure AKS | 通过节点镜像升级流程,将 Linux 节点池滚动更新到镜像 202610.23.0 或之后的已修复镜像。确认 Windows 节点已收到更新后的证书信任列表,尤其是在自动更新受限的环境中。 |
| Red Hat OpenShift | 根据你的次要版本和可用的更新通道,选择已修复的 z-stream。适用时请包含重新构建的 CRI-O,例如 4.21 上的 4.21.41。确认 machine-config 的发布已经完成;不要根据 4.x 的安全公告推断 5.x 也已覆盖。 |
| IBM Cloud | 应用 11 月 2 日的 worker 修复包,其中包含对 RHCOS 的覆盖。更早的 10 月 27 日修复包覆盖 Ubuntu 和 RHEL 9 worker。确认每个 worker 都已更新或替换。 |
| Nebius | 将节点组升级到基础设施版本 78 或之后的已修复版本,然后验证替换后的节点。应用镜像和挂载的 CA 证书包仍然需要单独更新。 |
| Oracle OKE | 确认节点的软件包与相关的 Oracle Linux 安全公告一致,适用时包括 ELSA-2026-88550 或 ELSA-2026-88459。不要仅凭镜像的构建日期在 11 月就认定它已经修复。 |
| Alibaba ACK | 确认节点操作系统使用的是已修复的 ca-certificates 软件包,并使用 ACK 支持的更新流程或节点替换流程。原地更新之后请重启运行时。在把新镜像视为已修复之前,请先查看提供商的指引。 |
| DigitalOcean、Akamai、OVHcloud、Scaleway、Civo、Tencent | 向提供商询问哪些节点镜像和托管组件包含了修复。验证正在运行的节点软件包和运行时,然后使用受支持的发布流程。没有公开的安全公告,并不能说明某项服务存在漏洞或已经修复。 |
| Naver Cloud、NHN Cloud、KT Cloud、Samsung SDS | 向提供商确认已修复的节点镜像或 CA 软件包,并检查已部署的版本。使用提供商支持的发布流程,必要时包括重启。 |
服务网格、网关与网络
| 项目 | 所需操作 |
|---|---|
| Istio | 使用快照中的 1.31.4 或 1.30.8,或之后受支持的补丁版本。修复从 1.31.3 和 1.30.7 开始提供。出站(egress)使用的自定义 CA 证书包需要单独检查;1.29.10 没有加入 Go 阻止列表。 |
| Linkerd | 使用 edge-26.11.1 或之后的已修复 edge 版本,并更新 CLI。只要信任锚中只包含你自己的私有 CA,私有的网格 mTLS 就不会通过公共根证书暴露。使用公共 CA 的地方和自定义证书包需要单独检查。 |
| Buoyant Enterprise for Linkerd (BEL) | 升级到你所用受支持 BEL 分支的修复版本,并遵循 Buoyant 的发布指引。自定义证书包需要单独检查。仅凭代理依赖项的检测结果,并不能说明只信任私有网格根证书的网格 mTLS 已经暴露。 |
| Envoy | 使用相应分支上的 v1.40.2、v1.39.6、v1.38.9 或 v1.37.11。更新所有通过 trusted_ca 提供的证书包;更新镜像并不会替换这类自定义证书包。 |
| Envoy Gateway | 在查看升级变更之后使用 v1.10.0。在 v1.9.3 或 v1.8.6 上,请配置对应的已修复 Envoy 镜像,例如 distroless-v1.39.6 或 distroless-v1.38.9,并滚动更新代理。 |
| Cilium | 使用你所用受支持分支上的 1.20.4、1.19.10 或 1.18.16。让 agent、operator 和 cilium-envoy 镜像与 chart 保持一致,包括任何标签或摘要的覆盖配置。 |
| Consul | 将 Consul、consul-k8s 和 consul-dataplane 升级到所列的 2.1.0 版本。对于 terminating gateway,请在 CAFile 中配置已修复的证书包,并确认网关已加载它。 |
| Kuma | 使用相应分支上的 3.0.1、2.14.7、2.13.12 或 2.11.20。如果自定义 Corefile 使用了 DNS-over-TLS 转发,请单独检查 CoreDNS 辅助程序的 TLS 校验和信任库。 |
| Traefik | 使用相应分支上的 v3.7.17 或 v2.11.61;v3.7.16 也包含该修复。替换较旧的镜像,并检查任何针对后端的自定义 CA 配置。 |
| NGINX Gateway Fabric | 升级到 2.8.1,并确认控制器和 NGINX 数据平面的 Pod 都在运行更新后的镜像。检查上游 TLS 使用的任何自定义 CA 证书包。 |
| ingress-nginx(已停止维护) | 规划迁移到仍在维护的控制器。迁移期间请检查上游 TLS 校验和 proxy-ssl-secret 的 CA 证书包。禁用上游证书校验并不是这次事件的缓解措施。 |
| Kong Ingress Controller | 使用相应分支上的 KIC 3.5.14 或 3.4.21。Kong Gateway 需要单独更新,并检查自定义 CA 证书包;控制器的修复并不覆盖网关的出站连接。 |
| Kong Gateway Enterprise | 使用 Kong 支持的配置加载已修复的出站 CA 证书包,适用时包括 lua_ssl_trusted_certificate。验证所有相关的 TLS 路径,并在厂商提供已修复的镜像后采用它。 |
| Contour | 将 Contour v1.33.8 与已修复的 Envoy 镜像(例如 distroless-v1.38.9)搭配使用。单独检查所提供的 CA Secret 和 Envoy 的信任配置;控制器中没有证书包,并不代表网关已被覆盖。 |
| Emissary-ingress | 对适用的出站 TLS 连接使用已修复的 ca_secret。升级之前,请确认是否已有已修复的稳定版本。不要假定 4.2.0-rc.0 同时修复了镜像的 CA 证书包。 |
| Calico v3.32 (tigera-operator v1.42) | 将 tigera-operator 升级到 v1.42.7 以部署已修复的组件;如果是基于 manifest 的安装,则应用 v3.32.3 的 manifest。确认所有 Calico 镜像都已完成发布。 |
| Calico v3.33 (tigera-operator v1.44) | 关注下一个已修复的 3.33 版本,在此期间用受支持的方法更新实际生效的 CA 证书库。对于新部署,快照将 3.32.3 列为已修复的选项;没有受支持的方案时,不要对现有集群降级。 |
| CoreDNS、external-dns | 在确认与集群兼容的前提下,使用 CoreDNS 1.15.0 和 external-dns v0.24.0。请检查实际部署的 DNS 镜像,而不要假定 Kubernetes 升级已经更换了它。检查自定义的 TLS 转发设置和 provider 信任设置。 |
证书、身份与策略
| 项目 | 所需操作 |
|---|---|
| cert-manager | 使用相应受支持分支上的 v1.21.3 或 v1.20.5。把不再受支持的旧分支迁移到仍在维护的版本,并单独检查为外部 issuer 配置的 CA 证书包。 |
| trust-manager | 使用 chart v0.26.0,或按安全公告配置对应的已修复 Trixie 或 Bookworm 软件包。同时检查仓库和标签的覆盖配置。确认 Bundle 的目标已经更新,然后重启无法重新加载证书的使用方。 |
| SPIRE | 在查看破坏性变更之后使用 v1.16.0,或使用包含 Go 修复的回移版本 v1.15.5 和 v1.14.9。回移版本的镜像中仍保留着一个受影响的根证书。https_web 联邦和自定义信任包需要单独检查。 |
| Dex | 使用 v2.46.1。如果启动模板会获取远程 HTTPS 数据,请检查随附的 gomplate 辅助程序及其使用的信任库。确保涉及的每个辅助程序都能使用已修复的 CA 证书包。 |
| Keycloak | 使用 26.8.2,或校验已修复的重新发布版本 26.8.1-2 的摘要。用更新后的 JDK 和操作系统信任库重新构建自定义镜像,并检查你额外提供的信任库。 |
| Vault Secrets Operator | 使用 VSO 1.6.2 并确认控制器已完成发布。优先使用已修复的默认镜像,或处理 1.6.2-ubi 中残留的根证书。检查为连接 Vault 配置的 CA 证书包。 |
| External Secrets Operator | 将控制器和 chart 升级到 2.14.0,然后确认发布已经完成。为外部 secret 提供方配置的 CA 证书包,需要独立于控制器镜像进行检查。 |
| Kyverno | 对现有安装使用已修复的信任库,并在变更后重启 Pod。global.caCertificates.data 挂载只替换一个证书包文件;请确认没有其他证书目录把受影响的根证书重新带回来。有已修复的稳定版本时,优先使用它。 |
| OPA | 使用相应分支上的 v1.22.2 或 v1.21.4。按实际部署情况更新默认镜像或 static 镜像,并检查任何针对出站连接的自定义信任配置。 |
| Gatekeeper | 修正进程加载的每一个 CA 文件或目录,然后重启 Pod。只替换一个证书包文件可能并不够。有使用已修复 Go 工具链构建的受支持版本时,请采用它。 |
| cosign | 在镜像签名流程中使用 v3.1.4 发布的二进制,或之后经过验证的构建。如果使用容器镜像,请保留其中已修复的证书包,并检查证书文件或目录的覆盖配置。验证流水线实际使用的制品。 |
| policy-controller | 提供已修复的、实际生效的信任库,并重启 webhook 的 Pod。检查所有被加载的 CA 文件和目录,然后在有已修复版本时采用它。已合并的 Go 更新并不会改变现有的部署。 |
| Falco | 将 Falco 0.45.2 与 chart 9.2.2 搭配使用。同时检查固定了版本的辅助镜像,包括 falcoctl 0.14.3 和 driver-loader 0.45.2,并确认更新后的组件正在运行。 |
| oauth2-proxy | 使用 v7.15.6。优先使用已修复的默认镜像,或处理 Alpine 变体中残留的受影响根证书。单独检查针对 provider 和上游的自定义 CA 证书包。 |
交付与供应链
| 项目 | 所需操作 |
|---|---|
| Argo CD(含 Argo Workflows 和 Argo Rollouts) | 使用 Argo CD 3.6.1、3.5.7 或 3.4.13;Rollouts 1.10.2 或 1.9.3;以及 Workflows 4.1.6 或 4.0.15。确保辅助工具能够使用已修复的证书包,并检查 argocd-tls-certs-cm 及其他覆盖配置。 |
| Helm | 在每一台运行 Helm 的工作站或 runner 上更新信任库。关注后续的发布说明,并在把下载的二进制视为已修复之前,验证它的构建工具链。 |
| Flux | 使用 Flux 2.10.0,或使用文档中为 2.9 和 2.8 列出的、带后缀的控制器重新构建标签(需完全一致)。不带后缀的旧标签不一定已被替换。升级之前,请查看 2.10 中 RBAC 和 notification API 的变更。 |
| Tekton Pipeline | 使用 v1.18.0,或适用的仍在维护的回移版本 v1.15.5、v1.12.3 或 v1.9.9。对于使用 Git CLI 的 Git resolver,请修正 Git 实际加载的 CA 证书库,并重启 resolver 的 Pod。 |
| Harbor | 在按受支持的升级路径操作并查看 Redis 到 Valkey 的变更之后,使用 v2.16.0。所列的回移版本 v2.14.6 包含 Go 修复,但其镜像证书包中仍保留着受影响的根证书。 |
| Actions Runner Controller | 将控制器和适用的 scale set chart 升级到 0.15.1。scale set 使用的 runner 镜像和任何 job 容器需要单独更新;更新控制器并不会替换它们的运行时或 CA 证书包。 |
容器构建、镜像仓库与扫描
| 项目 | 所需操作 |
|---|---|
| BuildKit | 将独立部署或集群内的构建器滚动更新到 moby/buildkit:v0.34.2 或之后的修复版本。由 buildx 管理的构建器,请通过相应 driver 的流程更新。更换本地的 Docker CLI 并不会更新已有的远程构建器。 |
| Trivy、Grype | 使用 Trivy 0.76.1 和 Grype 0.121.1,或之后经过验证的补丁版本。更新镜像构建和准入流程中使用的扫描器镜像和版本固定。 |
| ORAS | 在所有运行 ORAS 的地方更新信任库,或使用已修复的受支持 Go 工具链重新构建 v1.3.6。验证生成的二进制。仅限制目标镜像仓库,并不能防止被允许的连接遭到拦截。 |
| crane (go-containerregistry) | 使用已修复的受支持 Go 工具链重新构建 v0.22.1,或使用之后经过验证的版本。同时修正运行环境的 CA 证书库,然后验证下载的二进制和任何固定了版本的容器镜像。 |
可观测性、数据与平台
| 项目 | 所需操作 |
|---|---|
| Prometheus、Alertmanager、blackbox_exporter | 按适用情况使用 Prometheus 3.16.0、3.15.1 或 3.13.5;Alertmanager 0.34.2;以及 blackbox_exporter 0.29.1。上线之前,请查看 Alertmanager 的 CORS 变更和任何自定义 TLS 设置。 |
| Prometheus node_exporter | 检查已配置的 TLS 客户端认证,并把它的 CA 证书包限制在预期的客户端范围内。修正适用的信任库,并在有经过验证的修复构建时采用它。仅凭镜像层面的检测结果,并不能确定存在可达的 TLS 路径。 |
| Grafana 13.1、13.0 和 12.4 | 使用相应分支上的 13.1.9、13.0.12 或 12.4.14。单独安装的插件和自定义 CA 证书包需要另行检查,不要假定服务端更新已经覆盖它们。 |
| Grafana 13.3 和 13.2 | 按适用情况使用 13.3.0 或 13.2.5,并保留已修复的证书包。插件二进制及其 CA 覆盖配置需要单独检查,并在插件更新发布后及时采用。 |
| Loki、Tempo、Mimir、Thanos | 使用 Loki 3.7.9 或 3.6.19;Tempo 3.1.1、3.0.5 或 2.10.10;Mimir 3.2.3 或 3.1.8;以及 Thanos v0.42.5,或这些分支上之后经过验证的补丁版本。检查自定义的 TLS 证书库。 |
| OpenTelemetry Collector | 使用 0.163.2,或之后已修复的 core、contrib 或 Kubernetes 发行版。更新显式固定的镜像版本,并确认正在运行的 Collector Pod 使用的是新镜像。 |
| OpenTelemetry Operator | 使用 operator 0.162.0,并通过 spec.image 或 operator 的 Collector 镜像设置显式选择 Collector 0.163.2 或更高版本。注入的自动插桩镜像需要单独检查,包括文档中提到的 Python 更新。 |
| Jaeger | 使用 v2.23.0 或之后经过验证的版本,并检查自定义 TLS 证书包。请验证实际部署的镜像,而不要假定浮动标签已经刷新了现有的 Pod。 |
| Fluentd、Fluent Bit、Vector | 按适用情况使用 Fluentd 的 v1.19.4-1.2 镜像或之后的已修复构建、Fluent Bit 5.1.5 以及 Vector 0.61.0。替换过期的镜像标签,并检查输出端使用的已挂载 CA 证书包。 |
| Velero | 有已修复的稳定版本时优先使用,并单独检查插件。如果临时更新信任库,请覆盖 Velero 和 node-agent 加载的所有 CA 文件和目录,然后重启它们。不要在未验证结果的情况下只替换一个文件。 |
| Longhorn | 在 1.12 上使用 v1.12.2。在 1.13 上,请关注下一个修复版本和适用的临时指引。不要仅仅因为版本号更高,就从 1.12.2 迁移到未修复的 1.13.0。 |
| Veeam Kasten | 使用 9.0.9 或更高版本,并确认 Kasten 的每个组件都已替换。检查 cacertconfigmap.name 引用的 ConfigMap。请遵循 Veeam 的升级流程,而不要手动修改其容器内的信任库。 |
| Crossplane(核心) | 按适用情况使用核心版本 2.4.3、2.3.7、2.2.7 或 1.20.14。单独检查每个已安装的 provider 和 function 镜像,包括为其配置的 CA 证书包。 |
| Cluster API | 使用 Cluster API 1.14.4 或 1.13.8 以及对应版本的 clusterctl。对照各自的版本和信任配置,检查 CAPA、CAPZ 以及其他已安装的基础设施 provider。 |
| Karpenter (AWS) | 按实际情况使用 1.15.1 或 1.14.3。历史构建 1.9.3 包含 Go 修复,但仍保留着一个受影响的根证书。升级控制器并不会替换现有的 worker AMI;请单独规划这部分上线。 |
| KEDA | 在等待修复版本期间,使用已修复的、实际生效的信任库,或经过验证的重新构建。检查 scaler 的 HTTPS 连接和自定义证书包。网络出站限制可以减少暴露面,但并不能修复证书校验。 |
| Dapr、NATS | 按适用情况使用 Dapr 1.19.1、1.18.10、1.17.19 或 1.16.21,以及 nats-server 2.15.2 或 2.14.9。单独检查所提供的 TLS CA 文件和其他组件。 |
| Kubeflow Pipelines | 按适用情况使用 2.18.0 或 2.17.3。重新构建流水线步骤镜像,带上更新后的操作系统证书、Python 依赖,以及(如有使用)certifi 和 pip。它们实际生效的信任配置需要独立于后端进行验证。 |
| KubeRay | 使用 KubeRay 1.7.2 或之后经过验证的版本,并检查 operator 的信任配置。Ray 的 head 和 worker 镜像需要单独更新;升级 operator 并不会更新它们的 Python 运行时或 CA 证书包。 |
| KServe | 使用以已修复 Go 工具链完成的、经过验证的控制器重新构建,并更新模型服务器的运行时和 CA 证书包。检查每一个 serving 镜像。仅限制出站流量并不能阻止被允许的 HTTPS 连接遭到拦截。 |
| Kubernetes 插件:metrics-server、VPA、cluster-autoscaler | 使用 metrics-server v0.9.1、VPA 1.8.1 或 1.7.3,以及与你的 Kubernetes 次要版本匹配的 autoscaler 版本:1.37.0、1.36.2、1.35.3 或 1.34.6。托管插件请遵循提供商的指引。 |
| Kubernetes 插件:kube-state-metrics | 有修复版本时采用它,并验证二进制和镜像证书包。它通常与 API server 的连接信任的是私有集群 CA,因此在把扫描器的检测结果视为可利用路径之前,请先评估实际的信任配置。 |
总结
eMudhra 失陷事件说明了为什么在节点打完补丁之后,Kubernetes 的安全更新仍可能并不完整。容器可能保留着较旧的 CA 证书包,应用可能使用独立的运行时证书库,集群配置提供的证书则可能在这两类更新之后依然存在。正在运行的进程也可能需要重启,修正才会生效。
对于每一个受影响的客户端,请弄清它如何校验证书,应用相应的更新,并确认它会拒绝已失陷的证书链,同时合法连接仍然正常工作。需要验证的结果是正在运行的平台的实际行为,包括它实际使用的镜像、配置和辅助程序。
FAQ
关于 eMudhra 失陷事件,我们最常被问到的五个问题。
我们的服务网格 mTLS 会受影响吗?
不会。网格 mTLS 只信任网格的私有 CA。请检查网格信任公共根证书的地方:出站 TLS、JWKS 获取,以及基于 https_web 的 SPIFFE 联邦。
只更新节点上的 ca-certificates 就够了吗?
不够。正在运行的进程在重启之前会一直保留旧的根证书。镜像、部分运行时、ConfigMap 和 Secret 都带有各自的副本,需要单独更新。
哪些 Kubernetes 版本包含了修复?
v1.37.2、v1.36.6、v1.35.10 和 v1.34.13;1.33 及更早版本没有修复。组件镜像仍然信任这些根证书,所以保护来自 Go 的阻止列表。
有人真的被攻击了吗?
目前没有利用的报告。不过,集群中的大多数客户端并不检查 Certificate Transparency,所以无法排除针对它们的攻击。
我们的漏洞扫描器能发现它吗?
只能发现一部分。Trivy 和 Grype 会标记 Go 标准库,但 ca-certificates 的修复没有对应的 CVE,所以过期的证书包可能扫描不出问题。请按指纹检查这些证书包。
如需协助评估风险暴露面并规划修复,欢迎与 Todea 聊聊平台就绪度评审。