Skip to content
KitploitKITPLOIT
ツールブログ
Log in
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
drupal-openai-provider-ssrf-cve-2026-13233 — CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): レスポンスURLのSSRF / ローカルファイル読み取り。信頼できない上流、プロンプトではない。安全な再現プログラム+検出。1.1.1/1.2.2で修正済み。 | Kitploit
ツール/GitHubGitHub/kuninogu/drupal-openai-provider-ssrf-cve-2026-13233
脆弱性分析ウェブセキュリティ学習と教育
GitHubkuninogu/drupal-openai-provider-ssrf-cve-2026-13233

drupal-openai-provider-ssrf-cve-2026-13233

CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): レスポンスURLのSSRF / ローカルファイル読み取り。信頼できない上流、プロンプトではない。安全な再現プログラム+検出。1.1.1/1.2.2で修正済み。

リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
243ヶ月前未レビュー
共有

Drupal OpenAI Provider — 応答URLの未検証取得による SSRF/ローカルファイル読み取り(CVE-2026-13233)

Untrusted upstream:プロバイダーが、応答に入っていたURLをそのまま開いた話。 Drupal OpenAI Provider(ai_provider_openai)・SSRF(CWE-918)・CVE-2026-13233・SA-CONTRIB-2026-053

状態:協調的開示は 完了(2026-07-10)。Drupal Security Team へ非公開で報告 → 修正 → CVE-2026-13233/ アドバイザリ SA-CONTRIB-2026-053(格付け Moderately critical)として公開。著者は finder かつ remediation developer としてクレジット。

AIの「接続部分」に古典的な認可/入力検証の欠陥が出た事例の研究。あるAI画像生成プロバイダーが、 上流APIの応答に含まれるURLを、汎用の取得関数でスキーム検査なしに取得していた。接続先(host)が 既定の正規APIではない配備(自前エンドポイント/プロキシ/自己ホストのゲートウェイ/侵害された中継)では、 上流が応答URLとして file:// や内部アドレスを返すことで、サーバーがそれを開いた。

sink に届く未信頼入力は、利用者のプロンプトではなく上流の応答URLである。

  • クラス(公表):SSRF(CWE-918)。この SSRF には file:// によるローカルファイル読み取りが含まれる (著者の内部分析では CWE-73/CWE-441 にも対応づけ)。
  • 深刻度:Drupal Moderately critical(SA-CONTRIB-2026-053)=同社スケールの中位帯 ≒ CVSS Medium。CVSS の Critical/High ではない。事前の自己評価は floor 3.1/条件付き 5.3(Medium)で、旧 6.5・7.4 の撤回とも整合。
  • 影響:Drupal OpenAI Provider(ai_provider_openai)< 1.1.1 および 1.2.0〜1.2.1(監査 1.2.1)/ Drupal core 11.2
  • 修正版:1.1.1 / 1.2.2・CVE:CVE-2026-13233・Advisory:https://www.drupal.org/sa-contrib-2026-053

実証したこと(確認済み)と、していないこと(未検証)

検証はすべて、自分が所有・管理するネットワーク隔離サンドボックスで、モック上流に対して実施した。 実 OpenAI API は一度も呼んでいない。漏えいオラクルは合成データのみ。

確認済み(動的に実証):

  • 非管理者の起動で、サーバーが上流の選んだローカルファイルを読む(任意パスを per-run マーカーで実証。配信本文が マーカーと生バイト一致。マーカーはアプリコンテナ内にのみ存在しモックには無い=「モックが自分のファイルを返した」を排除)。
  • settings.php(35,182 B)を sha256 バイト一致で確認(中身は非出力)。DB 資格情報が射程内という意味。
  • 公開ポートを持たない内部サービスからの 内部HTTP SSRF 応答取得(内部トークンの生バイト一致)。
  • 権限境界:同一アカウントで管理設定ルートは 403(200対403の対照)。
  • 管理者が画像フィールドに生成ボタン(FWA)を設定した現実的構成で、AI権限のない編集者が正規HTTPで到達。

未検証(主張しない):

  • クラウドメタデータ(IMDS)資格情報の実取得 — 同一 sink から原理上狙えるが未実施。
  • 基底クラス同型 sink の動的到達 — override 済み(本経路では dead code)。同一根本原因の variant として記録。
  • 受動的な「保存するだけ」での自動発火 — テスト済み・否定的。
  • stored XSS(content-type 混同)/音声認識の同時実行レース — 別リード、未実証。

非該当:既定の api.openai.com(TLS)。host は管理者/config-sync/デプロイ側の管理下で、実行時の非管理者攻撃者は変更不可。


根本原因と修正方針(要約)

応答URLを、登録済みのあらゆる PHP ストリームラッパー(file, php, http, data, phar …)を解釈する汎用取得へ 渡していた。response_format の既定は url なので、この脆弱な分岐が既定経路。file:// は PHP の既定の ファイルシステム wrapper で、allow_url_fopen の対象外(「allow_url_fopen が前提」という旧記述は誤りで撤回)。

プリミティブを直す(call-site だけ直さない):

  1. リモート取得に汎用関数を使わず、注入済みのHTTP専用クライアントを使う。
  2. リクエスト前に scheme を http/https に限定し、リダイレクトを無効化(30x が file:// へ跳ぶのを防ぐ)。
  3. 多層防御:解決後のホストが private/link-local/loopback なら拒否、または画像CDNホストに限定。サイズ/Content-Type/ 画像デコードを検証。
  4. 基底クラスにも同修正を port(incomplete-fix を防ぐ)。
  5. 回帰テストは deny ケース中心:file://…・http://169.254.169.254/…・302→file:// を全て拒否。

詳細:docs/fix-direction.md。


ディレクトリ構成

英語版 README.md の "Directory structure" と同一。要点:docs/(記事A/B/C は現在日本語 *.ja.md・英訳はTODO、 + fix-direction.md は英語)、reproducer/(安全化再現・モック上流・単一の無害オラクル /etc/hostname のみ)、 detections/(Sigma×2 / Sentinel KQL / Splunk SPL の実ファイル)、SECURITY.md、timeline.md(開示タイムライン正本)、 .gitignore(秘密値・一次証跡の混入防止)。

本リポジトリに含めないもの:arming ペイロード、動作するファイル読取PoC、秘密値を含む一次証跡。 公開 reproducer/ は単一の無害オラクル /etc/hostname で欠陥クラスの機構をモックに対して示すのみ。 任意パス読取・settings.php 取得・IMDS は入れない。稼働サイトへの武器ではない。まず 1.1.1 / 1.2.2 へ更新を。


安全化再現(Safe Reproducer)

目的:稼働環境への攻撃手順や秘密値を出さずに、研究者が欠陥クラスを確認できるようにする。すべてオフライン。

  • 隔離:アプリ+モック上流を隔離ネットワークで docker compose(言語プリミティブ検査は --network none)。 資格情報は mount しない。モックは実APIと通信しない。
  • 忠実な「未信頼上流」モデル:モックは「host が未信頼プロキシ/自己ホストゲートウェイを指す」状況を演じる。 標的URLはプロンプト経由ではなく out-of-band で armする=訂正後の攻撃者モデル(URLは上流が決め、利用者は起動のみ)。
  • 合成オラクルのみ:file:///etc/hostname+アプリコンテナ内にのみ作る per-run マーカー(上流が選んだ任意パスの証明)、 settings.php は sha256 一致のみ・中身非出力、公開ポート無しの内部HTTPサービス(合成トークン)。
  • 判定は生バイト(HTTP 200 ではない):成功=配信本文が期待する合成値とバイト一致、加えて 200対403 の権限対照。 終了コードは厳格(0/1/2/3/99)。reproducer/verdict.md 参照。
  • 透明性の注記:環境正規化(過去の root 実行で書込不能になった files ディレクトリの所有者補正など)は明記し、 それが効くのは保存・配信レグのみで、ファイル読取 sink そのものには影響しない。査読で「作為」と誤解されないため。

詳細:reproducer/README.md。


開示タイムライン

timeline.md が正本。要約は英語版 README の表と同一(静的発見→動的実証→ピアレビューでHOLD→ セキュリティチーム報告→修正版+Advisory 公開で public 化→CVE/JVN・クレジット、の順。日付の一部は保留)。


検知ガイド

実ルールは detections/、背景は docs/detection-engineering.md。要点:

  • 画像生成の起点利用者(アプリ監査)と、直後の 169.254.169.254/loopback/RFC1918 への異常 egress (プロキシ/EDR)を、狭い時間窓で相関する。egress 単独ではアラートにしない。
  • file:// はネットワークに出ない。Webプロセスによる機微ファイルの open をホスト監査で拾う(ベースライン化し、 画像生成と同一リクエストの off-pattern read に絞る)。
  • image/* を名乗る非画像バイト(先頭マジックバイト不一致)を後追いで洗う。
  • 多くのAI連携は「どの利用者がどのURLを取得したか」を残さない。{request_id, actor, target_url, scheme, resolved_ip, content_type} の fetch 監査を足す。標準ログだけでは検知できない。

参考

  • OWASP Top 10 A10:2021 — SSRF/CWE-918・CWE-73・CWE-441・CWE-610
  • PHP ストリームラッパー(file:// は既定 wrapper・allow_url_fopen 対象外)
  • Drupal Security Team — プロジェクトの「Report a security vulnerability」経由の協調的開示

セキュリティ注記

  • 開示は完了(CVE-2026-13233 / SA-CONTRIB-2026-053)。製品名・版・コード詳細は公開してよい。 まず 1.1.1 / 1.2.2 へ更新すること(未修正サイトが残る)。
  • reproducer/ はサンドボックス専用・合成オラクルで、稼働環境への攻撃ではなく、秘密値も含まない。 所有・許可のない環境で実行しないこと。
  • 動作するファイル読取PoC、および秘密値を含む一次証跡は同梱しない(修正後も、未修正配備が残る間は意図的に伏せる)。

Responsible Disclosure ディスクレーマ

本研究はすべて、著者が所有するネットワーク隔離サンドボックスで、モック上流に対して実施した。実ベンダーAPIには 一切接続しておらず、第三者環境は一度も検証していない。 発見はまず Drupal Security Team へ非公開で報告し、公開は 修正版とアドバイザリ(SA-CONTRIB-2026-053・CVE-2026-13233)の公開に同期した。ベンダー格付けは Moderately critical。 CVSS は著者の暫定的な自己評価であって公式スコアではなく、意図的に保守側に置いた(CVSS の Critical/High としない) ——これはベンダーの中位帯格付けとも整合する。本資料は防御・教育目的。詳細は SECURITY.md。

ツールをダウンロード