Falha no Starlette permite que invasores burlem autenticação em apps FastAPI com controle de acesso baseado em caminho

Pesquisadores de segurança da X41 D-Sec, trabalhando em uma auditoria financiada pela OSTIF no framework de inferência vLLM, descobriram uma vulnerabilidade crítica de bypass de autenticação no Starlette — o framework Python ASGI que sustenta o FastAPI e um amplo ecossistema de infraestrutura de agentes de IA. Registrada como CVE-2026-48710 e batizada de BadHost, a falha permite que um invasor manipule o cabeçalho HTTP Host para fazer o Starlette reportar um caminho de URL diferente daquele que o servidor web realmente roteou — ignorando qualquer middleware que use request.url.path para decisões de controle de acesso. A correção está disponível no Starlette 1.0.1.
O alcance da exposição é amplo. O Starlette tem mais de 400.000 dependentes no GitHub e mais de 325 milhões de downloads semanais no PyPI. As aplicações afetadas incluem tudo que é construído sobre FastAPI com middleware de autenticação baseado em caminho, além de um conjunto específico de ferramentas de infraestrutura de IA: vLLM, LiteLLM, servidores Model Context Protocol (MCP), FastMCP, ADK-Python do Google, Ray Serve e BentoML — todos vulneráveis quando há middleware de autenticação personalizado.
Como o ataque funciona
Requisições HTTP incluem um cabeçalho Host que identifica o domínio alvo. O Starlette constrói seu objeto request.url concatenando o cabeçalho Host bruto com o caminho da requisição e, em seguida, reanalisa a string combinada de volta em um objeto URL. O problema: o Starlette não validava se o cabeçalho Host estava em conformidade com a gramática RFC 9112 antes de usá-lo nessa construção. Um invasor pode injetar caracteres separadores de caminho — /, ? ou # — no cabeçalho Host, o que desloca o que o parser vê como caminho, query e fragmento ao reanalisar a URL montada.
O resultado é uma visão dividida: o servidor ASGI roteia a requisição para o caminho real (digamos, /admin), mas request.url.path — o que o middleware de autenticação lê — reporta o caminho controlado pelo invasor (/health ou qualquer outro caminho benigno que o middleware permitiria). O advisory da X41 inclui uma prova de conceito tão simples quanto:
curl -H 'Host: foo?' localhost:8000/admin
Em um servidor vulnerável com autenticação baseada em caminho, isso retorna 200 OK do endpoint protegido /admin em vez de um 403 Forbidden.
A razão pela qual a vulnerabilidade passou tanto tempo despercebida é que ela emerge da interação de três camadas que, isoladamente, parecem razoáveis: servidores ASGI passam o cabeçalho Host bruto sem validação; o Starlette confia nele para construir a URL; e os desenvolvedores de middleware assumem que request.url.path é um valor seguro e autoritativo do servidor para controle de acesso. Nenhuma camada individual está quebrada por si só.
Quem está afetado
A vulnerabilidade é mais relevante para aplicações que controlam o acesso a endpoints protegidos usando middleware que verifica o caminho da requisição. Esse é um padrão comum em aplicações FastAPI onde um prefixo de caminho (como /admin, /internal ou /v1/private) determina a autorização. Aplicações que usam os decoradores Depends() ou Security() do FastAPI no nível de rota individual geralmente não são afetadas, porque esses mecanismos verificam a autorização no momento da resolução da rota, e não por inspeção de caminho em middleware.
O impacto na infraestrutura de IA é a preocupação mais aguda. Servidores MCP — que implementam o Model Context Protocol para conectar agentes de IA a ferramentas e fontes de dados — estão particularmente expostos porque a especificação do MCP exige endpoints de descoberta OAuth não autenticados, dando aos invasores um caminho de bypass confiável e conhecido, sem necessidade de adivinhar quais caminhos estão desprotegidos. vLLM e LiteLLM, amplamente usados para servir e fazer proxy de grandes modelos de linguagem (LLMs) em produção, são afetados quando estão atrás de middleware de autenticação personalizado baseado em Starlette. O ADK-Python do Google, o SDK Python para construir agentes de IA com os modelos do Google, também está na lista de afetados.
Remediação
A correção principal é atualizar para o Starlette 1.0.1, que rejeita cabeçalhos Host contendo caracteres inválidos em vez de usá-los na construção da URL. Para aplicações que não podem atualizar imediatamente, a mitigação é substituir qualquer uso de request.url.path em middleware de autenticação ou autorização por scope["path"] — o caminho do escopo ASGI, que vem diretamente da linha de requisição HTTP e não é influenciado pelo cabeçalho Host. A recomendação de longo prazo é evitar autenticação baseada em caminho em middleware, optando pelos mecanismos Depends() e Security() no nível de rota do FastAPI.
A equipe de pesquisa lançou ferramentas de detecção junto com a divulgação: regras Semgrep, consultas CodeQL para análise estática e um scanner gratuito em badhost.org que pode testar endpoints diretamente. O scanner oferece três modos — específico para MCP, descoberta automática de infraestrutura de IA e teste de caminho personalizado — para que as equipes avaliem a exposição sem precisar ler o advisory completo.
CVE-2026-48710 foi descoberta em 27 de janeiro de 2026 e coordenada para divulgação pública em 21–22 de maio de 2026, após o patch Starlette 1.0.1. Detalhes técnicos completos estão no advisory da X41 em x41-dsec.de.
Originally reported by OSTIF / X41 D-Sec. Read the original article for additional details.
View original source