Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-94545-nextjs-og-poc — Laboratório Docker isolado e scanner Python não destrutivo que reproduz o CVE-2026-94545, a injeção de SVG no ImageResponse do next/og do Next.js, com controles vulnerável vs corrigido e evidência PNG em nível de pixel. | Kitploit
Ferramentas/GitHubGitHub/hassham1/cve-2026-94545-nextjs-og-poc
Scanners de VulnerabilidadesAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebLabs e Prática
GitHubhassham1/cve-2026-94545-nextjs-og-poc

CVE-2026-94545-nextjs-og-poc

Laboratório Docker isolado e scanner Python não destrutivo que reproduz o CVE-2026-94545, a injeção de SVG no ImageResponse do next/og do Next.js, com controles vulnerável vs corrigido e evidência PNG em nível de pixel.

Ver Repositório
há 1 diaAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-94545 - Injeção de SVG no next/og ImageResponse do Next.js (GHSA-vcvr-r3jv-pc5j)

Material de pesquisa de segurança para reproduzir e validar o CVE-2026-94545, a injeção de serialização de SVG no ImageResponse do Next.js (upstream: Satori GHSA-wx4j-mvgx-mqwp), num laboratório isolado, apenas em loopback.

  • Afetado: Next.js >=16.2.0 <16.3.6 (apenas ImageResponse do Node.js)
  • Corrigido: 16.3.6 (reforço do Satori, commit 26a52aff); 15.5.26 inclui reforço relacionado, 15.x não é afetado pelo problema de RCE
  • Severidade: Crítica (advisory); escape inadequado do Satori -> o atacante controla o documento SVG incorporado; a RCE segundo o advisory depende do parser de SVG a jusante
  • Upstream: vercel/satori GHSA-wx4j-mvgx-mqwp

Use apenas em sistemas que possui ou que está explicitamente autorizado a testar. O scanner é não destrutivo: renderiza uma imagem e conta pixels. Nada é escrito, armazenado ou executado no alvo.

Veredicto

Estado: comprovado no laboratório fornecido.

Contra o padrão exato de rota do advisory (valor do atacante em <svg><title>{value}</title></svg>):

root@kitploit:~
next 16.3.5 (vulnerável): rect vermelho 500x150 injetado renderizado no PNG
                          (75.000 pixels #FF0000 medidos na resposta)
next 16.3.6 (corrigido) : valor escapado, 0 pixels vermelhos
satori 0.25.0 (vuln)    : payload presente em bruto na string SVG serializada
satori 0.33.5 (corrigido): payload escapado para &lt;/title&gt;

Isto prova a primitiva de injeção de ponta a ponta (serializador -> SVG incorporado -> saída rasterizada). Não demonstra execução remota de código: o advisory associa a RCE ao parser de SVG a jusante, cujos detalhes vulneráveis não são públicos no momento da escrita. Não é reivindicada leitura de ficheiros, SSRF ou execução de código.

Causa raiz (verificada contra o commit de correção)

O Satori serializa nós <svg> com translateSVGNodeToSVGString() (src/handler/preprocess.ts), que interpolava na saída XML sem escape:

  1. Nós de texto devolvidos via String(node) - sem escape (agora escapeXMLText).
  2. Valores de atributos interpolados em bruto dentro de aspas - " quebra o contexto.
  3. Nomes de atributos interpolados em bruto - espaço/aspas injeta novos atributos.
  4. Valores de style interpolados em bruto.
  5. O codificador de data-URL de SVG incorporado não codificava &, pelo que entidades XML internas sobreviviam ao parse do SVG externo.
  6. expand.ts passava propriedades de estilo internas (prefixo _) para estilos serializados - agora rejeitadas.

A correção (satori@26a52aff) encaminha tudo através de um buildXMLString() de reforço que escapa valores e valida nomes XML. Este laboratório verifica tudo isso comportamentalmente; o pedido exato e a evidência de pixels estão em poc/.

Início rápido

Requisitos: Docker com Compose v2, Python 3.10+ no host (para o scanner), acesso de rede ao npm na primeira execução.

root@kitploit:~
./lab verify

Constrói a aplicação vulnerável (next/og vendorizado de [email protected]), exige que o rect marcador seja renderizado na resposta HTTP, depois a aplicação corrigida ([email protected]) e exige a sua ausência.

Evidência esperada

Controlo vulnerável:

root@kitploit:~
[*] #FF0000 pixels: 75000 (threshold 10000)
[!!!] INJECTION CONFIRMED: the attacker value escaped <title> and
      became a rendered SVG element in the generated image.
RESULT: VULNERABLE CONTROL CONFIRMED

Controlo corrigido:

root@kitploit:~
[*] #FF0000 pixels: 0 (threshold 10000)
[=] no injection observed
RESULT: PATCHED CONTROL CONFIRMED

Ciclo de vida manual do laboratório

root@kitploit:~
./lab start vulnerable   # 16.3.5 app on http://127.0.0.1:9481/og
./lab test               # assert injection renders
./lab start patched      # 16.3.6 app
./lab test               # assert absence
./lab status
./lab reset

Execute o scanner manualmente (loopback por omissão; alvos externos autorizados precisam da substituição explícita):

root@kitploit:~
python3 poc/scan.py http://127.0.0.1:9481/og
python3 poc/scan.py https://host.example/og --param value \
  --allow-authorized-non-loopback [--insecure]

Como funciona a deteção (e porque é segura)

O payload é XML equilibrado transportando um <rect> 500x150 vermelho puro. Num endpoint vulnerável o valor escapa de <title> e o rect torna-se um elemento real no documento SVG incorporado; o scanner conta pixels exatos #FF0000 no PNG devolvido (75.000 esperados; limiar 10.000). Num endpoint corrigido o valor é texto escapado e nenhum vermelho é renderizado. A sonda não altera nada no alvo: um pedido GET, uma renderização de imagem.

Note que o portador é deliberadamente um <rect>, não texto: texto dentro do SVG incorporado não tem fonte carregável no renderizador e seria invisível mesmo quando injetado.

Porque não existe um template nuclei

A prova desta vulnerabilidade é o conteúdo de pixels de um raster renderizado, e os matchers do nuclei não conseguem descodificar PNGs. Um template de diferencial de tamanho foi construído e rejeitado: numa aplicação corrigida o payload escapado ainda é renderizado (como texto literal inerte), pelo que os tamanhos benigno-vs-payload diferem também em sistemas corrigidos, e a separação entre deltas vulneráveis e corrigidos é ruído de compressão específico da aplicação. Enviar um matcher que dispara em sistemas corrigidos é pior do que não enviar nenhum. Use poc/scan.py; avalia a imagem de resposta exatamente.

Versões afetadas e testadas

VersãoAvaliação
Next.js 16.3.5 (@vercel/og vendorizado)Injeção reproduzida de ponta a ponta sobre HTTP
Next.js 16.3.6 (@vercel/og vendorizado)Controlo negativo corrigido reproduzido
satori 0.25.0 (npm)Injeção em bruto no SVG serializado (nível de código)
satori 0.33.5 (npm, 22 Set 2026)Escapado (nível de código)
Next.js 16.2.0-16.3.4Afetado segundo o advisory; não testado individualmente
Next.js 15.xNão afetado pelo problema de RCE segundo o blog do fornecedor

Estrutura do repositório

root@kitploit:~
.
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── app/
│   └── server.mjs        # advisory route pattern over loopback HTTP
└── poc/
    └── scan.py           # non-destructive scanner (Python stdlib: urllib + zlib)

Não versionado: assets/ (tarballs next empacotados pelo npm + bundles extraídos), node_modules/, .lab-state.

Limites de validação

AfirmaçãoEstado
Injeção de serialização de SVG no satori < correçãoProvado (código + comportamento)
Renderização de ponta a ponta de markup injetado via next/og 16.3.5Provado
Controlo negativo corrigido (16.3.6 / satori 0.33.5)Provado
Portadores de atributo/estilo (mesma causa raiz)Causa raiz confirmada no diff de correção; portador de texto provado
SSRF / leitura de ficheiros via referências de recursos injetadasNão testado
Execução remota de códigoNão reivindicado (depende de detalhes não divulgados do parser a jusante)

Referências

  • GHSA-vcvr-r3jv-pc5j (Next.js)
  • GHSA-wx4j-mvgx-mqwp (Satori)
  • Next.js security update, 22 Set 2026
  • Satori fix commit 26a52aff
  • Netlify customer advisory (CVE-2026-94545)

Limite de segurança

Execute este repositório apenas em sistemas que possui ou que está explicitamente autorizado a testar. O driver do laboratório recusa variantes que não sejam vulnerable/patched, o scanner recusa alvos que não sejam loopback a menos que --allow-authorized-non-loopback seja fornecido, e a porta do Compose está vinculada a 127.0.0.1.

Consulte SECURITY.md para o tratamento de divulgação. Este repositório não inclui alvos de produção, dados de clientes, tokens de acesso ou evidência de sistemas reais.

Licença

MIT - consulte LICENSE.

Baixar ferramenta