Voltar para todas as publicações
Publicado em · por Renaud Deraison

O gateway aceitou qualquer token

Em 2 de setembro, a CISA adicionou sete falhas exploradas ao catálogo KEV. Três são infraestrutura de IA, o primeiro lote em que a IA representa quase metade. Leia a entrada do LiteLLM: seu endpoint MCP admitia uma requisição não autenticada portando qualquer token Bearer, porque uma validação de chave que falhava caía num objeto de autenticação vazio, e o chamador podia então listar e invocar todas as ferramentas ligadas ao gateway. O Bromure Agentic Coding guarda a mesma autoridade atrás de um hipervisor e de um vsock, sem porta em escuta, sem cabeçalho a forjar e sem ramo de fallback.

Você construiu o gateway para que nenhum notebook sozinho guardasse todas as chaves. Funcionou, e ele passou a guardar todas as chaves. Depois a porta da frente aceitou um token Bearer que alguém inventou.

Em 2 de setembro, a CISA adicionou sete vulnerabilidades ao catálogo de Known Exploited Vulnerabilities. Dois bugs do SonicWall SMA1000, uma injeção de SQL no Sangoma Switchvox, um desvio de autenticação no JFrog Artifactory, uma injeção de comando de sistema no Kestra, uma falha de HTTP smuggling no Starlette e uma falha de autenticação imprópria no LiteLLM da BerriAI.

Três dessas sete são infraestrutura de IA e ML. A Forkast chamou isso de o primeiro lote KEV em que componentes de IA respondem por quase metade das adições, o tipo de marco que rende uma manchete e depois vai para o arquivo. Olhe qual infraestrutura de IA é essa e o lote merece mais do que arquivo. As três ficam no meio: são os componentes que você implanta para que seus agentes e os recursos que eles tocam parem de falar diretamente entre si. Comece pela entrada do LiteLLM.

O ramo de fallback

O LiteLLM é um gateway de IA: um proxy que fica entre seus agentes e os provedores de modelo, guarda as chaves dos provedores para que mais ninguém precise guardá-las, aplica orçamentos e limites de taxa, escreve os registros e agora se ramifica para servidores Model Context Protocol, de modo que os agentes de uma equipe compartilhem um único endpoint MCP em vez de cada desenvolvedor ligar o seu.

A CVE-2026-59822, publicada em 8 de julho e com CVSS 8.8 no aviso do GitHub, vive nesse endpoint MCP. Uma frase do aviso carrega a história inteira:

o caminho de fallback podia substituir uma validação de chave LiteLLM que falhou por um objeto UserAPIKeyAuth() vazio.

O endpoint MCP Streamable HTTP suportava passthrough OAuth2, para que um token destinado a um servidor MCP upstream pudesse atravessar o gateway em vez de ser validado contra o próprio repositório de chaves do LiteLLM. É um recurso razoável, e ele exige um ramo: tentar primeiro a chave LiteLLM e seguir o caminho de passthrough quando não é uma chave que chegou.

Chega-se a esse ramo falhando. Envie um cabeçalho Authorization contendo qualquer string, a validação de chave a rejeita porque a string não é uma chave, e o handler constrói um UserAPIKeyAuth() vazio e segue com ele. Sua requisição agora detém uma sessão MCP autenticada que não pertence a ninguém. Dali você enumera todas as ferramentas MCP com que o gateway foi configurado e as chama: aplicações internas, bancos de dados, consoles de nuvem, sistemas de desenvolvimento, o que quer que a equipe tenha conectado. A falha afeta todas as versões anteriores à 1.84.0. O prazo de remediação da CISA para as agências federais é 16 de setembro, e o conselho do LiteLLM para quem não pode atualizar hoje é bloquear /mcp/ no reverse proxy à frente dele.

CVE-2026-59822 — o ramo que a falha alcançarequisição não autenticadaPOST /mcp/Authorization: Bearer anything-at-allvalidar a chave LiteLLMa string não é uma chavea validação falhafallback de passthrough OAuth2substitui por um objeto de auth vazio e segueUserAPIKeyAuth()sessão MCP autenticada, que não pertence a ninguémlistar todas as ferramentas configuradas · chamar qualquer uma · nenhuma chave LiteLLM apresentadaaplicações internasatrás do gatewaybancos de dadoso que estivesse ligadoserviços de nuvemcom todo o seu alcancesistemas de devcódigo, CI, tickets
O handler MCP tentava primeiro a chave LiteLLM e, quando ela falhava, seguia o caminho de passthrough OAuth2, que construía um UserAPIKeyAuth() vazio e continuava. Uma requisição portando um token Bearer inventado chegava onde uma chave válida teria chegado: uma sessão MCP autenticada, com toda a lista de ferramentas do gateway atrás dela.

Os outros três quebraram na mesma função

Leia o resto do lote e você obtém algo mais útil do que a manchete de IA contra não-IA.

Starlette, CVE-2026-48710, apelidada de BadHost. O Starlette é o toolkit ASGI sob o FastAPI, sobre o qual boa parte dos serviços de IA em Python, o LiteLLM incluído, é construída. Um cabeçalho Host forjado injeta um caminho na parte de host da requisição, o que desloca a forma como a URL é reconstruída, o que significa que um middleware de autenticação baseado em caminho avalia uma rota enquanto a aplicação serve outra. A entrada da CISA declara o resultado: desvio de autenticação, quando a autenticação depende do caminho da URL reconstruída. Ela leva um CVSS de 6.5, a nota mais baixa do lote e a que menos diz sobre a consequência. O LiteLLM lançou sua própria correção companheira para o mesmo formato na 1.84.0, descrevendo-a como “um cabeçalho Host forjado podia fazer o portão de autenticação do proxy avaliar uma rota diferente da que servia”, e disse aos operadores cujo proxy esteve exposto que rotacionassem as chaves e auditassem os registros de administração.

JFrog Artifactory, CVE-2026-82329, CVSS 9.8. Autenticação imprópria na configuração padrão: uma chave de junção “fantasma” que permite a um atacante não autenticado forjar tokens de administrador. A watchTowr documentou exploração em ambiente real em 1º de setembro, quatro dias após a divulgação, com atacantes cunhando credenciais de admin e enumerando usuários. Este é o repositório de artefatos, o host que responde a npm install e pip install para a organização inteira.

Kestra, CVE-2026-49869. Injeção de comando de sistema alcançável por um atacante remoto não autenticado, que pode criar e executar workflows arbitrários sem credencial alguma. O orquestrador faz o que um orquestrador faz, em nome de alguém que nunca fez login.

Quatro produtos, quatro bases de código diferentes e a mesma função quebrada em cada uma: aquela que decide se esta requisição tem o direito de estar aqui. Um objeto de autenticação vazio. Um caminho reconstruído. Uma chave de junção padrão. No caso do Kestra, verificação nenhuma na rota que executa as coisas.

O que os atacantes fizeram em seguida foi entediante, e o tédio é a marca do trabalho em volume. O The Hacker News reuniu o comportamento observado: reverse shells, mineradores XMRig, enumeração de credenciais e roubo de chaves de API e de credenciais de provedores de LLM. A Microsoft resumiu:

Os objetivos observados foram consistentes. Nos casos analisados, a telemetria mostrou coleta de credenciais, mecanismos de acesso duradouro e monetização de recursos, ainda que o caminho de execução variasse conforme o produto.

Um lote, uma função, quatro jeitos de errarCOMPONENTEA VERIFICAÇÃO QUE DECIDIAO QUE ELA DEIXOU PASSARLiteLLM · gateway de IACVE-2026-59822 · 8.8validar a chave de API do LiteLLMno endpoint MCPqualquer token Bearera falha caía num objeto de auth vazioStarlette · toolkit ASGICVE-2026-48710 · 6.5middleware de auth por caminhosobre a URL reconstruídauma rota que ela nunca guardouum cabeçalho Host forjado deslocou a reconstruçãoJFrog Artifactory · registroCVE-2026-82329 · 9.8validação da chave de junçãona configuração padrãotokens de administrador forjadosexplorada em ambiente real quatro dias depoisKestra · orquestradorCVE-2026-49869nenhuma, na rota que executacriar e executar workflowcomandos arbitrários, sem autenticaçãonenhuma credencial necessária
Quatro entradas de um mesmo lote KEV, quatro bases de código, uma função. Cada produto quebrou no ponto em que decide se uma requisição tem lugar ali, e três das quatro são componentes que você implanta para centralizar o acesso em vez de deixar cada desenvolvedor guardar o seu.

O gateway era a ideia certa, e esta é a conta

O gateway de IA é uma das melhores ideias dos últimos dois anos, e a maioria das equipes chegou a ele por razões sólidas.

Antes do gateway, o agente de código de cada desenvolvedor guardava uma chave de provedor numa variável de ambiente, cada desenvolvedor ligava seus próprios servidores MCP com seus próprios tokens, e ninguém sabia dizer quanto tudo aquilo havia gasto ou tocado. Colocar um gateway no meio resolve tudo isso de uma vez. Um único lugar guarda as chaves dos provedores e a configuração MCP, e escreve o registro. Rotacionar uma chave vira uma operação só, e cortar o acesso de um funcionário que sai também. A indústria convergiu para isso por um bom motivo.

A conta é que você construiu um serviço de rede cujo propósito inteiro é guardar a autoridade de todo mundo, e que decide quem você é com uma função. Funções têm ramos, e um deles trata o caso em que a primeira coisa que você tentou não deu certo.

O LiteLLM não inventou esse formato. Todo gateway tem uma porta da frente, toda porta da frente tem uma função de autenticação, e uma função de autenticação que suporta dois esquemas de credencial tem um caminho que ela toma quando o primeiro falha. O alcance que fica atrás dessa porta é deliberado: concentrá-lo é o produto. Então, quando um gateway se mete em apuros, tudo o que ele guarda já está na sala.

A conclusão que costuma se tirar de um incidente assim é “voltar às chaves por desenvolvedor”, o que é pior em qualquer métrica que se queira usar. Continue centralizando. A pergunta que vale discutir é onde a coisa centralizada fica, e se ela precisa atender requisições de estranhos para fazer seu trabalho.

Onde o Bromure coloca o mesmo trabalho

O Bromure Agentic Coding roda cada agente de código numa VM Linux virtualizada por hardware no seu próprio Mac, e todo controle de segurança fica do lado do host dessa fronteira. Os controles são a mesma lista que um gateway oferece: guardar as credenciais, mediar os servidores MCP, classificar o que o agente faz com a sua infraestrutura, manter o registro. Nada em rede alguma consegue alcançar o componente que os aplica.

Não existe porta da frente. O HTTPS do convidado nunca sai pela rede. Ele tunela por um socket virtio, a porta vsock 8443, até o proxy do host, e o manual é direto sobre a topologia: a VM não tem nenhuma outra rota para a rede. O proxy não mantém porta em escuta alguma que sua LAN, sua rede corporativa ou a internet possam endereçar. Ele nunca pergunta quem está chamando, porque uma única coisa está na outra ponta desse socket e o hipervisor decide o que essa coisa é. Sem cabeçalho Authorization, sem repositório de chaves, sem negociação de esquema e, portanto, sem ramo a tomar quando o primeiro esquema falha.

O token bearer do MCP é falso antes mesmo de chegar ao agente. Para servidores MCP com transporte HTTP configurados num workspace, o token bearer real permanece criptografado no Mac. A configuração do agente recebe um substituto brm-mcp_…. O painel de ajustes rotula esse campo como Nunca enviado à VM — trocado pelo proxy, e o proxy do host substitui o valor real no fio, limitado a correspondência exata ou de subdomínio ao host daquele servidor e a nenhum outro. O proxy também responde 404 aos caminhos de descoberta OAuth e OIDC do servidor, de modo que o Claude Code trate o servidor como pré-autenticado em vez de tentar um fluxo de navegador que a VM jamais conseguiria concluir. O fallback do LiteLLM se apoiava nessa mesma superfície de passthrough. Aqui o workspace não guarda credencial alguma para deixar cair.

Cada operação recebe a própria decisão. Um gateway resolve a questão na porta: passou por ela, e tudo o que está atrás é seu. Os Guardrails do Bromure classificam as chamadas do agente dentro do proxy, através de Kubernetes, AWS, forjas git, registries de contêineres e bancos de dados, e aplicam uma política de escrita por serviço. Workspaces novos vêm com Perguntar antes de escrever, de modo que as leituras fluem e cada mutação pausa num diálogo do lado do host mostrando a operação literal: o SQL exato, ou MÉTODO /caminho. Somente leitura bloqueia toda mutação. Perguntar antes de usar controla a própria credencial, com concessões medidas em minutos. Uma sessão forjada ainda não consegue abrir caminho com um kubectl delete por nada, porque a segunda decisão acontece no seu Mac e não deve nada ao modo como a primeira correu.

Negar por padrão responde à alcançabilidade, nos dois sentidos. O firewall de saída do workspace é uma tabela ordenada de regras com um padrão para o tráfego não correspondido. Ponha-o em Negar e a VM alcança os hosts que você listou e mais nada, em qualquer protocolo. Dois componentes fora do convidado aplicam isso: o switch virtual casa cada fluxo por IP de destino e nome de host capturado do DNS, e o proxy casa de novo pelo nome de servidor TLS. As edições chegam às sessões em andamento sem reinício. No outro sentido, o modo NAT mantém as VMs fora da sua LAN física, e nada de fora abre conexão até elas a menos que você publique um serviço de propósito. Os scanners que varreram aqueles gateways expostos não recebem resposta alguma de um Mac.

Tudo o que um gateway comprometido devolve é entrada não confiável. Esta parte sobrevive à CVE. Uma vez que um gateway pertence a outra pessoa, saída de modelo, resultados de ferramentas e strings de erro chegam todos de um atacante, no fio de maior privilégio da pilha: aquele sobre o qual o agente foi construído para agir. O detector de código-fonte do Bromure pontua os trechos tool_result no tráfego de IA de saída do agente com um modelo PromptGuard local, no dispositivo, antes que o modelo aja sobre eles, e pode registrar, perguntar ou bloquear; um bloqueio devolve HTTP 451 e o modelo nunca vê o conteúdo.

A perna de exfiltração falha fechada. Toda credencial de um workspace é uma falsificação determinística com um único destino legítimo. O proxy varre cada requisição de saída em busca de uma falsificação indo para onde não foi cunhada; quando encontra uma, recusa a requisição sem encaminhar um byte, pausa a VM e levanta um alerta, registrado como uma linha vermelha de Corretagem de credenciais na Security Timeline. Como só a falsificação esteve ao alcance, a credencial real não precisa ser rotacionada.

autoridade no meioum serviço, alcançável por tudo que sabe rotear até eleagente · laptop Aagente · laptop Bum estranhotoken inventadogateway de IAescutando em :443a função de auth lê um cabeçalhoguarda todas as chaves de APIguarda todas as ligações MCPum ramo decide tudoprovedores de modelo · bancos · nuvem · apps internosalcançados com a autoridade do gateway, não a do chamadoro que um atacante precisauma rota até a porta, e um ramo ruim na verificaçãoautoridade na bordaum Mac, um hipervisor, nada em escutaVM do workspace · o agente roda aquibrm-mcp_… · sk-ant-api03-brm-… · ghp_…só substitutos — nenhum segredo real no convidadovsock 8443 — a única saídaproxy do host · no seu Macsem porta em escuta · sem cabeçalho a forjar · sem fallbacktroca pela credencial real, limitada a um só hostfirewall de saída · política de escrita · scan de injeçãouma linha de trace por requisição, na sua máquinao que um atacante precisauma rota que não existe, até uma porta que não está aberta
À esquerda: autoridade no meio. Um serviço de rede guarda todas as chaves e todas as ligações MCP, e uma única função de autenticação fica entre ele e quem quer que consiga rotear até lá. À direita: autoridade na borda. Os mesmos controles rodam no seu Mac atrás de um hipervisor, alcançados por um socket virtio sem porta em escuta. A VM guarda apenas falsificações, e o proxy julga cada operação depois que a requisição deixou o convidado.

Se você opera um gateway hoje

Atualize o LiteLLM para 1.84.0 ou mais recente; se não puder, bloqueie /mcp/ no reverse proxy à frente dele. Depois siga o conselho do próprio LiteLLM sobre a correção do cabeçalho Host e trate um proxy exposto como um repositório de chaves exposto: rotacione as chaves de provedor que ele guardava, audite os registros de administração. As agências federais têm até 16 de setembro na CVE-2026-59822, uma data razoável de se tomar emprestada.

A regra que encolhe a pergunta

No painel Guardrails do workspace, ponha Tráfego não correspondido em Negar e liste o que o trabalho precisa: allow web api.github.com, allow web registry.npmjs.org, default deny. Um workspace que não tem permissão para alcançar um gateway interno não pode ser usado para atravessar um, e salvar empurra a política para as sessões ativas sem reinício.

Guarde o segredo, não o verifique

Uma linha das próprias notas de arquitetura do Bromure merece releitura depois de uma semana como esta:

Contornar a fronteira não rende nada a um atacante, porque a fronteira não é onde os segredos são verificados — é o único lugar onde os segredos existem.

Um gateway é um lugar onde credenciais são verificadas: uma requisição chega, uma função a inspeciona, e o veredito dessa função é a única coisa entre o chamador e as chaves. Verificações têm casos de borda e caminhos de fallback. Verificações rendem uma CVE, uma entrada KEV e um prazo federal, e depois rendem outra dois meses adiante num ramo diferente da mesma função.

Uma fronteira de fio é um lugar onde as credenciais estão. Nada chega para ser inspecionado, então nenhum veredito pode dar errado. O token real fica criptografado num Mac, o workspace guarda um substituto brm- que não vale nada em lugar nenhum, e a substituição acontece num socket em que só um hipervisor pode escrever.

Já escrevemos variações disto três vezes em seis semanas: um proxy de saída que confiou num hostname que o agente podia escrever, um guardião de comandos que lia bash de outro jeito que o bash e três agentes de código cujos desvios terminavam todos numa credencial real dentro de um processo. Toda vez, o componente que falhou estava fazendo um trabalho honesto de avaliar alguma coisa, e essa é a constante. Avaliação é uma primitiva mais fraca que ausência, e continuamos entregando à avaliação o trabalho que a ausência faz de graça.

Centralizar a autoridade dos seus agentes foi a decisão certa. Ponha a coisa centralizada onde ninguém possa lhe mandar uma requisição. Instale o Bromure Agentic Coding e dê a cada agente uma fronteira sem porta da frente.