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-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
4 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-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

root@kitploit:~
$ ./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

root@kitploit:~
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

root@kitploit:~
.
├── 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

root@kitploit:~
# 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

root@kitploit:~
out.gn/x64.release_nosandbox/d8 --allow-natives-syntax --module exploit/exploit_rce.mjs

L'output atteso termina con:

root@kitploit:~
CVE-2024-4947-PWNED

e il processo termina con stato 0.

--allow-natives-syntax è necessario per le chiamate runtime %PrepareFunctionForOptimization / %OptimizeMaglevOnNextCall. Questo è il motivo per cui il PoC non può girare in un browser reale: è una proof-of-concept nella shell d8 by design.


Tecniche riutilizzabili

I pezzi davvero riutilizzabili (e non ovvi) per la ricerca sullo sfruttamento di V8:

  1. Bridge R/W a 64 bit tramite redirect della memoria wasm — quando il redirect di JSTypedArray.external_pointer fallisce su una regione bersaglio, reindirizza invece WasmTrustedInstanceData.memory0_start. I load/store di byte wasm compilati non hanno bounds check software; il signal trap handler converte solo i fault su guard page, quindi le regioni mappate ma non scrivibili crashano invece di generare una trap.
  2. Sondaggio della scrivibilità della jump table — la protezione della regione della jump table wasm varia a seconda della build. Sondala byte per byte con try/catch; una trap wasm "out of bounds" indica una guard page (non mappata), un vero SIGSEGV indica mappata-ma-RX.
  3. Formato slot e9 rel32 — salto relativo di 5 byte, non la forma movabs ipotizzata da molti write-up. Verificato tramite il disassembly di --print-wasm-code.

Disclaimer

Questo repository è fornito solo per ricerca educativa e di sicurezza difensiva. Dimostra lo sfruttamento di una vulnerabilità corretta contro una build di V8 solo di sviluppo. Non è un'arma contro Chrome moderno, non bypassa la sandbox di V8 e richiede il flag non predefinito --allow-natives-syntax. L'autore non è responsabile di qualsiasi uso improprio.

Crediti / derivazione

La primitiva trigger (fake map NAME_DICTIONARY_TYPE + scrittura dell'hash via WeakRef) segue le analisi pubbliche dell'exploit Lazarus in-the-wild pubblicate dopo la patch — inclusi i write-up di Google ed Exodus Intelligence su CVE-2024-4947. Le fasi successive (sondaggio della jump table, bridge, patch dello slot) sono state derivate empiricamente contro questa specifica build durante questo lavoro. Il concetto di fallback JIT-spray si basa su tecniche pubbliche di exploit di V8 (ad esempio il pattern make_array di CVE-2024-5830).

Licenza

MIT — vedi LICENSE.

Scarica lo strumento