Otimizar uma imagem virou execução remota de código: o alerta crítico do Next.js
O que foi publicado
Em 25 de agosto de 2026, o time do Next.js antecipou a release de segurança do mês e publicou as versões 16.3.3 e 15.5.24, corrigindo duas vulnerabilidades de severidade crítica. O pacote tem por volta de 45 milhões de downloads semanais — a escala aqui não é de nicho.
Falha 1 — otimização de imagem AVIF. Uma vulnerabilidade na biblioteca libheif, usada por baixo do sharp, pode levar a execução remota de código sem autenticação quando o Next.js otimiza uma imagem AVIF controlada pelo atacante. Como a correção real depende de propagação upstream, a versão corrigida desativa a otimização de AVIF até lá.
Falha 2 — CVE-2026-75604. Path traversal que leva a execução remota de código sem autenticação em servidores Next.js hospedados em Windows, afetando aplicações com Pages Router e com App Router sem Cache Components.
Se você roda Next.js em produção, a ação de hoje é atualizar. O resto deste texto é sobre por que isso vai acontecer de novo.
Ninguém no seu time escreveu um decodificador de AVIF
Vale seguir o caminho da falha: você escreveu <Image src=... />. O Next.js otimiza. Para otimizar, chama o sharp. O sharp delega a decodificação de AVIF para a libheif. A libheif é código C processando um formato de container de mídia complexo.
Três níveis abaixo da linha que você escreveu, existe um parser binário lendo bytes que vieram de fora. Essa é a categoria mais fértil de execução remota de código que existe — não por incompetência de quem mantém essas bibliotecas, mas porque decodificar formato de mídia arbitrário é intrinsecamente hostil: milhares de campos, tamanhos declarados pelo próprio arquivo, aritmética de ponteiro e uma superfície gigante.
A conclusão desconfortável: sua superfície de ataque é o que suas dependências fazem, não o que você escreveu. Auditar o próprio código não encontra isso. Nenhum code review pega uma falha que está três node_modules de distância.
Ação imediata, em ordem
- Atualize para 16.3.3 ou 15.5.24, conforme a sua linha. É a correção, não um paliativo.
- Se não der para subir hoje, desative a otimização de AVIF e restrinja
remotePatternsnonext.configpara os domínios que você controla — nada de curinga. - Se você roda em Windows, trate como prioridade máxima: a segunda falha é específica desse ambiente e não exige autenticação.
- Rode um inventário, não só um patch.
npm ls sharpenpm ls libheifmostram onde mais isso entrou no projeto — muitas vezes há uma segunda cópia via outra dependência.
O padrão que resolve a próxima, não só esta
Corrigir a versão fecha esta porta. O trabalho de arquitetura é reduzir o que acontece quando a próxima abrir:
- Nunca otimize imagem de origem arbitrária. Se o usuário pode apontar a URL, ele escolhe os bytes que o seu parser vai comer. Lista de domínios permitidos é a defesa mais barata que existe.
- Tire processamento de mídia do processo do servidor. Container separado, usuário sem privilégio, sem acesso à rede interna, limite de memória e timeout. Se o parser cair, cai sozinho e não leva as suas credenciais junto.
- Prefira o CDN ou um serviço dedicado para redimensionar e converter imagem. Você troca a responsabilidade por um contrato de fornecedor — e esse fornecedor patcheia antes de você.
- Monitore o que o seu servidor web pode fazer. Um processo de renderização não deveria conseguir abrir socket para qualquer lugar nem ler fora do diretório da aplicação. Quando isso é verdade, RCE vira incidente contido em vez de comprometimento total.
A parte que dói
Esse não é um problema do Next.js. É um problema de qualquer stack moderno: você importa capacidade e importa junto a superfície de ataque de tudo que aquela capacidade usa por dentro.
A pergunta que separa um time preparado de um time com sorte não é "minhas dependências têm vulnerabilidade?" — todas têm, o tempo todo. É "quando uma delas for explorada, o que exatamente o atacante consegue alcançar a partir dali?". Quem sabe responder isso atualiza com calma. Quem não sabe descobre no pior dia possível.
Posts relacionados
Você não ficou 4x mais rápido. Ficou 10x mais inseguro — e agora existem os dados
Quase metade do código gerado por IA nasce com uma falha do OWASP Top 10. Os commits saem...
Worm no npm: quando instalar uma dependência vira incidente de segurança
Em 4 de agosto de 2026, a conta de um mantenedor foi comprometida e um worm que rouba cred...
CI/CD para quem tem um time pequeno: um pipeline que cabe numa tarde
CI/CD não precisa de um time de plataforma dedicado. Precisa de um pipeline mínimo, honest...