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-29943-but-with-wasm — CVE-2024-29943, ma con wasm | Kitploit
Strumenti/GitHubGitHub/sneakynachos/cve-2024-29943-but-with-wasm
ExploitShellcodeSicurezza WebBinary Exploitation
GitHubsneakynachos/cve-2024-29943-but-with-wasm

CVE-2024-29943-but-with-wasm

CVE-2024-29943, ma con wasm

Vedi Repository

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 →
1141 mese faNon ancora revisionato
Condividi

CVE-2024-29943, ma con wasm

Una catena di exploit end-to-end per CVE-2024-29943 che ottiene l'esecuzione arbitraria di codice nativo contrabbandando shellcode nella pagina di codice JIT WebAssembly di SpiderMonkey come immediati f64.const — niente ROP, niente VirtualProtect, niente toolchain esterna.

Verificato funzionante contro la shell SpiderMonkey della nightly mozilla-central del 2024-03-20 (JavaScript-C126.0a1, linux x86-64, pre-fix): la catena arriva a completamento e il payload viene eseguito (write(1, "PWNED by wasm!\n"); exit(0)).

La vulnerabilità

CVE-2024-29943 è un bug sec-critical di range-analysis di IonMonkey usato al Pwn2Own 2024 da Manfred Paul, che colpisce Firefox < 124.0.1 (Bugzilla 1886849, CVSS 9.8).

MObjectKeysLength::computeRange restituiva un intervallo intero errato per Object.keys(x).length dopo che Object.keys era stato reso elidibile (regressione introdotta dal bug 1845728). L'analisi dei range di Ion concludeva che un contatore di ciclo non potesse diventare negativo ed eliminava i controlli sui limiti che erano ancora raggiungibili, producendo una lettura/scrittura out-of-bounds su un .

Uint8Array

Catena

root@kitploit:~
Object.keys range-analysis bug -> OOB r/w on Uint8Array
  -> corrupt adjacent ArrayBuffer -> addrof / fakeobj / arbitrary R/W
    -> instantiate hand-built WASM module (shellcode as f64.const immediates)
      -> WasmInstanceObject -> wasm::Instance -> wasm::Code -> CodeTier
         -> ModuleSegment.bytes_ (the JIT code page, RX)
           -> scan page for marker constant
             -> overwrite FuncExport.eagerInterpEntryOffset_ (plain heap)
                with the shellcode's offset within the page
               -> call the export through the interpreter -> payload runs

Due dettagli ci sono costati un segfault ciascuno per essere appresi, quindi li annotiamo:

  1. La pagina di codice è RX, non RWX. SpiderMonkey applica mprotect al segmento di codice wasm dopo la compilazione; modificare le istruzioni sul posto causa un fault. Il redirect viene effettuato sovrascrivendo eagerInterpEntryOffset_ nel FuncExport residente nell'heap — l'interprete calcola codeBase + offset e salta lì.
  2. La chiamata trigger deve provenire dall'interprete. Il codice di livello top è caldo a causa del ciclo di primitive-training e viene compilato da Warp, che chiama gli export wasm attraverso il percorso JIT-entry e non guarda mai l'offset dell'interp entry. Chiamare da una funzione fredda forza il percorso dell'interprete.

La tecnica dello shellcode nella pagina WASM-JIT proviene da WasmBlazeFox; questo repo dimostra che la tecnica si compone con un bug moderno di un browser in produzione al posto del bug di training originale del 2018.

File

  • poc.js — trigger minimale per il bug di range-analysis.
  • exploit.js — catena completa: primitive + stadio shellcode WASM JIT.
  • gen_wasm.py — assembla il modulo WASM incorporando lo shellcode e verifica il round-trip della costante. python3 gen_wasm.py mysc.bin per usare un payload diverso. Il payload predefinito è una prova puramente a syscall write(1, "PWNED by wasm!\n"); exit(0) che non richiede risoluzione di simboli (quindi funziona anche nella jsshell nuda). Per il classico payload system("gnome-calculator") basato su libxul, vedi WasmBlazeFox ex6.
  • test.gdb — breakpoint e helper ptype /o per derivare gli offset dell'object-model su una data build.

Riproduzione

  1. Ottieni una shell vulnerabile: compila gecko-dev @ afbdf6822c9e9f9b6d44b9ea6904cb10878126b1 (Firefox ~124, pre-124.0.1), Linux x86-64 — oppure prendi una nightly jsshell pre-fix, ad es. archive.mozilla.org/pub/firefox/nightly/2024/03/2024-03-20-21-16-35-mozilla-central/jsshell-linux-x86_64.zip.
  2. Esegui:
    root@kitploit:~
    LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
        --spectre-mitigations=off poc.js      # trigger only (segfault)
    LD_LIBRARY_PATH=<jsshell dir> ./js --no-threads --ion-offthread-compile=off \
        --spectre-mitigations=off exploit.js  # full chain ("PWNED by wasm!")
    

--spectre-mitigations=off è richiesto perché l'eliminazione dei controlli sui limiti si basa sul fatto che il mascheramento degli indici sia disabilitato (vedi i commenti su Bugzilla).

Note

  • L'export wasm viene chiamato esattamente una volta prima del dirottamento, così la funzione rimane nel tier baseline, dove gli immediati f64.const vengono emessi inline nel segmento di codice. La compilazione Ion potrebbe fare constant-folding su di essi.
  • Gli offset (WASM_INSTANCE_OFF_CODE = 0xa8, MetadataTier.funcExports + 448, FuncExport + 8, ecc.) sono stati derivati dagli header del commit vulnerabile e confermati contro la nightly jsshell del 2024-03-20; ri-derivali con test.gdb per altre build.

Riferimenti

  • https://bugzilla.mozilla.org/show_bug.cgi?id=1886849
  • https://nvd.nist.gov/vuln/detail/CVE-2024-29943
  • https://www.mozilla.org/security/advisories/mfsa2024-15/
  • https://github.com/bjrjk/CVE-2024-29943
  • https://doar-e.github.io/blog/2018/11/19/introduction-to-spidermonkey-exploitation/
Scarica lo strumento