FortiMail sem correção, sete avisos no Next.js e o token que cresceu 13 vezes

Neri Filho

A semana não teve um incidente que dominasse tudo. Teve uma forma repetida, e ela é sobre etiqueta que continua a mesma enquanto o conteúdo embaixo muda. Seis dos oito itens aqui são variação disso.

O caso mais bruto é o FortiMail. A Fortinet confirmou exploração ativa de uma falha 9,8 em 1º de outubro e não publicou versão corrigida: o que existe é contorno de configuração. Quem tem rotina de "atualiza e segue" descobriu que a rotina não se aplica. O Next.js publicou sete avisos no dia 30, e subir a versão é a parte fácil: o que decide se você estava exposto é configuração, não número de versão. A Anthropic e a OpenAI lançaram modelo em dois dias seguidos sem mexer no preço por token, porque o que caiu foi o número de tokens por tarefa. O token de instalação de GitHub App foi de 40 para 520 caracteres mantendo o prefixo ghs_. O Pix por aproximação não ganhou limite novo: o Banco Central apagou o artigo que dava limite próprio a ele. E o Python 3.15 não mudou de número, mudou de data.

É um conjunto chato de monitorar, porque nenhum desses aparece em diff de package.json nem em alerta de versão nova. Oito itens. Três desenvolvidos.

Destaques

Zero-day no FortiMail, com exploração ativa e nenhuma versão para instalar

Em 1º de outubro a Fortinet publicou o aviso FG-IR-26-175, sobre a CVE-2026-104286, nota 9,8. São duas falhas somadas na interface web: travessia de caminho e tratamento indevido de byte nulo, no recurso de cifragem baseada em identidade (IBE). O efeito é escrita de arquivo arbitrário no sistema, sem autenticação nenhuma, por requisição HTTP ou HTTPS forjada. Atingidas: 8.0.0 a 8.0.1, 7.6.0 a 7.6.6, 7.4.0 a 7.4.8 e 7.2.0 a 7.2.9. A CISA pôs a falha no catálogo de exploração ativa no mesmo dia, com prazo de 4 de outubro para as agências federais americanas.

O detalhe que muda o procedimento é que não existe versão corrigida. O aviso lista a 8.0.2, a 7.6.7 e a 7.4.9 como versões futuras que conterão a correção, e manda quem está no ramo 7.2 migrar para 7.4 ou acima. Enquanto isso o que existe é contorno: desabilitar o IBE, pela interface ou pela linha de comando, ou tirar a interface de webmail da internet e deixá-la só em rede confiável. Repare no que isso faz com a fila de trabalho. Não é uma janela de atualização, é uma decisão de configuração em produção, e decisão de configuração precisa de dono.

A outra metade disso é que o caso vem com indicadores de comprometimento, e o relato da BleepingComputer registra quais: arquivos de biblioteca modificados ou acrescentados, tarefa de cron referenciando /migadmin, conta de arquivamento apontando para servidor remoto, e os endereços 79.141.169.187 e 45.129.0.192. A falha foi achada dentro da própria Fortinet, por Gwendal Guégniaud, do time de segurança de produto. Ou seja: o fornecedor descobriu, mas descobriu depois de alguém já estar usando. Se você tinha IBE exposto, a ordem certa é triagem antes de contorno, porque o contorno fecha a porta e não diz se alguém já entrou.

No dia anterior tinha saído o par desse caso, e vale olhar junto. Em 30 de setembro a Cisco publicou o aviso da CVE-2026-76504, também 9,8, no Catalyst SD-WAN Manager: tratamento indevido de codificação de URI em requisição HTTP faz a regra de autenticação não casar, e o pedido chega no endpoint protegido sem credencial, com acesso de API como administrador. A Cisco diz ter tomado conhecimento de exploração ativa em setembro, e o aviso é explícito em que não há contorno. Corrigido na 20.9.10.1, 20.12.8.2, 20.15.6.1, 20.18.4.1, 26.1.2.1 e 26.2.1.

Os dois juntos formam uma simetria desconfortável. O FortiMail tem contorno e não tem correção; o Cisco tem correção e não tem contorno. E nos dois a falha está no mesmo lugar: em como o aparelho interpreta uma string antes de decidir quem você é. Byte nulo de um lado, codificação de URI do outro. Isso é a terceira semana seguida que o Radar abre com equipamento de borda, e a pergunta continua sendo a mesma: quem aplica firmware nos seus, e em quantas horas.

Sete avisos no Next.js, e por que a versão nova é a parte fácil

Em 30 de setembro a Vercel publicou a liberação de segurança de setembro, com a 16.3.8 (LTS ativa) e a 15.5.27 (LTS em manutenção). São sete falhas: uma alta, cinco médias e uma baixa. Era a data avisada com uma semana de antecedência, que o Radar da semana passada pediu para pôr na agenda.

A alta é a CVE-2026-94483, falsificação de requisição no lado do servidor na otimização de imagem: uma URL remota que está na lista de permissão mas é controlada pelo atacante leva a requisição para onde ele quiser, inclusive faixa de IP privado. As médias se dividem em envenenamento de cache e vazamento de conteúdo. A CVE-2026-94543 troca a entrada de cache de uma página por conteúdo de outra rota em aplicação auto-hospedada com Pages Router e páginas SSG ou ISR. A CVE-2026-94484 faz o mesmo com uma requisição só, sem autenticação, em quem tem página catch-all na raiz junto com rotas SSG ou ISR. A CVE-2026-94485 faz rota de imagem de metadado, tipo opengraph-image e twitter-image, ignorar o dynamicParams e servir segmento que foi deliberadamente deixado fora do generateStaticParams(). A GHSA-h694-7cp9-m8p3 erra a chave de cache quando uma função 'use cache' chama outra que lê parâmetro de raiz. E a CVE-2026-94544 deixa requisição normal receber conteúdo de Draft Mode não publicado, e persistir isso na página gerada.

Agora leia a lista de novo e repare que toda entrada tem um "se". Sem images.remotePatterns configurado, a alta não te atinge. Em aplicação na Vercel, a 94543 não te atinge. Com build em Turbopack, a 94485 não te atinge. Sem Cache Components, as duas últimas não te atingem. Isso faz do exercício útil não o npm install, e sim um questionário de seis linhas contra o seu próprio app: tem remotePatterns? tem Pages Router com SSG ou ISR auto-hospedado? tem catch-all na raiz? build em webpack ou Turbopack? usa 'use cache'? serve Draft Mode? Eu rodei isso neste site enquanto escrevia, e a resposta foi nenhuma das seis. Levou três minutos e vale mais que o número da versão, porque na próxima liberação a lista de falhas será outra e o questionário é o mesmo.

A baixa merece parágrafo próprio porque é a mais provável de acontecer com você. A CVE-2026-94486 é no servidor de desenvolvimento: o endpoint de Model Context Protocol que o next dev expõe não verifica de qual site veio a requisição. Um site malicioso que você visite com o next dev rodando consegue ler onde o projeto está no disco, trechos de código-fonte vindos de relatório de erro, o inventário de rotas e os logs de desenvolvimento. Produção não serve esse endpoint. Mas caminho no disco, inventário de rotas e log de desenvolvimento é bastante coisa para uma severidade baixa, e o vetor é "você abriu uma aba".

Dois modelos em dois dias, e o preço por token que não mexeu

Em 28 de setembro a Anthropic anunciou o Claude Sonnet 5.5, com o mesmo preço do Sonnet 5: 2 dólares por milhão de tokens de entrada, 10 de saída e 0,20 de leitura de cache. A saída sai mais de 30% mais rápido. E o número que de fato interessa está no consumo, não na tabela: segundo a própria página, em tarefas de finanças o modelo usou em média 121 mil tokens por resposta, contra 497 mil do Sonnet 5.

No dia seguinte, no DevDay, a OpenAI lançou o GPT-6.1 Sol. Pela tabela de preços oficial, entrada e saída ficaram iguais às do GPT-6 Sol, em 2 e 10 dólares por milhão. O que mudou foi a entrada em cache, que caiu de 0,20 para 0,10. Continua valendo a regra de contexto longo da casa: acima de 272 mil tokens de entrada, o preço de entrada dobra e o de saída vai a 15.

Duas coisas para quem tem custo de inferência em planilha. A primeira é que preço por token deixou de ser o eixo de comparação. Os dois lançamentos da semana mantiveram a tabela e mexeram em quantos tokens uma tarefa consome, e esse número ninguém te entrega: ele sai do seu tráfego, com os seus prompts. Se a sua medição hoje é "custo do mês", ela não captura a melhora nem a piora. O que captura é token de entrada e de saída por tarefa concluída, quebrado por rota.

A segunda é sobre cache, e é a parte silenciosa. Com entrada em cache a 0,10 contra 2,00 de entrada cheia, a diferença virou vinte vezes. Isso significa que a ordem do seu prompt, o que você põe estável no começo e o que varia no fim, pesa mais na conta do que a escolha entre um modelo e outro da mesma faixa. Era verdade na semana passada com o GPT-6 Sol, quando a razão era dez. Esta semana dobrou.

Em nota

  • Token de instalação de GitHub App foi de 40 para 520 caracteres. O changelog de 2 de outubro encerrou a migração para o formato sem estado ghs_APPID_JWT. Permissão, escopo de repositório, validade de uma hora e a API REST de emissão continuam iguais, e token antigo funciona até expirar. O que quebra é previsível e é por isso que vale a nota: validação que exige 40 caracteres, coluna de banco curta, middleware que trunca cabeçalho Authorization longo e regra de ocultação de segredo que casa só com o padrão velho. O cabeçalho temporário X-GitHub-Stateless-S2S-Token fica depreciado em 30 de novembro de 2026. A lição é a de sempre com credencial de terceiro: trate como string opaca, sem supor formato nem tamanho.
  • O Python 3.15 escorregou para 9 de outubro. Em 2 de outubro saiu o terceiro candidato, com cerca de 156 correções de 82 contribuidores desde o rc2, e o anúncio diz o motivo: apareceu impedimento de última hora em importação tardia, e faz sentido dar tempo de testar direito. A importação tardia explícita, da PEP 810, é justamente o recurso de capa do 3.15. Quem tinha a atualização marcada para a primeira semana de outubro muda a data, não o plano.
  • Rust 1.99.0, e o fim do toolchain em Windows 32 bits. O 1.99.0 saiu em 1º de outubro com funções variádicas de ABI C e o VaList estabilizado, mais Vec::into_parts e Vec::from_parts, Box::into_non_null, IntoIterator para Box<[T; N]> e std::fs::set_times. No dia seguinte veio o aviso de rebaixamento dos alvos i686 de Windows: a partir do 1.100.0, o i686-pc-windows-msvc fica em nível 1 sem ferramentas de host e o i686-pc-windows-gnu em nível 2 sem ferramentas de host. A biblioteca padrão continua sendo distribuída; o que deixa de existir é instalar toolchain em host Windows de 32 bits. Quem precisa do alvo compila cruzado a partir de 64 bits.
  • O Pix por aproximação perdeu a regra de limite própria. Entrou em vigor em 1º de outubro a Instrução Normativa BCB nº 746, de 16 de junho, que revoga o inciso VI do § 2º do art. 10, o art. 16-A e o art. 16-C da Instrução Normativa BCB nº 512. Era ali que morava o teto de 500 reais por transação por aproximação. Sem esses dispositivos, o limite passa a ser o que a instituição combinou com o cliente, como em chave e QR Code. A mesma revogação vale para iniciação por compartilhamento do serviço de iniciação sem redirecionamento, a jornada do Open Finance. Se tem 500 escrito à mão em validação ou em teste dessas duas trilhas no seu código, está errado desde quinta.
  • Workers KV Instant, que não é bem um KV. Na semana de aniversário da Cloudflare saiu, em 1º de outubro, um modo novo do Workers KV apoiado no Quicksilver: leitura com P99 abaixo de dois milissegundos e propagação de escrita com P99 em 256 ms pela rede inteira. Os limites são o que dizem para que serve: até 10 mil pares por namespace, 1 MB no total, chave de até 300 bytes, uma escrita por namespace por segundo e armazenamento a 100 dólares por MB por mês. Isso não é cache nem banco de sessão, é store de configuração e de feature flag com API de KV, e com esse preço por MB o desenho tem que ser pequeno de propósito. Está em beta privado.

O que eu faria com isso esta semana

  1. Separar "tem contorno" de "tem correção" no inventário de borda. São duas filas diferentes e a semana entregou uma de cada. FortiMail: aplicar o contorno hoje e, se o IBE estava exposto, fazer triagem com os indicadores publicados antes disso, porque a correção não existe para esperar. Catalyst SD-WAN Manager: não há contorno, então é lista de atualização, e o prazo da CISA era 3 de outubro. Depois responda a versão geral da pergunta: para cada aparelho que termina TLS ou autentica a sua rede, quem aplica firmware e em quantas horas.
  2. Fazer o questionário de seis linhas do Next.js, não só o npm install. Tem remotePatterns? Pages Router com SSG ou ISR auto-hospedado? catch-all na raiz? webpack ou Turbopack? 'use cache'? Draft Mode? Seis respostas dizem se você estava exposto, e ficam guardadas para a próxima liberação. E, se roda next dev no mesmo navegador em que navega, trate a falha baixa como a mais relevante das sete.
  3. Trocar "custo por mês" por "tokens por tarefa" na sua medição de inferência. É o único número que mostra o ganho dos lançamentos desta semana, e ele não vem de benchmark de ninguém. Instrumente entrada, saída e leitura de cache por tarefa concluída, por rota. É também o primeiro gráfico que eu pediria num diagnóstico de IA em produção, porque ele diz onde está o desperdício antes de qualquer troca de modelo.
  4. Procurar o 40 e o 500 no seu código. Dois números fixos ficaram inválidos nesta semana, em domínios que não têm nada a ver um com o outro: o tamanho do token de GitHub App e o teto do Pix por aproximação. grep é barato e a classe de bug é a mesma, que é constante de terceiro escrita à mão. Se achar um dos dois, vale olhar o que mais entrou no código como número mágico de fornecedor.

Radar é a newsletter semanal deste blog: o que aconteceu na semana em tecnologia, com comentário sobre o que muda para quem constrói e opera software.

Tem um desses rodando — ou pra construir?

Me conte em duas linhas. Respondo em até 24h dizendo se é o tipo de coisa que eu faço bem — e se não for, digo isso também.

Outros textos