Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-14321 — Proof-of-concept che dimostra una vulnerabilità Use-After-Free in RTCEncodedFrameBase di Firefox tramite WebRTC Encoded Transforms, consentendo corruzione dell'heap e potenziale RCE. | Kitploit
Strumenti/GitHubGitHub/h3raklez/cve-2025-14321
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebCTFPaper e RicercaApprendimento e FormazioneBinary Exploitation
GitHubh3raklez/cve-2025-14321

CVE-2025-14321

Proof-of-concept che dimostra una vulnerabilità Use-After-Free in RTCEncodedFrameBase di Firefox tramite WebRTC Encoded Transforms, consentendo corruzione dell'heap e potenziale RCE.

Vedi Repository
26 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-14321 Proof of Concept

Descrizione

PoC per una vulnerabilità Use-After-Free (UAF) nel componente RTCEncodedFrameBase di Firefox, sfruttabile tramite l’API WebRTC Encoded Transforms.

CVE-2025-14321: Il distruttore di RTCEncodedFrameBase non chiama DetachArrayBuffer() quando libera la memoria nativa del frame. Di conseguenza, gli ArrayBuffer di JavaScript mantengono puntatori a memoria già liberata (dangling pointers), consentendo lettura e scrittura arbitraria sull’heap del processo content di Firefox.

Questo PoC è stato testato su Mozilla Firefox 145.0.1 e Windows 10.

Causa radice

Firefox espone i frame video/audio codificati come ArrayBuffer di JavaScript tramite NewArrayBufferWithUserOwnedContents(). Quando il frame nativo (C++) viene distrutto, la memoria backing dell’ArrayBuffer viene liberata, ma l’ArrayBuffer in JavaScript non viene scollegato (detach). Ciò viola l’invarianza di ownership e genera un dangling pointer.

Codice vulnerabile (dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp):

root@kitploit:~
// ❌ Il distruttore non scollega l'ArrayBuffer
RTCEncodedFrameBase::~RTCEncodedFrameBase() = default;

Codice corretto:

root@kitploit:~
// ✅ Scollega l'ArrayBuffer prima di liberare la memoria nativa
RTCEncodedFrameBase::~RTCEncodedFrameBase() {
  DetachData();
}

Versioni affette

  • Firefox < 146
  • Firefox ESR < 140.6

Primitive ottenute

  • READ: new Uint8Array(buf) legge dati da memoria riallocata ad altri oggetti dell’heap
  • WRITE: new Uint8Array(buf).fill(0x41) corrompe oggetti adiacenti nell’heap (vtables, strutture DOM, ecc.)

Queste primitive sono sufficienti per dimostrare la vulnerabilità. Con un opportuno heap shaping, potrebbero essere escalate a esecuzione remota di codice (RCE).

Prerequisiti

Configurazione di 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

⚠ Riavviare Firefox dopo aver modificato le preferenze.

Permesso della fotocamera (opzionale)

Il PoC tenta di richiedere l’accesso alla fotocamera tramite getUserMedia(). Ciò non è obbligatorio se le preferenze ICE sono configurate correttamente. La sua funzione è promuovere Firefox alla modalità RFC IP handling mode 1, che garantisce la generazione di candidati ICE host in scenari in cui le preferenze da sole non sono sufficienti.

In pratica:

  • VM senza fotocamera: getUserMedia() fallisce silenziosamente (NotFoundError) senza mostrare prompt. ICE connette comunque grazie a media.peerconnection.ice.loopback = true.
  • Sistema con fotocamera: Firefox mostra il prompt dei permessi. Accettarlo garantisce ICE mode 1.
  • Fotocamera negata: Il PoC usa una canvas come fallback. ICE può connettere se le preferenze sono impostate correttamente.

Server HTTP

I Web Worker non funzionano da file://. Servire tramite HTTP:

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

Aprire in Firefox vulnerabile: http://localhost:8080/poc-cve-2025-14321.html

Flusso dell’exploit

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

Il PoC tenta di richiedere l’accesso alla fotocamera. Se la fotocamera è disponibile e l’utente accetta, Firefox promuove la sessione a RFC IP handling mode 1. Se getUserMedia() fallisce (VM senza fotocamera, permesso negato), il PoC prosegue con una canvas come sorgente di frame — ICE connette comunque se media.peerconnection.ice.loopback = true è attivo.

2. Canvas animata come sorgente di frame

Viene creata una <canvas> 320×240 con animazione a 30fps tramite captureStream(30). Questo genera frame video codificati in modo prevedibile. Una volta che ICE connette e se è stata usata la fotocamera, il PoC sostituisce il track della fotocamera con quello della canvas tramite replaceTrack() e rilascia la fotocamera.

3. Connessione WebRTC loopback

Vengono create due RTCPeerConnection locali (pc1 ↔ pc2) con negoziazione SDP standard e trickle ICE. I candidati vengono scambiati direttamente tra i peer.

4. Transform Worker (RTCRtpScriptTransform)

Viene assegnato un RTCRtpScriptTransform al sender di pc1 prima della negoziazione SDP. Il worker intercetta ogni frame codificato della pipeline di invio.

5. Conservazione degli ArrayBuffer (200 frame)

Per ciascuno dei primi 200 frame, il worker:

  1. Estrae frame.data (ArrayBuffer che punta alla memoria nativa)
  2. Salva il riferimento in un array (leaks[])
  3. Scrive un pattern noto: new Uint8Array(buf).fill(0x41)
  4. Non reinvia il frame → il wrapper nativo viene distrutto → la memoria viene liberata

Non reinviando il frame, il GC distrugge il wrapper C++ e libera la memoria nativa. Ma l’ArrayBuffer di JavaScript mantiene il puntatore — dangling pointer creato.

6. Rilevamento di UAF

A partire dal frame 201, ogni 3 frame il worker:

  1. Legge i primi 16 byte di ogni buffer conservato
  2. Se un qualche byte differisce da 0x41, l’allocatore ha riutilizzato quella memoria → UAF confermato
  3. Riscrive 0x41 sul buffer (write primitive su heap altrui)

Questo ciclo di lettura/scrittura su memoria liberata causa una corruzione progressiva dell’heap fino al crash della scheda di Firefox (equivalente al SIGSEGV riportato nell’advisory).

Risultati attesi

Versione vulnerabile (Firefox < 146)

root@kitploit:~
[0.4s] ✓ Track iniziale: canvas (fallback)
[0.4s] ✓ CONNESSIONE ICE STABILITA!
[0.5s] ▶▶▶ PRIMO FRAME ENCODED RICEVUTO! ◀◀◀
[0.5s] Leak #0: 1219B → 41414141414141414141414141414141
[2.7s] Leak #49: 1497B → 41414141414141414141414141414141
[9.8s] Leak #199: 1870B → 41414141414141414141414141414141
[9.9s] 200 ArrayBuffer mantenuti → memoria nativa GIÀ liberata
[9.9s] → Dangling pointer attivi, in attesa di riutilizzo…
       [ CRASH DELLA SCHEDA — heap corruption]

Nota: Se la fotocamera è disponibile e il permesso è concesso, il log mostrerà ✓ getUserMedia concesso — ICE modo 1 attivo e poi ✓ Track sostituito: fotocamera → canvas dopo la connessione ICE. Nelle VM senza fotocamera, il PoC usa direttamente la canvas senza prompt.

Il crash della scheda conferma la corruzione dell’heap: la scrittura di 0x41 su memoria riallocata ad altri oggetti (vtables, nodi DOM) causa un accesso a memoria non valido nel processo content.

Versione corretta (Firefox ≥ 146)

root@kitploit:~
✓ Buffer[0] scollegato correttamente — fix attivo
ArrayBuffer scollegato — versione corretta ✓

DetachData() nel distruttore invalida l’ArrayBuffer prima di liberare la memoria nativa, eliminando il dangling pointer.

Struttura del progetto

root@kitploit:~
├── poc-cve-2025-14321.html            # PoC funzionante (codice sorgente leggibile)
└── README.md                          # Questo file

La correzione

Mozilla ha corretto la vulnerabilità in Firefox 146 aggiungendo DetachData() in tutti i distruttori e percorsi di teardown di RTCEncodedFrameBase.

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

Mitigazione

  • Aggiornare Firefox alla versione 146 o superiore
  • Aggiornare Firefox ESR alla versione 140.6 o superiore

Disclaimer

⚠ SOLO A SCOPO EDUCATIVO E DI RICERCA

Questo PoC dimostra l’esistenza della vulnerabilità fino al punto di corruzione dell’heap (crash). Non implementa heap shaping, bypass di ASLR o tecniche di hijack necessarie per l’esecuzione di codice. Il suo scopo è esclusivamente la verifica e la comprensione del CVE in ambienti controllati.

Riferimenti

  • 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

Crediti

  • Scoperto da: Igor Morgernstern, AISLE Research Team
  • Data di segnalazione: 2025-10-06
  • Data della correzione: 2025-11-19
  • Data di pubblicazione: 2025-12-09
Scarica lo strumento