flawopen.com/AI Security/mlflow-webhook-ssrf-cve-2026-64849
CVE-2026-64849: MLflow Webhook में SSRF
CVE-2026-64849 MLflow की webhook भेजने की प्रक्रिया में बिना प्रमाणीकरण का सर्वर-पक्षीय अनुरोध जालसाजी (SSRF) दोष है (उच्च, CVSS 3.1: 8.6)। आरंभिक वेब-पता जाँच आगे होने वाले पुनर्निर्देशन और वास्तविक संपर्क-गंतव्य को सीमित नहीं करती थी; परीक्षण सुविधा दूरस्थ सर्वर के उत्तर का पाठ वापस भेज सकती थी।[1]
डाकघर का कर्मचारी पार्सल पर लिखा पहला पता जाँचता है, फिर डाकिए को रास्ते में मिली नई अग्रेषण-पर्ची पर बिना जाँच आगे बढ़ने देता है। MLflow में भी webhook का शुरूआती वेब-पता जाँचा जाता था, लेकिन पुनर्निर्देशन या DNS की दूसरी खोज से मिले पते की नहीं। सुधार वास्तविक सॉकेट के दूसरे छोर का IP पता जाँचकर HTTP संदेश भेजने से पहले गैर-सार्वजनिक गंतव्य रोकता है।[1], [2]
इस पेज के मुख्य शब्द
SSRF- सर्वर उपयोगकर्ता के चुने वेब-पते पर अनुरोध भेजकर ऐसे आंतरिक संजाल तक पहुँच सकता है जहाँ अनुरोधकर्ता नहीं पहुँच सकता; इसे SSRF कहते हैं।[1]
Webhook परीक्षण सुविधा- MLflow का API, जो तय किए गए webhook पर परीक्षण घटना भेजता है; प्रभावित सामान्य व्यवस्था में इसका उत्तर-पाठ अनुरोधकर्ता को लौटाया जाता था।[1]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-918
- D3-OTF आउटबाउंड ट्रैफ़िक फ़िल्टरिंग — इस गाइड में दिया गया आउटबाउंड नेटवर्क प्रतिबंध सेवा या होस्ट के पहुँच योग्य गंतव्यों को सीमित करता है।
- CISA KEV — जोड़ा गया 2026-08-19 — CVE-2026-64849
हमले का चरण-दर-चरण प्रवाह
MLflow सर्वर webhook परीक्षण स्वीकार करता है
MLflow की सुरक्षा सूचना बताती है कि सामान्य Tracking Server स्थापना में प्रमाणीकरण नहीं होता। वैकल्पिक प्रमाणीकरण plug-in और deployment सुरक्षा नियंत्रण पहुँच की स्थिति बदल सकते हैं; अपनी व्यवस्था जाँचें। 19 अगस्त 2026 को CISA ने इस CVE को Known Exploited Vulnerabilities सूची में जोड़ा। यह ज्ञात शोषण का संकेत है, किसी खास स्थापना के भीतर घुसपैठ का प्रमाण नहीं।[1], [4], [5]
आरंभिक वेब-पता जाँच में पास हो जाता है
_validate_webhook_url मूल hostname का IP पता खोजकर जाँचता है, लेकिन मिले हुए पते को बाद में बनाए गए socket से नहीं बाँधता।[1]
पुनर्निर्देशन या DNS की दूसरी खोज गंतव्य बदल सकती है
HTTP client आगे दिए गए पुनर्निर्देशनों पर चलता है और संपर्क बनाते समय मेज़बान नाम फिर खोज सकता है। परीक्षण सुविधा दूरस्थ सर्वर के उत्तर का पाठ लौटाती है, इसलिए पूरी प्रतिक्रिया पढ़ सकने वाली SSRF संभव है।[1]
सुधार वास्तविक जुड़ाव के दूसरे छोर का IP जाँचता है
PR #24258 जुड़ाव बनते ही, TLS आदान-प्रदान या HTTP संदेश भेजने से पहले socket के peer का IP जाँचता है; इस सत्र में पर्यावरण से proxy लेने की सुविधा भी बंद रहती है। CVE MLflow 3.15.0 में ठीक हुआ; IPv6 पते बदलने के तरीकों से जुड़े अलग bypass 3.16.0 में ठीक किए गए। Advisory में freeman-bb को मूल गोपनीय रिपोर्टकर्ता और AUTHENSOR को स्वतंत्र खोजकर्ता का श्रेय दिया गया है।[1], [2], [3], [6]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
ये चुने हुए अंश आरंभिक वेब-पता जाँच और अनुरोध की सीमा, तथा संपर्क बनते समय peer की जाँच दिखाते हैं। _assert_public_peer helper वास्तविक socket पता जाँचता है और पता जाँचा न जा सके या वह सार्वजनिक न हो तो connection बंद कर देता है। उदाहरण में exploit अनुरोध या आंतरिक गंतव्य शामिल नहीं हैं। 3.16.0 का IPv6 normalization बाद का अलग सुधार है।[2]
# PR #24258 से पहले mlflow/webhooks/delivery.py का अंश।
_validate_webhook_url(webhook.url) # केवल शुरुआती URL जाँचता है
return session.post(
webhook.url, data=payload_bytes, headers=headers, timeout=timeout
) # redirect अपने-आप चलते हैं; जाँचा हुआ IP connection से नहीं बाँधा जाता
# कनेक्शन के समय peer की जाँच करने वाले upstream सुधार का अंश।
def _assert_public_peer(sock):
if _MLFLOW_WEBHOOK_ALLOW_PRIVATE_IPS.get():
return
try:
peer_ip = sock.getpeername()[0]
except OSError as exc:
sock.close()
raise SSRFProtectionError(
f"Could not determine webhook connection peer address: {exc}"
) from exc
try:
ip = ipaddress.ip_address(peer_ip)
except ValueError as exc:
sock.close()
raise SSRFProtectionError(
f"Webhook connection resolved to an invalid IP address: {peer_ip!r}"
) from exc
if not ip.is_global:
sock.close()
raise SSRFProtectionError(
f"Webhook connection blocked: {ip} is not a public IP address. "
"This may indicate a DNS rebinding attempt."
)
class _SSRFProtectedHTTPConnection(HTTPConnection):
def _new_conn(self):
sock = super()._new_conn()
_assert_public_peer(sock)
return sock
class _SSRFProtectedHTTPSConnection(HTTPSConnection):
def _new_conn(self):
sock = super()._new_conn()
_assert_public_peer(sock)
return sock
adapter = SSRFProtectedHTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.trust_env = False
session.mount("http://", adapter)
session.mount("https://", adapter)
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓
CVE-2026-64849के लिए MLflow 3.10.0–3.14.x को कम-से-कम 3.15.0 पर अद्यतन करें; वर्तमान समर्थित संस्करण चुनें। IPv6 पते बदलने के तरीकों वाले deployment में 3.16.0 या नया संस्करण लगाएँ।[1], [3], [6] - ✓जाँचें कि Tracking Server अविश्वसनीय नेटवर्क से न पहुँचा जा सके और वैकल्पिक प्रमाणीकरण plug-in तथा अनुमति-जाँच चालू हों। नेटवर्क प्रतिबंध अतिरिक्त सुरक्षा है, अद्यतन का विकल्प नहीं।[1]
- ✓सर्वर से बाहर जाने वाले अनुरोध केवल आवश्यक गंतव्यों तक सीमित करें; स्थानीय loopback, link-local, निजी IP दायरे और cloud metadata पते नेटवर्क सीमा पर रोकें। बाहर जाने वाले अनुरोध के code में हर पुनर्निर्देशन और वास्तव में जुड़े peer की फिर जाँच करें। उत्पादन व्यवस्था में
MLFLOW_WEBHOOK_ALLOW_PRIVATE_IPSबंद रखें; इसे केवल अलग-थलग विकास परिवेश में स्पष्ट आवश्यकता होने पर चालू करें。[2], [7] - ✓CI में पुनरावृत्ति-परीक्षण जोड़ें: सीधे गैर-सार्वजनिक पते, पुनर्निर्देशन के गंतव्य, बदलते DNS उत्तर, HTTP/HTTPS connection pool और proxy मार्ग अनुरोध की सामग्री भेजने से पहले रोक दिए जाएँ। निजी IP की अनुमति वाले विकल्प का अलग परीक्षण करें।[2], [7]