Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-2796-escape-wasm-by-using-wasm — Cadena de exploits PoC para CVE-2026-2796: escape del sandbox de WebAssembly en SpiderMonkey (confusión de tipos de firma -> R/W arbitraria -> RCE) | Kitploit
Herramientas/GitHubGitHub/sneakynachos/cve-2026-2796-escape-wasm-by-using-wasm
Análisis de VulnerabilidadesExplotaciónIngeniería InversaSeguridad WebExplotación de Binarios
GitHubsneakynachos/cve-2026-2796-escape-wasm-by-using-wasm

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

Cadena de exploits PoC para CVE-2026-2796: escape del sandbox de WebAssembly en SpiderMonkey (confusión de tipos de firma -> R/W arbitraria -> RCE)

Ver Repositorio
51hace 4 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-2796 — Escape de la sandbox de WebAssembly de SpiderMonkey

Cadena de exploits de prueba de concepto para CVE-2026-2796, una mala compilación JIT / confusión de tipos en la optimización de importación WebAssembly de Mozilla SpiderMonkey (componente "JavaScript: WebAssembly"). Un módulo wasm manipulado consigue lectura/escritura arbitraria de todo el proceso anfitrión y ejecución arbitraria de código nativo, escapando de la sandbox de WebAssembly.

  • CVE: CVE-2026-2796 (CWE-843, confusión de tipos)
  • Afectados: Firefox < 148, Thunderbird < 148 (y embebidos del mismo motor)
  • Corregido en: Firefox 148 / Thunderbird 148, 2026-02-24
  • Bug upstream: Mozilla Bug 2013165 (MFSA-2026-13)
  • Commit de corrección: e2acef67 ("Bug 2013165 - Fix import optimization")

Causa raíz

Cuando un módulo wasm importa una función JS, SpiderMonkey aplica una optimización en MaybeOptimizeFunctionCallBind (js/src/wasm/WasmInstance.cpp) que desenvuelve importaciones de la forma Function.prototype.call.bind(fn) y almacena directamente como invocable de la importación. No comprobaba si el valor vinculado es en sí mismo una :

fn
función exportada de wasm
root@kitploit:~
+  if (boundThis.toObject().is<JSFunction>() &&
+      boundThis.toObject().as<JSFunction>().isWasm()) {
+    return nullptr;
+  }

Sin esa comprobación, la importación se trata como una función originalmente-wasm: se omite el wrapper JS y, con él, la comprobación de firma. Por tanto, una función wasm puede invocarse a través de un tipo de importación declarado que no coincide con su tipo real. Los valores pasan sin cambios por los registros; solo cambia su interpretación (p. ej., un i64 controlado por el atacante se usa como puntero GC (ref $t), y viceversa).

Cadena de exploits (poc/)

ArchivoEtapaResultado
poc-crash.jsConfusión de firmai64.const 0xDEADBEEF desreferenciado como puntero funcref → SIGSEGV en 0xdeadbf2f
poc-addrof.jsaddrOf + fakeobjConfusión en ambas direcciones (i64 ↔ (ref $t)) → WasmArrayObject falso (numElements_ @+16, data_ @+24, elementos en línea @+40) → lectura/escritura arbitraria en cualquier parte del proceso
poc-recon.jsReconocimiento de diseñoPuntero nativo de JSFunction @+0x20 → fuga de la base del binario; puntero typeDef de WasmFuncRef @+0x40
poc-forge.jsFlujo de controlfuncref falsificado pasa la comprobación de tipo call_ref; el destino de llamada se carga desde [funcref+0x38]
poc-rce.jsEjecución de códigofuncref falsificado → system("touch /tmp/CVE-2026-2796-PWNED") mediante system() filtrado (base del binario + entrada GOT @ base+0x11d47b0)

La primitiva de confusión se obtiene exactamente igual que en la prueba de regresión de Mozilla (js/src/jit-test/tests/wasm/regress/bug2013165.js): importar Function.prototype.call.bind(wasmExport) en un segundo módulo cuya declaración de importación tiene una firma distinta, y luego ref.func + call_ref.

Compilación del shell vulnerable

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")

Ejecución

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()

En una compilación parcheada (Firefox ≥ 148), poc-crash.js en su lugar lanza TypeError: bad type — la comprobación de firma se restaura.

Notas de portabilidad

Los desplazamientos son para macOS arm64 (shell js, esta revisión exacta y flags de compilación): WasmArrayObject { +16 numElements, +24 data_, +40 inline data }, JSFunction native @ +0x20, WasmFuncRef { +0x40 typeDef, +0x38 call target }. Se validan empíricamente en tiempo de ejecución mediante las autopruebas de los PoCs; otras compilaciones/arquitecturas requieren re-derivación (el PoC de reconocimiento automatiza la mayor parte). Sin PAC en binarios arm64 (no arm64e); las regiones JIT no son escribibles en el momento de la llamada, por lo que la cadena secuestra un destino de llamada existente en lugar de inyectar código.

Cadena completa: escape de la sandbox

Consulta docs/full-escape.md para el análisis de la etapa 2: escapar de la sandbox del SO desde la ejecución de código del renderer mediante CVE-2026-2768 (Bug 2014101, escritura OOB de IndexedDB en el proceso padre) — el "segundo bug" de un compromiso completo de Firefox. El árbol vulnerable utilizado aquí es anterior a esa corrección también.

Alcance / limitaciones honestas

Esto escapa de la sandbox del motor wasm (confinamiento de memoria lineal / GC) y proporciona ejecución de código nativo en el proceso actual. En un ataque real a un navegador, esto aterriza dentro del proceso de contenido de Firefox; escapar de la sandbox del SO (el "segundo bug": confusión de IPC o exploit del kernel) es un problema aparte y no forma parte de este PoC.

Mitigaciones

  • Actualiza a Firefox / Thunderbird ≥ 148.
  • Defensa en profundidad: javascript.options.wasm=false bloquea el vector de activación.

Referencias

  • MFSA-2026-13
  • NVD: CVE-2026-2796
  • Corrección: https://github.com/mozilla-firefox/firefox/commit/e2acef6711967949cd0825869034165383c482e1
  • Pruebas: https://github.com/mozilla-firefox/firefox/commit/0605ac40b002d576688190a5b9921b8dcd1b6b96

Aviso legal

Solo para investigación de seguridad, educación y pruebas defensivas. La vulnerabilidad está parcheada en las versiones actuales de Firefox/Thunderbird. No lo utilices contra sistemas que no poseas o para los que no tengas autorización explícita de prueba.

Descargar herramienta