Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2024-4947-PoC — Prueba de concepto educativa para CVE-2024-4947, una confusión de tipos de V8 Maglev, que demuestra una cadena completa desde el disparador hasta la ejecución arbitraria de código en una compilación d8 sin sandbox. | Kitploit
Herramientas/GitHubGitHub/l1m3syc/cve-2024-4947-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPapers e InvestigaciónAprendizaje y EducaciónExplotación de Binarios
GitHubl1m3syc/cve-2024-4947-poc

CVE-2024-4947-PoC

Prueba de concepto educativa para CVE-2024-4947, una confusión de tipos de V8 Maglev, que demuestra una cadena completa desde el disparador hasta la ejecución arbitraria de código en una compilación d8 sin sandbox.

Ver Repositorio
15hace 1 mesAú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-2024-4947 — Confusión de tipos en V8 Maglev → RCE completo (PoC d8)

Una cadena de explotación completa y autocontenida para CVE-2024-4947 (confusión de tipos en V8 Maglev), desde el disparador inicial de la confusión de tipos hasta la ejecución arbitraria de código. El PoC se ejecuta contra una compilación de d8 sin sandbox e imprime CVE-2024-4947-PWNED en stdout como prueba de la ejecución de código.

⚠️ Este es un PoC de investigación / educativo para una vulnerabilidad pública y parcheada. Apunta a una compilación de desarrollo del shell de V8 (d8 --allow-natives-syntax) — no a un navegador Chrome real. Ver Descargo de responsabilidad.


TL;DR

$ ./v8-build-nosandbox.sh            # build the vulnerable d8 (WSL2 Ubuntu, ~10-20 min)
$ d8 --allow-natives-syntax --module exploit/exploit_rce.mjs
[engine] dblData0=0004f470 class=0
[inst] addr=0x001dc274 trusted_data(tagged)=0x00202bd5 td=0x00202bd4
[jt]   jump_table_start = 0x00000967426cd000 (external code space)
[bridge] memory0_start -> jt, memory0_size -> huge  (r/w reach jt+off)
[slot0] before: e9 3b 08 00 00
[shell] wrote 52 bytes @ jt+0x0100: VERIFIED
CVE-2024-4947-PWNED
$ echo $?   # 0

El shellcode de 52 bytes es write(1, "CVE-2024-4947-PWNED\n", 20); exit_group(0).


La vulnerabilidad

CVE-2024-4947 es una confusión de tipos en el compilador JIT Maglev de V8, corregida en Chrome 125.0.6422.60 (commit b3c01ac1e60a). Fue explotada en ataques reales por el grupo APT Lazarus. Cuando Maglev compila un store a un objeto de espacio de nombres de módulo (JSModuleNamespace), usa una AccessInfo incorrecta: el store se compila como un mov [[obj + 4], rax] simple que escribe un valor controlado en el campo map de un objeto adyacente en lugar de pasar por la ruta correcta de almacenamiento de propiedades.

La explotación procede de la siguiente manera:

  1. Corrompiendo el map de un objeto a un map falso NAME_DICTIONARY_TYPE (0xB2), lo que cambia dónde almacena V8 el hash del objeto.
  2. Disparando new WeakRef(...) para que la escritura del hash caiga en el slot de longitud de un objeto adyacente → acceso fuera de límites.

Desde ahí obtenemos el kit clásico de V8: addrOf/fakeObj, y luego lectura/escritura arbitraria dentro de la cage.


Cadena de explotación

CVE-2024-4947 trigger (fake NAME_DICTIONARY map + WeakRef hash write)
  └─► OOB write ─► corrupt doubleArray length
        └─► in-cage 4/8-byte arbitrary R/W            (the "engine")
              └─► overwrite WasmTrustedInstanceData.memory0_start (+0x18)
                    & memory0_size (+0x20) → huge
                    └─► wasm load8_u / store8 = clean 64-bit R/W bridge
                          (no software bounds check in compiled code)
                          └─► read jump_table_start (+0x38) — external code space
                                └─► jump table region is RWX (this build)
                                      └─► write shellcode into the slack (jt+0x100)
                                            └─► repoint func0's `e9 rel32` slot at it
                                                  └─► call func0 → shellcode → RCE

Paso a paso

#EtapaDetalle
1Disparadoropt() escribe un map falso mediante el store confundido; new WeakRef(m) hace que corruptArray.length quede fuera de límites.
2MotoraddrOf/fakeObj; corromper la longitud de doubleArray → R/W arbitraria de 4 bytes en cualquier dirección de la cage alineada a 4.
3Puente de 64 bitsWasmTrustedInstanceData.memory0_start (+0x18) es un puntero directo de 64 bits usado por wasm compilado i32.load8_u/i32.store8 sin comprobación de límites por software (fuera de rango golpea una guard page → SIGSEGV → trampa wasm). Redirigirlo a cualquier dirección + establecer memory0_size (+0x20) enorme → R/W arbitraria de 64 bits.
4Encontrar el espacio de códigojump_table_start (+0x38) es un puntero directo de 64 bits hacia el espacio de código externo (fuera de la cage de 4 GB).
5Escribir shellcodeEn esta compilación la región de la jump table es RWX (V8 parchea las entradas en tiempo de ejecución): escribe el shellcode de 52 bytes en el hueco en jt+0x100.
6Reapuntar slotEl slot de func0 en la jump table es un e9 <rel32> de 5 bytes (destino = slot + 5 + rel32). Establecer rel32 → jt+0x100.
7Disparar dispatchinst.exports.r(0) → JSToWasmWrapper despacha vía el slot 0 → el shellcode se ejecuta.

Diferencias con otros PoCs públicos

La mayoría de los PoCs públicos de CVE-2024-4947 apuntan al d8 con sandbox o a un renderer real de Chrome (v8_enable_sandbox=true) y se detienen en la primitiva de confusión de tipos / OOB. Este PoC apunta a un d8 sin sandbox y lleva la cadena hasta la ejecución de código. Las diferencias que importan:

DimensiónEnfoque común de PoCs públicosEste PoC
Compilación objetivod8 con sandbox / renderer de Chromed8 con v8_enable_sandbox=false — los punteros de confianza son directos, el espacio de código externo está activado
Puente R/W de 64 bitssobrescribir JSTypedArray.external_pointerEse camino se estrella al leer el rango de código (verificado empíricamente); en su lugar sobrescribir memory0_start y usar load/store wasm directo
Ruta final de ejecución de códigoel espacio de código es W^X → JIT-spray + redirección indirectala región de la jump table es RWX → escritura directa de shellcode + parche del slot e9 rel32
Formato del slot de la jump tablela documentación suele asumir movabs rax, imm64; jmp rax (12 bytes)medido: e9 <rel32> de 5 bytes, destino = slot + 5 + rel32
Offset de camposlayout de compilación con sandboxWasmTrustedInstanceData sin sandbox: jump_table_start@+0x38, memory0_start@+0x18, memory0_size@+0x20; WasmInstanceObject.trusted_data@+0x0c
Salida limpia—d8 es multihilo: debe usarse exit_group (231), no exit (60), o el proceso se cuelga

Ver docs/walkthrough.md para el informe técnico completo, incluyendo los hallazgos empíricos detrás de cada fila.


Estructura del repositorio

.
├── exploit/
│   ├── Module.mjs           # module namespace object corrupted by the trigger
│   ├── exploit_rce.mjs      # the full chain (trigger → arbitrary R/W → RCE)
│   └── shellcode.S          # assembly source for the 52-byte payload
├── build/
│   └── v8-build-nosandbox.sh # build the vulnerable no-sandbox d8 from V8 source
└── docs/
    └── walkthrough.md       # deep dive: bridge mechanics, layouts, gotchas

El exploit importa Module.mjs (el objeto vulnerable de espacio de nombres de módulo) desde su propio directorio, así que mantén los dos archivos juntos (o ajusta la ruta de import).


Compilar y ejecutar

Requisitos

  • WSL2 (Ubuntu) o cualquier Linux con toolchain de C/C++, git y ~10 GB de disco libre
  • Google depot_tools (git clone https://chromium.googlesource.com/chromium/tools/depot_tools)
  • Código fuente de V8 en la revisión vulnerable (ver abajo)

Compilar el d8 vulnerable

# 1. fetch V8 at the vulnerable tag (12.4.254.16 is the pre-fix release)
export PATH="$HOME/depot_tools:$PATH"
cd ~/v8w && fetch v8 && cd v8
git checkout 12.4.254.16          # or the commit just before b3c01ac1e60a

# 2. first build a normal release d8 (needed to seed args.gn), then:
./v8-build-nosandbox.sh           # copies args.gn and appends v8_enable_sandbox = false

v8-build-nosandbox.sh usa ninja -C out.gn/x64.release_nosandbox -j6 d8.

Ejecutar

Descargar herramienta