Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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-2025-14321 — Prova de conceito demonstrando uma vulnerabilidade de Use-After-Free no RTCEncodedFrameBase do Firefox por meio de WebRTC Encoded Transforms, possibilitando corrupção de heap e potencial RCE. | Kitploit
Ferramentas/GitHubGitHub/h3raklez/cve-2025-14321
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebCTFPapers e PesquisaAprendizado e EducaçãoExploração de Binários
GitHubh3raklez/cve-2025-14321

CVE-2025-14321

Prova de conceito demonstrando uma vulnerabilidade de Use-After-Free no RTCEncodedFrameBase do Firefox por meio de WebRTC Encoded Transforms, possibilitando corrupção de heap e potencial RCE.

Ver Repositório
22há 7 mesesAinda 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-2025-14321 Prova de Conceito

Descrição

PoC para uma vulnerabilidade Use-After-Free (UAF) no componente RTCEncodedFrameBase do Firefox, explorável através da API WebRTC Encoded Transforms.

CVE-2025-14321: O destrutor de RTCEncodedFrameBase não chama DetachArrayBuffer() ao liberar a memória nativa do frame. Como resultado, os ArrayBuffers de JavaScript retêm ponteiros para memória já liberada (dangling pointers), permitindo leitura e escrita arbitrária sobre o heap do processo content do Firefox.

Este PoC foi testado no Mozilla Firefox 145.0.1 e Windows 10.

Causa raiz

O Firefox expõe os frames de vídeo/áudio codificados como ArrayBuffers de JavaScript através de NewArrayBufferWithUserOwnedContents(). Quando o frame nativo (C++) é destruído, a memória backing do ArrayBuffer é liberada, mas o ArrayBuffer em JavaScript não é desvinculado (detach). Isso viola a invariante de ownership e gera um dangling pointer.

Código vulnerável (dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp):

root@kitploit:~
// ❌ Destructor no desvincula el ArrayBuffer
RTCEncodedFrameBase::~RTCEncodedFrameBase() = default;

Código corrigido:

root@kitploit:~
// ✅ Desvincula el ArrayBuffer antes de liberar memoria nativa
RTCEncodedFrameBase::~RTCEncodedFrameBase() {
  DetachData();
}

Versões afetadas

  • Firefox < 146
  • Firefox ESR < 140.6

Primitivas obtidas

  • READ: new Uint8Array(buf) lê dados de memória realocada para outros objetos do heap
  • WRITE: new Uint8Array(buf).fill(0x41) corrompe objetos adjacentes no heap (vtables, estruturas DOM, etc.)

Essas primitivas são suficientes para demonstrar a vulnerabilidade. Com heap shaping adicional, poderiam escalar para execução remota de código (RCE).

Pré-requisitos

Configuração do Firefox (about:config)

root@kitploit:~
media.peerconnection.scripttransform.enabled = true
media.peerconnection.ice.loopback             = true
media.peerconnection.ice.no_host              = false
media.peerconnection.ice.relay_only           = false
media.peerconnection.ice.proxy_only           = false

⚠ Reiniciar o Firefox após modificar as preferências.

Permissão de câmera (opcional)

O PoC tenta solicitar acesso à câmera via getUserMedia(). Isso não é obrigatório se as preferências de ICE estiverem configuradas corretamente. Sua função é promover o Firefox ao RFC IP handling mode 1, que garante a geração de candidatos ICE host em cenários onde as prefs por si só não são suficientes.

Na prática:

  • VM sem câmera: getUserMedia() falha silenciosamente (NotFoundError) sem mostrar prompt. ICE conecta mesmo assim graças a media.peerconnection.ice.loopback = true.
  • Sistema com câmera: Firefox mostra o prompt de permissões. Aceitá-lo assegura ICE mode 1.
  • Câmera negada: O PoC usa um canvas como fallback. ICE pode conectar se as prefs estiverem corretas.

Servidor HTTP

Os Web Workers não funcionam a partir de file://. Servir por HTTP:

root@kitploit:~
python3 -m http.server 8080

Abrir no Firefox vulnerável: http://localhost:8080/poc-cve-2025-14321.html

Fluxo do exploit

1. getUserMedia → ICE mode 1 (best-effort)

O PoC tenta solicitar acesso à câmera. Se houver câmera disponível e o usuário aceitar, Firefox promove a sessão para RFC IP handling mode 1. Se getUserMedia() falhar (VM sem câmera, permissão negada), o PoC continua com um canvas como fonte de frames — ICE conecta igualmente se media.peerconnection.ice.loopback = true estiver ativo.

2. Canvas animado como fonte de frames

Cria-se um <canvas> de 320×240 com animação a 30fps via captureStream(30). Isso gera frames de vídeo codificados de forma previsível. Uma vez que ICE conecta e a câmera foi usada, o PoC substitui o track da câmera pelo do canvas via replaceTrack() e libera a câmera.

3. Conexão WebRTC loopback

Criam-se duas RTCPeerConnection locais (pc1 ↔ pc2) com negociação SDP padrão e trickle ICE. Os candidatos são trocados diretamente entre peers.

4. Transform Worker (RTCRtpScriptTransform)

Atribui-se um RTCRtpScriptTransform ao sender de pc1 antes da negociação SDP. O worker intercepta cada frame codificado do pipeline de envio.

5. Retenção de ArrayBuffers (200 frames)

Para cada um dos primeiros 200 frames, o worker:

  1. Extrai frame.data (ArrayBuffer que aponta para memória nativa)
  2. Guarda a referência em um array (leaks[])
  3. Escreve um padrão conhecido: new Uint8Array(buf).fill(0x41)
  4. NÃO reenvia o frame → o wrapper nativo é destruído → a memória é liberada

Ao não reenviar, o GC destrói o wrapper C++ e libera a memória nativa. Mas o ArrayBuffer de JavaScript retém o ponteiro — dangling pointer criado.

6. Detecção de UAF

A partir do frame 201, a cada 3 frames o worker:

  1. Lê os primeiros 16 bytes de cada buffer retido
  2. Se algum byte diferir de 0x41, o allocator reutilizou essa memória → UAF confirmado
  3. Reescreve 0x41 sobre o buffer (write primitive sobre heap alheio)

Este ciclo de leitura/escrita sobre memória liberada causa corrupção progressiva do heap até que Firefox trava a aba (equivalente a SIGSEGV reportado no advisory).

Resultados esperados

Versão vulnerável (Firefox < 146)

root@kitploit:~
[0.4s] ✓ Track inicial: canvas (fallback)
[0.4s] ✓ ¡CONEXIÓN ICE ESTABLECIDA!
[0.5s] ▶▶▶ ¡PRIMER FRAME ENCODED RECIBIDO! ◀◀◀
[0.5s] Leak #0: 1219B → 41414141414141414141414141414141
[2.7s] Leak #49: 1497B → 41414141414141414141414141414141
[9.8s] Leak #199: 1870B → 41414141414141414141414141414141
[9.9s] 200 ArrayBuffers retenidos → memoria nativa YA liberada
[9.9s] → Dangling pointers activos, esperando reuso…
       [ CRASH DE PESTAÑA — heap corruption]

Nota: Se houver câmera disponível e a permissão for concedida, o log mostrará ✓ getUserMedia concedido — ICE modo 1 activo e depois ✓ Track reemplazado: cámara → canvas após a conexão ICE. Em VMs sem câmera, o PoC usa canvas diretamente sem prompt.

O travamento da aba confirma corrupção de heap: a escrita de 0x41 sobre memória realocada para outros objetos (vtables, nós DOM) causa um acesso inválido à memória no processo content.

Versão corrigida (Firefox ≥ 146)

root@kitploit:~
✓ Buffer[0] detached correctamente — fix activo
ArrayBuffer detached — versión parcheada ✓

O DetachData() no destrutor invalida o ArrayBuffer antes de liberar a memória nativa, eliminando o dangling pointer.

Estrutura do projeto

root@kitploit:~
├── poc-cve-2025-14321.html            # PoC funcional (código fuente legible)
└── README.md                          # Este archivo

A correção

A Mozilla corrigiu a vulnerabilidade no Firefox 146 adicionando DetachData() em todos os destrutores e teardown paths de RTCEncodedFrameBase.

Commit: https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

Mitigação

  • Atualizar Firefox para a versão 146 ou superior
  • Atualizar Firefox ESR para a versão 140.6 ou superior

Aviso Legal

⚠ APENAS PARA FINS EDUCATIVOS E DE PESQUISA

Este PoC demonstra a existência da vulnerabilidade até o ponto de corrupção de heap (crash). Não implementa heap shaping, bypass de ASLR, nem técnicas de hijack necessárias para execução de código. Seu propósito é exclusivamente a verificação e compreensão do CVE em ambientes controlados.

Referências

  • CVE: CVE-2025-14321
  • Blog post: https://aisle.com/blog/firefox-webrtc-encoded-transforms-uaf-via-undetached-arraybuffer-cve-2025-14321
  • Advisory: MFSA 2025-92 · Bug 1992760
  • Mozilla commit: https://hg-edge.mozilla.org/mozilla-central/rev/1051067f6e83

Créditos

  • Descoberto por: Igor Morgernstern, AISLE Research Team
  • Data do reporte: 2025-10-06
  • Data da correção: 2025-11-19
  • Data de publicação: 2025-12-09
Baixar ferramenta