プラットフォームエンジニアリング
eMudhra CA侵害:Kubernetesノードへのパッチ適用だけでは不十分な理由
eMudhraの侵害がKubernetesのノード、コンテナイメージ、アプリケーションランタイム、CAバンドルにどう影響するのか、そして各レイヤーのどこで更新が必要になるのかを解説します。
Todea Engineering
クラウドネイティブ・プラクティス

2026年10月、認証局であるeMudhraが、証明書署名用の秘密鍵8つを、ランダムな384ビットの値ではなく1バイトの数値(4、56、66、115、155、156、230、237)として生成していたことを、ある研究者が発見しました。そのため、公開されているCA証明書から、誰でも1秒未満で秘密鍵を復元できました。影響を受けるTLS署名鍵を復元した者は、自分が管理していないドメインの証明書を発行できます。さらに通信を傍受したり経路を変更したりできる攻撃者は、侵害された発行者をまだ信頼しているクライアントに対して、正規のサービスになりすますことができます。自社の証明書がeMudhraから発行されたものでなくても、接続は危険にさらされる可能性があります。クライアントが偽造された証明書を受け入れてしまうと、攻撃者はその接続で送信される認証情報やリクエストデータを受け取り、改ざんしたレスポンスを返すことができます。
主要なブラウザーには、影響を受ける証明書をブロックする更新が配信されましたが、その保護がKubernetesにも自動的に及ぶわけではありません。ノード、コンテナイメージ、アプリケーションランタイム、クラスター設定は、それぞれが信頼する証明書を提供したり、独自の検証ルールを適用したりします。どこを修正すべきかは、稼働中のコンポーネントが実際にどれを使用しているかによって決まります。
Kubernetesは信頼情報をどこに持っているのか
Kubernetesクラスターは、単一の共有トラストストアを使っているわけではありません。コンテナランタイムは通常ノードの証明書に依存し、アプリケーションはイメージ内に独自のバンドルを含んでいることがあり、言語ランタイムがさらに別のセットを提供することもあります。追加のCAバンドルをKubernetesの設定に保存し、ワークロードにマウントすることもできます。
これらのコピーは、それぞれ別々に更新されます。また、稼働中のプロセスは更新前に読み込んだ証明書を保持し続けることがあるため、ファイルを修正しても、アプリケーションの信頼判断が修正されるとは限りません。以降のセクションでは、各レイヤーで何を更新すべきか、そして再起動や再読み込みがいつ必要になるかを説明します。
影響があるのは、対象となるパブリックな発行者を信頼している接続です。クラスターやメッシュのプライベートCAだけを信頼するよう制限された接続は、このインシデントによって自動的に危険にさらされるわけではありません。
次の図は、一般的なイメージのプルとアプリケーション接続を比較したものです。アプリケーションは、TLS設定に応じて、図に示したソースのうち1つ以上を使用します。
ノードの信頼情報とワークロードの信頼情報は、別々の経路で更新されます。稼働中の各クライアントは、変更された証明書を読み込み直す必要があります。
1. ノード:コンテナランタイムとコントロールプレーン
Kubernetesがイメージをダウンロードするとき、kubeletはcontainerdやCRI-Oなどのコンテナランタイムにその取得を依頼します。ランタイムはレジストリに接続し、ノードが信頼するCAを使ってHTTPS証明書を検証します。containerdやCRI-Oに設定したレジストリ固有のCAは、そのプールを置き換えるのではなく、プールに追加されます。そのため、それらのレジストリにもノードのバンドルが引き続き適用されます。
その信頼設定が侵害された発行者をまだ受け入れている場合、ネットワーク経路上の攻撃者はレジストリになりすますことができます。これはワークロードが起動する前に起こるため、ワークロードのイメージ内の証明書を更新しても、ダウンロードは保護されません。
ディストリビューションのCA更新をインストールするか、修正済みのノードイメージでノードを置き換えてください。そのうえで、古い証明書をキャッシュしている対象プロセスを再起動します。これには、コンテナランタイムと、関連するノードやコントロールプレーンのコンポーネントが含まれます。新しく起動した診断ツールは更新後のバンドルを使用していても、長時間稼働しているサービスは古いバンドルを使い続けていることがあります。
コントロールプレーンにも注意が必要です。kubeadmクラスターでは、APIサーバーとコントローラーマネージャーがノードの証明書ディレクトリをマウントします。これらのストアは、外部へのHTTPS接続に使用されることがあります。たとえば、アドミッションWebhookの設定で明示的なcaBundleが省略されている場合、APIサーバーはシステムのルート証明書を使用します。バンドルが指定されている場合は、そのバンドルを別途確認する必要があります。
kubeadmのコントロールプレーンコンポーネントには、サポートされている静的Podの再起動手順を使用してください。API経由でミラーPodオブジェクトを削除しても、その実体であるコンテナは再起動されません。冗長化されたコントロールプレーンでは、1ノードずつ順番に作業し、次へ進む前に正常に稼働していることを確認してください。
あわせて、証明書検証の修正を含む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パッケージを更新済みの同じノード上で2つのイメージを使用しています。
| イメージ | 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を使用するとは限りません。独自の信頼済み証明書を含んでいるランタイムもあります。また、トラストストアに影響を受けるルート証明書がまだ残っていても、侵害された署名鍵を拒否するコードを含んでいるランタイムもあります。
Kubernetesのコントロールプレーンコンポーネントや多くのコントローラーはGoで書かれているため、Goは特に重要です。Go 1.27.3と1.26.10では、侵害された鍵を含む証明書チェーンを拒否するブロックリストがcrypto/x509に追加されました。
3つの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のアプリケーションにも、ランタイムごとの確認が必要です。ランタイムのセキュリティガイダンスと、Pythonのcertifiのように別途同梱されているCAパッケージを確認してください。オペレーティングシステムの証明書を更新しても、それらのコピーが更新されるとは限りません。
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までのチャートは、影響を受けるパッケージをデフォルトでインストールします。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を再起動してください。入手できる場合は、Dockerのcontainerd.io 2.4.2-3のように、修正済みのGoで再ビルドされたベンダーパッケージを使用してください。より新しいバージョンを選ぶ前に、アップストリームのリリースノートを確認してください。 |
| CRI-O | ノードのCAパッケージを更新し、CRI-Oを再起動してください。修正済みのベンダービルド、またはサポート対象ブランチの次の修正済みリリースを使用してください。OpenShiftを利用している場合は、Red Hatのロールアウトガイダンスに従ってください。 |
| etcd | 該当するブランチのv3.7.3、v3.6.16、またはv3.5.35を使用してください。カスタムCA設定と、イメージのCAバンドルを使用するその他のプログラムを確認してください。 |
| k3d | rancher/k3s:v1.37.2-k3s1のような修正済みのk3sイメージ、または使用中のマイナーバージョンに対応する修正済みリリースを明示的に指定してください。これで更新されるのはノードであり、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をトラストストアの修正としていますが、スナップショットでは、追加のcontainerd再ビルドを含むv20261031を推奨しています。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ストリームを選択してください。該当する場合は、4.21における4.21.41など、再ビルドされたCRI-Oを含むものを選んでください。machine-configのロールアウトが完了することを確認してください。4.x向けのアドバイザリから、5.xも対象に含まれると推測しないでください。 |
| IBM Cloud | RHCOSへの対応を含む、11月2日のワーカー向け修正パックを適用してください。それ以前の10月27日のパックは、UbuntuとRHEL 9のワーカーが対象です。すべてのワーカーが更新済み、または置き換え済みであることを確認してください。 |
| Nebius | ノードグループをインフラストラクチャバージョン78、またはそれ以降の修正済みバージョンにアップグレードし、置き換え後のノードを確認してください。アプリケーションイメージとマウントされたCAバンドルは、引き続き別途更新が必要です。 |
| Oracle OKE | ノードのパッケージが、該当するOracle Linuxのアドバイザリ(場合に応じてELSA-2026-88550またはELSA-2026-88459)と一致していることを確認してください。イメージのビルド日が11月であることだけを、修正済みである証拠として扱わないでください。 |
| Alibaba ACK | ノードOS向けの修正済み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の場合は、distroless-v1.39.6やdistroless-v1.38.9など、対応する修正済みのEnvoyイメージを設定し、プロキシをロールアウトしてください。 |
| Cilium | サポート対象ブランチの1.20.4、1.19.10、または1.18.16を使用してください。タグやダイジェストのオーバーライドも含め、agent、operator、cilium-envoyのイメージをチャートと一致させてください。 |
| 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がサポートする設定(該当する場合はlua_ssl_trusted_certificateなど)を使って、修正済みのアウトバウンド用CAバンドルを読み込ませてください。関連するすべてのTLS経路を確認し、修正済みのベンダーイメージが提供されたら採用してください。 |
| Contour | Contour v1.33.8を、distroless-v1.38.9などの修正済みEnvoyイメージと組み合わせて使用してください。指定している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にアップグレードして修正済みコンポーネントをデプロイするか、マニフェストベースのインストールの場合はv3.32.3のマニフェストを適用してください。すべての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を使用してください。Kubernetesのアップグレードで変更されたと想定せず、デプロイされているDNSイメージを確認してください。カスタムのTLSフォワーディング設定とプロバイダーの信頼設定を確認してください。 |
証明書、アイデンティティ、ポリシー
| プロジェクト | 必要な対応 |
|---|---|
| cert-manager | 該当するサポート対象ブランチのv1.21.3またはv1.20.5を使用してください。サポート対象外の古いブランチはメンテナンスされているリリースへ移行し、外部issuer向けに設定したCAバンドルは別途確認してください。 |
| trust-manager | チャート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とOSのトラストストアを使って再ビルドし、独自に指定している追加のトラストストアも確認してください。 |
| Vault Secrets Operator | VSO 1.6.2を使用し、コントローラーのロールアウトを確認してください。修正済みのデフォルトイメージを優先するか、1.6.2-ubiに残っているルート証明書に対処してください。Vaultへの接続用に設定したCAバンドルを確認してください。 |
| External Secrets Operator | コントローラーとチャートを2.14.0にアップグレードし、ロールアウトの完了を確認してください。外部シークレットプロバイダー向けに設定したCAバンドルは、コントローラーイメージとは別に確認してください。 |
| Kyverno | 既存の環境では修正済みのトラストストアを使用し、変更後にPodを再起動してください。global.caCertificates.dataによるマウントが置き換えるのは、1つのバンドルファイルだけです。別の証明書ディレクトリによって、影響を受けるルート証明書が復活していないことを確認してください。修正済みの安定版リリースが提供されたら、そちらを優先してください。 |
| OPA | 該当するブランチのv1.22.2またはv1.21.4を使用してください。デプロイしている形態に合わせてデフォルトイメージまたはstaticイメージを更新し、アウトバウンド接続向けのカスタム信頼設定があれば確認してください。 |
| Gatekeeper | プロセスが読み込むすべてのCAファイルとディレクトリを修正し、その後Podを再起動してください。バンドルファイルを1つ置き換えるだけでは不十分な場合があります。修正済みのGoツールチェーンでビルドされたサポート対象リリースが提供されたら、採用してください。 |
| cosign | イメージ署名のワークフローには、v3.1.4のリリースバイナリ、またはそれ以降の検証済みビルドを使用してください。コンテナイメージを使用する場合は、イメージ内の修正済みバンドルを維持し、証明書ファイルや証明書ディレクトリのオーバーライドを確認してください。パイプラインが実際に使用しているアーティファクトを検証してください。 |
| policy-controller | 実際に使用されるトラストストアを修正済みのものにし、WebhookのPodを再起動してください。読み込まれるすべてのCAファイルとディレクトリを確認し、修正済みリリースが提供されたら採用してください。Goの更新がマージされただけでは、既存のデプロイメントは変わりません。 |
| Falco | Falco 0.45.2をチャート9.2.2とともに使用してください。falcoctl 0.14.3やdriver-loader 0.45.2など、バージョンを固定している補助イメージも確認し、更新済みのコンポーネントが稼働していることを確認してください。 |
| oauth2-proxy | v7.15.6を使用してください。修正済みのデフォルトイメージを優先するか、Alpineバリアントに残っている、影響を受けるルート証明書に対処してください。プロバイダー向けおよびアップストリーム向けのカスタム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を実行するすべてのワークステーションとランナーで、トラストストアを更新してください。以降のリリースノートを確認し、修正済みとして扱う前に、ダウンロードしたバイナリのビルドツールチェーンを検証してください。 |
| 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リゾルバーについては、Gitが実際に読み込むCAストアを修正し、リゾルバーのPodを再起動してください。 |
| Harbor | サポートされているアップグレードパスに従い、RedisからValkeyへの変更を確認したうえで、v2.16.0を使用してください。記載されているバックポートのv2.14.6にはGoの修正が含まれていますが、イメージのバンドルには影響を受けるルート証明書が残っています。 |
| Actions Runner Controller | コントローラーと、該当するスケールセットのチャートを0.15.1にアップグレードしてください。スケールセットが使用するランナーイメージとジョブコンテナは、別途更新してください。コントローラーを更新しても、それらのランタイムやCAバンドルは置き換えられません。 |
コンテナビルド、レジストリ、スキャン
| プロジェクト | 必要な対応 |
|---|---|
| BuildKit | スタンドアロンまたはクラスター内のビルダーを、moby/buildkit:v0.34.2、またはそれ以降の修正済みリリースへ入れ替えてください。buildxが管理するビルダーは、該当するドライバーの手順で更新してください。ローカルの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ファイルとディレクトリを対象にし、その後それらを再起動してください。結果を確認せずに、ファイルを1つだけ置き換えることは避けてください。 |
| 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、その他のインストール済みインフラストラクチャプロバイダーは、それぞれのリリースと信頼設定に照らして確認してください。 |
| Karpenter (AWS) | 環境に応じて1.15.1または1.14.3を使用してください。過去のビルドである1.9.3にはGoの修正が含まれていますが、影響を受けるルート証明書が残っています。コントローラーをアップグレードしても、既存のワーカーAMIは置き換えられないため、そのロールアウトは別途計画してください。 |
| KEDA | 修正済みリリースを待つ間は、実際に使用されるトラストストアを修正済みのものにするか、検証済みの再ビルドを使用してください。スケーラーのHTTPS接続とカスタムバンドルを確認してください。ネットワークのegress制限は影響を軽減できますが、証明書検証そのものを修正するものではありません。 |
| 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を使用してください。パイプラインの各ステップのイメージは、更新済みのOS証明書とPythonの依存関係、および使用している場合はcertifiとpipを含めて再ビルドしてください。それらが実際に使用する信頼設定は、バックエンドとは別に検証してください。 |
| KubeRay | KubeRay 1.7.2、またはそれ以降の検証済みリリースを使用し、operatorの信頼設定を確認してください。Rayのheadとworkerのイメージは別途更新してください。operatorをアップグレードしても、それらのPythonランタイムやCAバンドルは更新されません。 |
| KServe | 修正済みのGoツールチェーンによる検証済みのコントローラー再ビルドを使用し、モデルサーバーのランタイムとCAバンドルを更新してください。すべてのサービング用イメージを確認してください。egressを制限するだけでは、許可された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サーバーへの接続はクラスターのプライベートCAを信頼するため、スキャナーの検出結果を悪用可能な経路として扱う前に、実際の信頼設定を評価してください。 |
まとめ
eMudhraの侵害は、ノードにパッチを適用した後も、Kubernetesのセキュリティ更新が不完全なままになり得る理由を示しています。コンテナは古いCAバンドルを保持し続けることがあり、アプリケーションはランタイム独自の別のストアを使用することがあり、クラスター設定はそのどちらの更新を経ても残り続ける証明書を供給することがあります。また、稼働中のプロセスは、再起動するまで修正が反映されない場合があります。
影響を受けるクライアントごとに、証明書をどのように検証しているかを特定し、該当する更新を適用したうえで、正規の接続が引き続き機能し、かつ侵害されたチェーンが拒否されることを確認してください。検証すべきなのは、実際に使用されているイメージ、設定、補助プログラムを含めた、稼働中のプラットフォームの動作です。
FAQ
eMudhraの侵害について、よくいただく5つのご質問。
サービスメッシュのmTLSは影響を受けますか?
いいえ。メッシュのmTLSが信頼するのは、メッシュのプライベートCAだけです。メッシュがパブリックなルート証明書を信頼する箇所、つまりegress 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にご相談ください。