Next.js 16.3.6 corrige RCE no ImageResponse: quem precisa atualizar

O Next.js publicou a versão 16.3.6 fora do calendário normal para corrigir uma vulnerabilidade crítica no ImageResponse de next/og. Aplicações afetadas podem chegar à execução remota de código quando valores controlados por um atacante entram no conteúdo, nos atributos ou nos estilos de um SVG usado para gerar uma imagem.

A falha está registrada como CVE-2026-94545 e recebeu nota 9,5 no CVSS 4.0. O intervalo vulnerável é >=16.2.0 <16.3.6. A recomendação é atualizar mesmo que a aplicação não pareça exposta, porque o patch também traz dependências corrigidas para esse caminho de renderização.

O que o ImageResponse faz

O ImageResponse permite produzir imagens a partir de JSX. Um uso comum são imagens de Open Graph geradas para páginas de produto, perfis, artigos ou resultados compartilháveis. O Next.js transforma a árvore de elementos em SVG e depois produz a imagem entregue pela rota.

Esse fluxo frequentemente mistura um layout criado pelo desenvolvedor com dados dinâmicos: título de uma publicação, nome de usuário, parâmetros da URL ou texto vindo de uma API. É justamente aí que a origem do valor passa a importar.

Como a falha entra no Next.js

O problema original está no Satori, biblioteca usada para transformar JSX em SVG. Versões anteriores à 0.33.5 não escapavam corretamente certos valores antes de inseri-los no SVG gerado. Um valor preparado para o ataque podia ser interpretado como marcação SVG em vez de continuar como texto ou atributo.

No Satori isolado, o advisory classifica a falha como moderada porque o impacto depende do destino dado ao SVG. No caminho do ImageResponse executado no runtime Node.js pelo Next.js, a combinação com outras dependências pode levar a RCE, elevando a gravidade do problema no framework.

Quem está e quem não está afetado

Uma aplicação está no grupo de risco descrito pelo advisory quando reúne estes pontos:

  • usa Next.js entre 16.2.0 e 16.3.5;
  • gera imagens com ImageResponse de next/og no runtime Node.js;
  • insere valores controlados por usuários ou requisições no conteúdo, nos atributos ou nos estilos de SVG.

A implementação de ImageResponse no runtime Edge não é afetada. Aplicações que não passam conteúdo controlado pelo atacante para o SVG também não atendem às condições descritas. Essa diferença ajuda a priorizar a investigação, mas não muda a recomendação de instalar a versão corrigida.

O Next.js 15.x não é afetado pela RCE. Ainda assim, a Vercel publicou o 15.5.26 com endurecimento relacionado. Para a linha 16.3, a versão corrigida é a 16.3.6.

Como verificar o projeto

O primeiro passo é conferir a versão realmente resolvida no lockfile e instalada no ambiente:

npm ls next

Depois, procure importações e chamadas de ImageResponse. Rotas de Open Graph e arquivos de geração de metadata são os lugares mais óbvios, mas o recurso pode aparecer em qualquer route handler.

rg "ImageResponse|next/og" app src pages

Em cada ocorrência, rastreie a origem dos valores usados no SVG. Query strings, headers, parâmetros de rota, campos de perfil e conteúdo editável por usuários devem ser tratados como entradas externas, mesmo quando passam antes por um banco de dados ou por outra API.

Atualização e mitigação

Na linha atual, a atualização indicada pelo projeto é:

npm install [email protected]

Equipes que usam outro gerenciador devem atualizar o mesmo pacote para a versão corrigida, revisar a alteração do lockfile, reconstruir a aplicação e fazer um novo deploy. Conferir apenas o package.json não basta se o ambiente continua usando uma imagem ou um artefato gerado antes do patch.

Quando não for possível atualizar imediatamente, o workaround oficial é impedir que valores controlados pelo atacante sejam renderizados no conteúdo, nos atributos ou nos estilos do SVG pelo ImageResponse em Node.js. É uma contenção temporária que exige conhecer todo o fluxo de dados; atualizar continua sendo a saída mais segura.

O que validar depois do patch

  • confirme que produção está executando Next.js 16.3.6 ou uma versão posterior corrigida;
  • gere novamente imagens de Open Graph com textos longos, caracteres especiais e valores vazios;
  • verifique rotas que definem explicitamente runtime = 'nodejs';
  • revise caches de imagem e CDNs para não confundir uma resposta antiga com uma regressão do patch;
  • mantenha a validação de entrada, mesmo depois da atualização, principalmente em geradores de imagem públicos.

Esta correção não é apenas uma troca preventiva de versão. Ela fecha um caminho em que uma falha de escaping, aparentemente limitada ao SVG, ganha outro impacto ao atravessar a cadeia de renderização no servidor. É um bom lembrete de que a gravidade de uma dependência também depende de onde e como sua saída é consumida.

Fontes