Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
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.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2024-4947-PoC — Prova di concetto educativa per CVE-2024-4947, una confusione di tipo in V8 Maglev, che dimostra una catena completa dall'innesco fino all'esecuzione di codice arbitrario su una build d8 senza sandbox. | Kitploit
Strumenti/GitHubGitHub/l1m3syc/cve-2024-4947-poc
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPaper e RicercaApprendimento e FormazioneBinary Exploitation
GitHubl1m3syc/cve-2024-4947-poc

CVE-2024-4947-PoC

Prova di concetto educativa per CVE-2024-4947, una confusione di tipo in V8 Maglev, che dimostra una catena completa dall'innesco fino all'esecuzione di codice arbitrario su una build d8 senza sandbox.

Vedi Repository
151 mese 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-2024-4947 — Type Confusion in V8 Maglev → RCE completo (d8 PoC)

Una catena di sfruttamento completa e autonoma per CVE-2024-4947 (type confusion in V8 Maglev), dal trigger iniziale di type confusion fino all'esecuzione arbitraria di codice. Il PoC viene eseguito su una build non sandboxed di d8 e stampa CVE-2024-4947-PWNED su stdout come prova dell'esecuzione di codice.

⚠️ Questo è un PoC di ricerca / didattico per una vulnerabilità pubblica e corretta. Ha come bersaglio una build di sviluppo della shell V8 (d8 --allow-natives-syntax) — non un vero browser Chrome. Vedi Disclaimer.


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

Lo shellcode da 52 byte è write(1, "CVE-2024-4947-PWNED\n", 20); exit_group(0).


La vulnerabilità

CVE-2024-4947 è una type confusion nel compilatore JIT Maglev di V8, corretta in Chrome 125.0.6422.60 (commit b3c01ac1e60a). È stata sfruttata in the wild dal gruppo APT Lazarus. Quando Maglev compila uno store su un oggetto module namespace (JSModuleNamespace), usa un AccessInfo errato — lo store viene compilato come un semplice mov [[obj + 4], rax] che scrive un valore controllato nel campo map di un oggetto adiacente invece di passare dal normale percorso di store delle proprietà.

Lo sfruttamento procede come segue:

  1. Corrompendo la map di un oggetto in una fake map NAME_DICTIONARY_TYPE (0xB2), che cambia dove V8 memorizza l'hash dell'oggetto.
  2. Attivando new WeakRef(...) così che la scrittura dell'hash finisca nello slot di lunghezza di un oggetto adiacente → accesso out-of-bounds.

Da qui si ottiene il classico toolkit di V8: addrOf/fakeObj, quindi lettura/scrittura arbitraria in-cage.


Catena dell'exploit

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

Passo dopo passo

#FaseDettaglio
1Triggeropt() scrive una fake map tramite lo store confuso; new WeakRef(m) porta corruptArray.length fuori dai limiti.
2MotoreaddrOf/fakeObj; corrompe la lunghezza di doubleArray → R/W arbitrario di 4 byte a qualsiasi indirizzo caged allineato a 4.
3Bridge a 64 bitWasmTrustedInstanceData.memory0_start (+0x18) è un puntatore grezzo a 64 bit usato dal wasm compilato i32.load8_u/i32.store8 senza bounds check software (fuori intervallo colpisce una guard page → SIGSEGV → trap wasm). Reindirizzalo a qualsiasi indirizzo + imposta memory0_size (+0x20) enorme → R/W arbitrario a 64 bit.
4Trova il code spacejump_table_start (+0x38) è un puntatore grezzo a 64 bit nello external code space (fuori dalla cage da 4 GB).
5Scrivi lo shellcodeIn questa build la regione della jump table è RWX (V8 applica patch alle voci a runtime): scrivi lo shellcode da 52 byte nello slack a jt+0x100.
6Ripunta lo slotLo slot della jump table di func0 è un e9 <rel32> di 5 byte (target = slot + 5 + rel32). Imposta rel32 → jt+0x100.
7Trigger del dispatchinst.exports.r(0) → JSToWasmWrapper effettua il dispatch tramite lo slot 0 → lo shellcode viene eseguito.

Differenze rispetto ad altri PoC pubblici

La maggior parte dei PoC pubblici per CVE-2024-4947 ha come bersaglio la d8 sandboxed o un vero renderer Chrome (v8_enable_sandbox=true) e si ferma alla primitiva di type confusion / OOB. Questo PoC ha come bersaglio una d8 no-sandbox e porta la catena fino all'esecuzione di codice. Le differenze che contano:

DimensioneApproccio comune dei PoC pubbliciQuesto PoC
Build bersagliod8 sandboxed / renderer Chromev8_enable_sandbox=false d8 — i trusted pointer sono diretti, external code space attivo
Bridge R/W a 64 bitsovrascrittura di JSTypedArray.external_pointerQuel percorso crasha quando legge il code range (verificato empiricamente); si sovrascrive invece memory0_start e si usano load/store wasm grezzi
Percorso finale per l'esecuzione di codiceil code space è W^X → JIT-spray + redirect indirettola regione della jump table è RWX → scrittura diretta dello shellcode + patch dello slot e9 rel32
Formato slot jump tablei documenti assumono comunemente movabs rax, imm64; jmp rax (12 byte)misurato: e9 <rel32> di 5 byte, target = slot + 5 + rel32
Offset dei campilayout della build sandboxedno-sandbox WasmTrustedInstanceData: jump_table_start@+0x38, memory0_start@+0x18, memory0_size@+0x20; WasmInstanceObject.trusted_data@+0x0c
Uscita pulita—d8 è multi-thread: bisogna usare exit_group (231), non exit (60), altrimenti il processo si blocca

Vedi docs/walkthrough.md per l'analisi tecnica completa, inclusi i risultati empirici alla base di ogni riga.


Struttura del repository

.
├── 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

L'exploit importa Module.mjs (il vulnerabile oggetto module namespace) dalla propria directory, quindi tieni i due file insieme (o adatta il percorso import).


Build ed esecuzione

Requisiti

  • WSL2 (Ubuntu) o qualsiasi Linux con toolchain C/C++, git e circa 10 GB di spazio libero su disco
  • Google depot_tools (git clone https://chromium.googlesource.com/chromium/tools/depot_tools)
  • Sorgenti V8 alla revisione vulnerabile (vedi sotto)

Build della d8 vulnerabile

# 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.

Esecuzione

out.gn/x64.release_nosandbox/d8 --allow-natives-syntax --module exploit/exploit_rce.mjs

L'output atteso termina con:

CVE-2024-4947-PWNED

e il processo termina con stato 0.

Scarica lo strumento