Kubernetesクラスタを運用していますか?最近、kubeletコンポーネントに新たな脆弱性が発見され、注目を集めています。本稿では、CVE-2025-0426と呼ばれるこの脆弱性について、初心者の方にもわかりやすく解説していきます。
この脆弱性は、各ワーカーノード上で動作するkubeletの読み取り専用ポート(通常ポート10255)に存在します。このポートは認証なしで利用でき、本来は状態の取得など「読み取り専用」の操作に限定されるべきものですが、本脆弱性ではここを悪用してコンテナのチェックポイント機能を繰り返し呼び出すことでノードのディスク領域を使い尽くし、サービス拒否(DoS)状態を引き起こす可能性があります 1。
1. CVE-2025-0426はどのくらい危険なのか?
まず、この脆弱性の深刻度を理解しましょう。CVE-2025-0426は中程度 (Medium)の深刻度と評価されています。共通脆弱性評価システム(CVSS)v3.1の基本値は6.2で、評価ベクターはAV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
です 2。
このCVSSベクターが示す意味を詳しく見ていきましょう:
- Attack Vector (AV): L (Local) – 攻撃者は対象システムのローカル環境にアクセスできる必要があります。インターネット経由で直接誰からでも攻撃できるわけではなく、クラスター内部やノード内部からのアクセスが必要です。
- Attack Complexity (AC): L (Low) – 攻撃の複雑さは低く、特別な条件や難解な手順を要しません。
- Privileges Required (PR): N (None) – 攻撃実行に管理者権限や認証資格は不要です。
- User Interaction (UI): N (None) – 攻撃を成立させるために、被害者ユーザーの操作を必要としません。
- Scope (S): U (Unchanged) – 攻撃によって他のコンポーネントへの影響範囲は変わりません(影響は攻撃対象であるノード内に留まります)。
- Confidentiality (C): N (None) – 機密性への影響はありません(データ漏洩は起こりません)。
- Integrity (I): N (None) – 完全性への影響もありません(データ改ざんは起こりません)。
- Availability (A): H (High) – 可用性への影響が高い(ノードがダウンするなどサービス停止に直結します)。
以上から、この脆弱性は主に可用性を損なうタイプの問題であることがわかります。データの漏洩や改ざんといった直接的な被害はないものの、システムのサービス停止を引き起こす点で無視できないリスクがあります 2。特にKubernetesクラスタにおいてノードが停止すると、そのノード上のコンテナやアプリケーションが利用不能になるため、サービス全体の信頼性に影響します。ただし影響範囲は一つのノード単位であり、また必要な前提(後述)を踏まえると「インターネットから誰でも即座に攻撃できる」類ではないため、評価は中程度となっています 2。
2. 攻撃はどのくらい簡単なのか?
攻撃の容易さについて、実際のところはどうなのでしょうか?
攻撃手法自体は比較的容易と考えられます。kubeletの読み取り専用ポートは認証不要(未認証)で公開されており、この脆弱性ではそこに対して一定の書式でリクエストを送るだけで攻撃が成立します 3。具体的には、攻撃者は特別な権限や複雑なエクスプロイトコードを必要とせず、単純にHTTPリクエストを大量に発行するプログラムやスクリプトを実行すればよいだけです。したがって、基本的なプログラミングやネットワーク知識があれば低いスキルレベルでも攻撃を試みることができます 2。攻撃の複雑度がCVSS上「Low」と評価されていることも、その容易さを裏付けています 2。
しかし、攻撃を成功させるためには前提となる条件があります。CVSSベクターでAV:L(攻撃元がローカル)となっているように、攻撃者は対象kubeletの読み取り専用ポートにアクセスできる経路を持っていなければなりません。通常、このポート10255はKubernetesクラスタ内部のネットワークやノード上でしか到達できないよう保護されている場合が多く、インターネット経由で直接このポートにアクセスできるケースは稀です。
そのため、典型的な攻撃シナリオとしては、すでにクラスター内部に侵入している攻撃者(例えば脆弱なアプリケーションを介して不正なPodを実行できた攻撃者や、内部ネットワークにアクセス権を持つ内部関係者)が、この脆弱性を悪用してノードをダウンさせる、というものが考えられます。または、クラスターの設定ミスでkubeletのポートが外部に開放されている場合には、外部から直接狙われる可能性もあります。このように攻撃そのものは簡単でも、「攻撃できる状況」を作るためには何らかの侵入経路や設定不備が必要になる点に注意が必要です。
3. 攻撃はどのように行われるのか?
この脆弱性の基本的な悪用方法は「kubeletの未認証APIエンドポイントに対し、コンテナのチェックポイント作成リクエストを大量に送信する」ことです。以下に、概念的な再現手順を説明します。
脆弱な環境の準備
まず、攻撃が成立するための環境条件を確認しましょう:
- Kubernetesの対象バージョン(後述の影響範囲を参照)のクラスタを用意し、その中の少なくとも1つのノードで、kubeletの読み取り専用ポート(デフォルトでは10255)が有効になっていることを確認します。
- そのノードで動作しているコンテナランタイムがコンテナチェックポイント機能をサポートしている必要があります(例: CRI-O v1.25+でCRIUサポート有効、またはCRIUが導入されたcontainerd v2.0+)。
- これらの前提が満たされていない場合、チェックポイント要求が受け付けられなかったり失敗したりするため、脆弱性は顕在化しません 4 5。
攻撃対象コンテナの特定
次に、攻撃者がチェックポイントを作成させたいターゲットのコンテナを特定します。kubeletのチェックポイントAPIは名前空間、Pod名、コンテナ名を指定して呼び出す必要があるため 6、攻撃者はノード上で動作中のいずれかのPodの情報を把握している必要があります。攻撃者自身がデプロイした悪意あるPodでも構いませんし、他のPod名を推測・把握できるならそれを指定することも可能です。
チェックポイントAPIの呼び出し
ターゲットとなるノードに対し、HTTPクライアント(例: curl
コマンドや簡単なスクリプト)を使ってkubeletの読み取り専用ポートにPOSTリクエストを送ります。リクエストのパスは次の形式です:
http://<ノードのIPアドレス>:10255/checkpoint/<Namespace>/<Pod名>/<Container名>
例えば、default
名前空間のmyapp-pod
というPod内のmyapp-container
というコンテナをチェックポイントする場合、以下のようなリクエストになります(timeoutパラメータは省略可能) 6:
POST http://<ノードIP>:10255/checkpoint/default/myapp-pod/myapp-container
このリクエストを実行すると、kubeletは該当コンテナの状態をスナップショット(チェックポイント)として保存しようとします。チェックポイントのデータは(デフォルトでは)ノード上の/var/lib/kubelet/checkpoints/
ディレクトリ配下に保存されます 7。
大量のリクエスト送信によるディスク逼迫
攻撃者は上記のチェックポイント作成リクエストを繰り返し大量に発行します。スクリプトを使ってループで何度も呼び出すことで、次々に新しいチェックポイントファイルがノード上に作られていきます。各チェックポイントにはコンテナのメモリ内容などが含まれるためファイルサイズが大きく、回数を重ねると相応のディスク容量を消費します。脆弱性のポイントは認証不要エンドポイントでこれを無制限に実行できてしまう点であり、十分な回数リクエストを送ると最終的にノードのディスク容量が枯渇します 7。
結果の観察
ディスクがいっぱいになると、そのノード上のkubeletや他のサービスは正常に動作できなくなり、ノードはスケジューラーから切り離されるか、最悪の場合クリティカルなシステムエラーを起こします。これにより、そのノード上の全てのPodが停止または影響を受け、クラスタ全体としてもリソースが逼迫します。実験環境で再現する場合、/var/lib/kubelet/checkpoints
ディレクトリを監視するとファイル数やサイズが急増する様子が確認でき、ノードのディスク使用率が100%に近づくことが観察できるでしょう 7。
なお、実際の環境でこの攻撃を試みることは非常に危険であり、故意であってもノードを破壊的な状態に陥れる可能性があります。あくまで実験は自己責任の下、隔離された検証環境で行うべきです。また現時点では、公開された実証コード(PoC)が出回っているという情報はありません 8が、攻撃手法自体は上記のように単純であるため、悪意のある関係者が独自にスクリプトを作成することは容易です。
4. どのような環境が影響を受けるのか?
では、具体的にどのような環境がこの脆弱性の影響を受けるのでしょうか?
影響を受けるKubernetesのバージョン
影響を受けるKubernetesのバージョンは以下の通りです 9 10:
- kubelet v1.30.0 から v1.30.9 (含む)
- kubelet v1.31.0 から v1.31.5 (含む)
- kubelet v1.32.0 から v1.32.1 (含む)
これらは公式発表で脆弱とされたバージョン範囲です 10。Kubernetes 1.30~1.32系の一部リリースが該当しており、これらではチェックポイントAPIへの認証が適切に要求されていませんでした。
加えて、1.29以前の古いバージョンについても注意が必要です。Kubernetes 1.25~1.29の期間において、このコンテナチェックポイント機能自体はアルファ版の機能ゲートとして「デフォルト無効」で実装されていました 11。したがって1.29以前の環境では通常この脆弱性は表面化しませんが、もし管理者が意図的に機能ゲートContainerCheckpoint
を有効化していた場合には同様の問題が発生し得ます。実際、1.29系列でも本脆弱性に対応するパッチ版 (v1.29.14) が提供されていることから、アルファ機能であっても有効化されていれば影響を受けると考えられます 12。
影響を受ける環境・条件
単にバージョンだけでなく、以下の前提が揃った場合に脆弱性が悪用可能となります:
-
kubeletの読み取り専用ポートが有効
-
コンテナランタイムがチェックポイントをサポート
- kubeletがチェックポイント処理を行う際、その実体はCRI(Container Runtime Interface)に実装された機能を呼び出します。
- したがって、ノード上で使用しているコンテナランタイムがこの機能に対応していなければ、攻撃によってチェックポイントが作成されることはありません 4 5。
- 具体例として、CRI-O 1.25以降で
enable_criu_support=true
に設定している場合や、containerd 2.0以降でCRIU(Checkpoint/Restore in Userspace)のパッケージがインストールされている場合にはチェックポイント機能が動作します。 - それ以外のケース、例えば古いCRI-Oや標準のcontainerd(CRIU未導入)では、チェックポイントAPIにリクエストを送ってもランタイム側で「未実装」エラーとなり 5、ディスクにスナップショットが保存されることはありません。
-
(攻撃者から)kubeletポートへのネットワーク到達性
- 先述の通り、攻撃者がそのポートにアクセスできるネットワーク経路が必要です。
- これは環境設定次第ですが、オンプレミス環境であれば内部ネットワークの防御が甘い場合や、クラウド環境であればセキュリティグループの設定ミスなどで、このポートがアプリケーションから到達可能になっているケースがリスクとなります。
以上より、影響を受ける典型的な環境は「対象バージョンのKubernetesを使用し、kubeletの読み取り専用ポートを無効化せず、かつCRI-O(またはCRIU対応のcontainerd)を使っているクラスタ」とまとめられます 4。逆に言えば、たとえばマネージドKubernetesサービス(クラウドベンダーが提供するデフォルト設定)などでは既にこのポートが閉じられていたり、あるいはデフォルトのcontainerdランタイムでCRIUがインストールされていなかったりするため、標準状態では当該脆弱性による深刻な影響は出にくい可能性があります。後述するEKSの項も参照してください。
5. どのように対策すればよいのか?
すぐにできる暫定対応
脆弱性が判明した段階で、すぐに適用できる ワークアラウンド(緩和策) がいくつか提案されています 15:
-
機能ゲートを無効化
- kubeletの起動時設定で、この問題の根幹であるコンテナチェックポイント機能をオフにします。
- 具体的には、
ContainerCheckpoint
のFeature Gateをfalse
に設定します。 - これによりチェックポイントAPIそのものが機能しなくなるため、悪用を封じることができます。
-
kubeletの読み取り専用ポートを無効化
- kubeletの引数
--read-only-port=0
と設定するか、またはkubeletの設定ファイルでreadOnlyPort: 0
と指定することで、未認証の読み取り専用サービスを停止できます 15。 - このポート自体が閉じてしまえば、攻撃者はそもそもHTTPリクエストを投げ込むことができなくなります。
- 既に述べたように近年のKubernetesではこのポートはデフォルト無効化が推奨されているため、設定を見直して有効になっていれば速やかに止めるべきです。
- kubeletの引数
-
kubeletインターフェースへのアクセス制限
- クラスタ構成上どうしても読み取り専用ポートを使う必要がある場合や、あるいは一時的に無効化できない事情がある場合は、ファイアウォールやネットワークポリシー等でアクセスを制限することが重要です 15。
- 少なくとも外部ネットワークや不明なPodからkubeletのポート(10250/10255)に到達できないようにし、信頼できる範囲からのみアクセス可能とします。
- また、ネットワークレベルでなくとも、チェックポイント機能自体を含むデバッグ用ハンドラを無効化する設定(
--enable-debugging-handlers=false
)を行えば、同様にチェックポイントAPIは利用不能になります。
-
異常なディスク使用の監視と制限
これらの暫定策は、脆弱性を完全に修正するものではありませんが、少なくとも攻撃の緊急リスクを下げたり被害を検知しやすくしたりする効果があります。特に読み取り専用ポートの無効化は根本的な緩和策として有力です。Kubernetes公式も「kubelet APIへのアクセス制限」や「チェックポイント機能ゲート無効化」を推奨しています 15。
パッチ適用による恒久的な修正策
最終的には、公式に提供された修正パッチを適用することが解決策となります。Kubernetesプロジェクトは本脆弱性に対し、以下の修正バージョンをリリースしました 12:
- kubelet v1.29.14
- kubelet v1.30.10
- kubelet v1.31.6
- kubelet v1.32.2
これらのバージョンでは、問題のチェックポイントAPIに対して認証が必須となるよう修正が加えられています 15。具体的には、kubeletの読み取り専用ポートからはチェックポイントエンドポイントが利用できないか、あるいは呼び出せても認証なしでは実行されないように変更されました。その結果、従来のように未認証で無制限にチェックポイント要求を出すことはできなくなり、ディスク枯渇攻撃は封じられます。
システム管理者は、自身のクラスタで稼働しているkubeletのバージョンを確認し、上記バージョン以降にアップグレードすることが強く推奨されます 17。たとえばv1.31.5を使用している場合はv1.31.6に、v1.32.1の場合はv1.32.2にアップデートします。Kubernetesのマイナーアップデート(例: 1.31系から1.32系への更新)になる場合は十分なテストが必要ですが、セキュリティ上の修正であるため可能な限り早期の適用が望ましいです。また、クラスタ全体のアップグレードが難しい場合でも、問題が顕在化するのは各ノード上のkubeletであるため、ワーカーノードのバイナリ差し替えやバージョン更新(ローリングアップデート)によって段階的に修正を当てることも検討してください。
なお、公式アナウンスではこの問題の検知方法にも触れられています。もし /var/lib/kubelet/checkpoints 配下に見覚えのない多数のチェックポイントファイルが残っている場合や、同ポート (/checkpoint
エンドポイント) への大量のアクセスがログに見られる場合は、当該脆弱性を突いた攻撃が試行された可能性があります 7。その際はただちに上記修正を適用するとともに、必要であればKubernetesセキュリティチーム(security@kubernetes.io)への報告も検討してください 18。
6. AWS EKSではどうなっているのか?
AWS Elastic Kubernetes Service (EKS) はAmazonが提供するマネージドKubernetesサービスであり、コントロールプレーンはAWSにより管理され、ワーカーノードも公式の最適化AMI(Amazon Linuxベースのイメージ)で提供されます。EKSにおけるCVE-2025-0426の影響と対応状況について整理しましょう。
EKS既定の設定における脆弱性の発現可能性
まず、EKS既定の設定における脆弱性の発現可能性は比較的低いと考えられます。理由の一つは、前述したkubeletの読み取り専用ポートがEKSではデフォルトで無効化されているためです。実際、過去のEKSノードAMIでは、Kubernetesの設定をフラグではなく設定ファイル経由で読み込む方式に変更した際に、既定値として読み取り専用ポートが開かれなくなったことが報告されています 13。AWSのエンジニアも「そのポートは非推奨であり有効化すべきでない」とコメントしており 19、Amazon EKSではセキュリティ強化の観点から標準でポート10255を閉じて運用しています。したがって、特別な変更をしていなければEKSのノードは本脆弱性の攻撃経路となるポートが露出していないケースがほとんどです。
次に、コンテナランタイムの点でもEKSは安全側にあります。EKSの標準的なノードではDockerではなくcontainerdを使用しており、かつ現時点(2025年2月)で提供されているAMIにおいてCRIUがインストールされているとの情報はありません。つまり、仮にチェックポイントAPIへのリクエストが送られたとしても、ランタイムがその機能を実装していなければkubeletはエラーを返すだけでディスクを書き込むことはありません 5。以上より、デフォルトのEKS環境では本脆弱性を直ちに悪用できる状況にはなっていない可能性が高いです。
カスタマイズ環境での注意点
とはいえ、EKSユーザーが独自にカスタマイズを行っている場合には注意が必要です。例えば、セキュリティ要件に反してkubeletの読み取り専用ポートを有効化してしまっていたり、特殊なデバッグ目的でノードにCRIUをインストールしてコンテナチェックポイントを試用していたりするケースでは、EKS上でも脆弱性の影響を受けうるでしょう。そのため、自身のEKSクラスターの設定を確認し、不要であればkubeletの該当ポートを開けない・使わないこと、余計なパッケージを入れないことが重要です。
AWSの対応状況
AWSの対応状況としては、AWSは本脆弱性の公開に合わせて必要な対策を講じています。EKSのコントロールプレーン(マスター)自体はこの問題の直接の影響を受けませんが、AWSでは管理下にあるサービス全般の脆弱性を精査し、必要に応じてセキュリティアドバイザリやパッチ適用を行います 20 21。今回の場合、ワーカーノード上のソフトウェアに関する問題ですので、EKS最適化AMIのアップデートという形で対応が取られると考えられます。具体的には、脆弱性が修正されたKubernetesバージョン(上記の1.29.14、1.30.10、1.31.6、1.32.2 など)が利用可能になるよう、順次EKSの対応バージョンが拡充・更新されます。
EKSではサポートされるKubernetesのバージョンが限られており、2025年2月時点で一般利用可能な最新は1.27~1.28程度かもしれません。しかし今後1.29や1.30以降のバージョンがEKSでサポート開始される際には、最初から本脆弱性の修正を含んだパッチリリースが提供されるでしょう。既存のクラスターについても、マネージドノードグループを利用している場合はAWSが用意する最新のAMIに乗せ換えることで容易にノードをアップデートできますし、セルフマネージドノードの場合でも新しいAMIへ切り替えて再構築することが推奨されます。AWSから公式のセキュリティ情報発信(セキュリティアラートやBulletin)も順次行われる可能性があるため、EKSユーザーはAWSの発表やドキュメントを注視し、適切に対応策を講じてください。
まとめ
本稿では、Kubernetesの新たな脆弱性CVE-2025-0426について詳しく解説してきました。この脆弱性は以下のような特徴を持っています:
- kubeletの読み取り専用ポートを悪用し、コンテナチェックポイント機能でディスク枯渇を引き起こすDoS攻撃が可能
- 深刻度は中程度(CVSS 6.2)で、主に可用性への影響が懸念される
- 攻撃自体は容易だが、前提条件(ポートの開放、CRIUサポート等)が必要
- 影響を受けるのはKubernetes 1.30~1.32の一部バージョン(および機能を有効化した1.29以前)
対策としては:
-
暫定対応
- kubeletの読み取り専用ポートの無効化
- コンテナチェックポイント機能の無効化
- ネットワークアクセス制限の適用
-
恒久対策
- 修正バージョン(1.29.14/1.30.10/1.31.6/1.32.2)へのアップデート
- EKSユーザーは最新のAMIへの更新を検討
特にマネージドKubernetesサービス(EKS等)のユーザーは、デフォルト設定で既に一定の保護が働いている可能性が高いものの、カスタマイズ環境では注意が必要です。クラスタ管理者は自身の環境設定を確認し、必要な対策を講じることを推奨します。
最後までお読みくださりありがとうございました。本稿が皆様のKubernetesセキュリティ対策にお役立ていただければ幸いです。
-
oss-security - [kubernetes] CVE-2025-0426: Node Denial of Service via kubelet Checkpoint API
A security issue was discovered,by filling the Node's disk
↩ -
oss-security - [kubernetes] CVE-2025-0426: Node Denial of Service via kubelet Checkpoint API ↩ ↩2 ↩3 ↩4 ↩5
-
A security issue was discovered,by filling the Node's disk
↩ -
oss-security - [kubernetes] CVE-2025-0426: Node Denial of Service via kubelet Checkpoint API
All clusters running an affected,with criu installed, are affected
↩ ↩2 ↩3 ↩4 -
A large number of requests,Service attack using this bug
↩ ↩2 ↩3 ↩4 -
CVE-2025-0426 - Exploits & Severity - Feedly
Exploitation
↩ -
All clusters running an affected,installed, are affected
↩ -
CVE-2025-0426: Node Denial of Service via kubelet Checkpoint API · Issue #130016 · kubernetes/kubernetes · GitHub ↩ ↩2
-
* kubelet v1.29.14 ,v1.29
↩ -
* kubelet master ,130014
↩ ↩2 -
Kubelet no longer listening on read only port 10255 · Issue #128 · awslabs/amazon-eks-ami · GitHub
longer listening on the read,to listen on port 10255
↩ ↩2 -
The read-only port should be disabled in Kubelet - Datadog Docs
The read,value for readOnlyPort is 0
↩ -
This issue can be mitigated,for the kubelet Checkpoint API
↩ ↩2 ↩3 ↩4 ↩5 -
CVE-2025-0426: Node Denial of Service via kubelet Checkpoint API · Issue #130016 · kubernetes/kubernetes · GitHub ↩
-
Kubelet no longer listening on read only port 10255 · Issue #128 · awslabs/amazon-eks-ami · GitHub ↩