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
Strumenti/GitHubGitHub/sneakynachos/cve-2026-2796-escape-wasm-by-using-wasm
Analisi delle VulnerabilitàExploitReverse EngineeringSicurezza WebBinary Exploitation
GitHubsneakynachos/cve-2026-2796-escape-wasm-by-using-wasm

CVE-2026-2796-escape-wasm-by-using-wasm

Catena di exploit PoC per CVE-2026-2796: fuga dalla sandbox WebAssembly di SpiderMonkey (confusione del tipo di firma -> R/W arbitrario -> RCE)

Vedi Repository
514 giorni 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-2026-2796 — Evasione dalla sandbox WebAssembly di SpiderMonkey

Catena di exploit proof-of-concept per CVE-2026-2796, una miscompilazione JIT / confusione di tipo nell'ottimizzazione delle importazioni WebAssembly di Mozilla SpiderMonkey (componente "JavaScript: WebAssembly"). Un modulo wasm appositamente creato ottiene lettura/scrittura arbitraria dell'intero processo host ed esecuzione arbitraria di codice nativo, evadendo dalla sandbox WebAssembly.

  • CVE: CVE-2026-2796 (CWE-843, confusione di tipo)
  • Versioni interessate: Firefox < 148, Thunderbird < 148 (e integrazioni dello stesso motore)
  • Corretto in: Firefox 148 / Thunderbird 148, 2026-02-24
  • Bug upstream: Mozilla Bug 2013165 (MFSA-2026-13)
  • Commit di correzione: e2acef67 ("Bug 2013165 - Fix import optimization")

Causa principale

Quando un modulo wasm importa una funzione JS, SpiderMonkey applica un'ottimizzazione in MaybeOptimizeFunctionCallBind (js/src/wasm/WasmInstance.cpp) che rimuove il wrapping delle importazioni della forma Function.prototype.call.bind(fn) e memorizza direttamente come chiamabile dell'importazione. Non verificava però se il valore associato fosse esso stesso una :

fn
funzione esportata da wasm
root@kitploit:~
+  if (boundThis.toObject().is<JSFunction>() &&
+      boundThis.toObject().as<JSFunction>().isWasm()) {
+    return nullptr;
+  }

In assenza di questo controllo, l'importazione viene trattata come una funzione originariamente wasm: il wrapper JS — e con esso il controllo della firma — viene saltato. Una funzione wasm può quindi essere invocata tramite un tipo di importazione dichiarato che non corrisponde al suo tipo reale. I valori passano attraverso i registri invariati; cambia solo la loro interpretazione (ad es. un i64 controllato dall'attaccante viene usato come puntatore GC (ref $t), e viceversa).

Catena dell'exploit (poc/)

FileFaseRisultato
poc-crash.jsConfusione di firmai64.const 0xDEADBEEF dereferenziato come puntatore funcref → SIGSEGV a 0xdeadbf2f
poc-addrof.jsaddrOf + fakeobjConfusione in entrambe le direzioni (i64 ↔ (ref $t)) → falso WasmArrayObject (numElements_ @+16, data_ @+24, elementi inline @+40) → R/W arbitrario in qualsiasi punto del processo
poc-recon.jsRicognizione del layoutpuntatore nativo di JSFunction @+0x20 → leak della base del binario; puntatore typeDef di WasmFuncRef @+0x40
poc-forge.jsFlusso di controlloil funcref forgato supera il controllo di tipo di call_ref; destinazione della chiamata caricata da [funcref+0x38]
poc-rce.jsEsecuzione di codicefuncref forgato → system("touch /tmp/CVE-2026-2796-PWNED") tramite system() divulgato (base del binario + voce GOT @ base+0x11d47b0)

La primitiva di confusione si ottiene esattamente come nel test di regressione di Mozilla stesso (js/src/jit-test/tests/wasm/regress/bug2013165.js): importare Function.prototype.call.bind(wasmExport) in un secondo modulo la cui dichiarazione di importazione ha una firma diversa, quindi ref.func + call_ref.

Compilazione della shell vulnerabile

root@kitploit:~
# Firefox source @ 2fbc0748c460b38fc95407a3f14c41d12fb12026 (2026-01-14,
# Firefox 148 nightly — predates the fix). Any pre-148 revision works.
cd js/src
../../configure --enable-debug --enable-optimize --without-intl-api \
  --enable-project=js   # objdir e.g. js/src/_obj
cd _obj && make -j8
# binary: dist/bin/js   (reports "JavaScript-C149.0a1")

Esecuzione

root@kitploit:~
JS=/path/to/dist/bin/js
$JS poc/poc-crash.js     # SIGSEGV at 0xdeadbf2f
$JS poc/poc-addrof.js    # prints [+] arbitrary read OK / write OK
$JS poc/poc-recon.js     # dumps JSFunction / WasmFuncRef memory
$JS poc/poc-forge.js     # crashes with PC = planted canary
rm -f /tmp/CVE-2026-2796-PWNED
$JS poc/poc-rce.js       # creates /tmp/CVE-2026-2796-PWNED via system()

Su una build patchata (Firefox ≥ 148), poc-crash.js invece lancia TypeError: bad type — il controllo della firma viene ripristinato.

Note sulla portabilità

Gli offset si riferiscono a macOS arm64 (shell js, questa esatta revisione/flags di build): WasmArrayObject { +16 numElements, +24 data_, +40 inline data }, JSFunction nativo @ +0x20, WasmFuncRef { +0x40 typeDef, +0x38 call target }. Sono validati empiricamente a runtime dagli autotest dei PoC; altre build/architetture richiedono una nuova derivazione (il PoC di ricognizione automatizza gran parte del processo). Nessun PAC sui binari arm64 (non-arm64e); le regioni JIT non sono scrivibili al momento della chiamata, quindi la catena dirotta una destinazione di chiamata esistente invece di iniettare codice.

Catena completa: evasione dalla sandbox

Vedi docs/full-escape.md per l'analisi della fase 2: l'evasione dalla sandbox del sistema operativo partendo dall'esecuzione di codice nel renderer tramite CVE-2026-2768 (Bug 2014101, scrittura OOB IndexedDB nel processo padre) — il "secondo bug" di una compromissione completa di Firefox. L'albero vulnerabile usato qui precede anche quella correzione.

Ambito / limiti onesti

Questo consente di evadere dalla sandbox del motore wasm (confinamento della memoria lineare / GC) e produce esecuzione di codice nativo nel processo corrente. In un attacco reale a un browser, questo atterra all'interno del content process di Firefox; evadere dalla sandbox del sistema operativo (il "secondo bug": confusione IPC o exploit del kernel) è un problema separato e non fa parte di questo PoC.

Mitigazioni

  • Aggiornare a Firefox / Thunderbird ≥ 148.
  • Difesa in profondità: javascript.options.wasm=false blocca il vettore d'innesco.

Riferimenti

  • MFSA-2026-13
  • NVD: CVE-2026-2796
  • Correzione: https://github.com/mozilla-firefox/firefox/commit/e2acef6711967949cd0825869034165383c482e1
  • Test: https://github.com/mozilla-firefox/firefox/commit/0605ac40b002d576688190a5b9921b8dcd1b6b96

Esclusione di responsabilità

Solo per ricerca sulla sicurezza, istruzione e test difensivi. La vulnerabilità è stata corretta nelle versioni attuali di Firefox/Thunderbird. Non utilizzare contro sistemi che non possiedi o per i quali non hai un'autorizzazione esplicita ai test.

Scarica lo strumento