A lógica de reconstrução de URL do Starlette cria uma perigosa incompatibilidade entre o caminho roteado e o caminho autorizado. Quando uma requisição HTTP chega, o roteador identifica corretamente o endpoint de destino a partir da linha de requisição bruta. No entanto, quando a aplicação verifica request.url para decidir se um usuário está autorizado, o Starlette reconstrói essa URL concatenando o cabeçalho Host com o caminho da requisição e reinterpretando o resultado .
Um atacante pode explorar isso enviando uma requisição para um endpoint protegido como /admin/seguro com um cabeçalho Host cuidadosamente envenenado, por exemplo:
Host: sitelegitimo.com/health?x=
O roteador despacha a requisição corretamente para o manipulador /admin/seguro — mas, quando o middleware de autorização examina request.url.path, vê /health em seu lugar. Se o middleware usa uma lista de permissões (allowlist) que confia em /health como um endpoint público de verificação de saúde, o atacante passa despercebido. A verificação de autorização é silenciosamente contornada; sem token, sem senha, sem qualquer interação do usuário .
O boletim da X41 D-Sec confirma a simplicidade surpreendente: "Simplesmente inserir um único caractere no cabeçalho HTTP Host é suficiente para enganar o servidor" . Os caracteres específicos que causam a confusão incluem barras (
/), pontos de interrogação (?) e cerquilhas (#) — delimitadores padrão de URL que o Starlette nunca validou .
O alcance da vulnerabilidade é assustador. O Starlette é o motor oculto por trás de praticamente todas as principais ferramentas de orquestração e disponibilização de IA em Python, sendo baixado aproximadamente 325 milhões de vezes por semana . Todos os projetos derivados que consomem o Starlette em versão anterior à 1.0.1 são afetados:
As versões afetadas confirmadas abrangem Starlette >= 0.8.3 até < 1.0.1, o que significa que sistemas que executam versões estáveis há anos estão potencialmente vulneráveis .
A classificação de severidade oficial para a CVE-2026-48710 gerou uma discordância significativa na comunidade de segurança:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N trata o impacto na confidencialidade e integridade como "Baixo", restringe o escopo a "Não Alterado" e não reporta impacto na disponibilidade CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:NTrês fatores sustentam o argumento dos pesquisadores de que 6.5 é perigosamente baixo:
SC:H/SI:H do CVSS v4.0 finalmente capturam A versão 1.0.1 do Starlette, lançada em 22 de maio de 2026, contém o patch definitivo. A correção é rastreada no Aviso de Segurança do GitHub GHSA-86qp-5c8j-p5mr e no aviso X41-2026-002 da X41 .
O patch implementa duas proteções centrais:
Host agora é validado em relação à gramática especificada na RFC 9112 §3.2 e RFC 3986 §3.2.2 antes de ser usado para construir request.url scope["server"] — a tupla de conexão real do servidor — em vez do valor fornecido pelo atacante. Como resultado, request.url.path reflete consistentemente o caminho roteado real O projeto FastAPI confirmou que a correção é eficaz e recomendou a atualização do starlette para >=1.0.1 imediatamente .
Atualizar o pacote Starlette é o primeiro passo essencial, mas uma defesa abrangente requer múltiplas camadas:
Aplique o patch imediatamente. Em cada ambiente virtual, imagem de contêiner e pipeline de implantação que execute infraestrutura de IA, execute:
pip install --upgrade starlette
Reinicie todos os serviços afetados. Isso se aplica tanto a instalações diretas do Starlette quanto a instâncias do FastAPI, vLLM, LiteLLM e servidores MCP .
Audite e fixe as dependências. O FastAPI e outros frameworks podem não impor automaticamente a versão mínima do Starlette. Exija explicitamente starlette>=1.0.1 em requirements.txt, pyproject.toml, poetry.lock ou arquivos de lock equivalentes. Execute pip list | grep starlette.
Escanear cada componente da pilha de IA. Qualquer serviço Python que sirva HTTP — aplicativos FastAPI personalizados, endpoints de inferência de LLM, planos de orquestração de agentes, painéis de avaliação de modelos e proxies compatíveis com OpenAI — pode incorporar uma versão vulnerável do Starlette. Realize uma auditoria completa da infraestrutura .
Reforce proxies reversos e WAFs. Configure o nginx, Envoy, HAProxy, Cloudflare ou AWS ALB para rejeitar ou sanitizar cabeçalhos Host malformados antes de encaminhar o tráfego para as aplicações Python. Isso fornece uma defesa em profundidade que bloqueia a exploração, mesmo que a aplicação de patches na aplicação esteja atrasada .
Reescreva as verificações de segurança de caminho para longe de request.url.path. A causa raiz foi a incompatibilidade entre o caminho de roteamento e request.url.path. Sempre que possível, alterne o middleware de autorização para usar request.scope["path"], que deriva do escopo ASGI bruto e não pode ser envenenado pelo cabeçalho Host . A X41 D-Sec recomenda evitar totalmente a autorização baseada em caminho em favor de mecanismos de autenticação intrínsecos ao endpoint
.
Teste a exposição. Um scanner online foi disponibilizado para ajudar as organizações a verificar se seus servidores estão vulneráveis . Combinado com testes de penetração minuciosos contra limites de autenticação, isso pode revelar superfícies de ataque negligenciadas.
Para implantações baseadas em Debian, a CVE-2026-48710 é rastreada no Rastreador de Segurança do Debian com severidade "importante", e versões pontuais corrigidas do starlette estão disponíveis para as suítes afetadas . Aplique a transação
apt corretiva do repositório bullseye-security ou equivalente e recarregue os arquivos de unidade do systemd afetados .
Comments
0 comments