
Reproduktion einer WebAssembly-Use-after-Free-Schwachstelle in Mozillas JavaScript-Engine, die eine deterministische Race-Condition demonstriert und einen kontrollierten Proof-of-Concept bereitstellt.
Eine nicht ausgefeilte Reproduktion. Die Grundlage erforderte hier etwas Feinarbeit.
Mozilla beschreibt dieses Problem als WebAssembly-Use-after-Free. Der öffentliche Fix
9823b5c86ffa hält das exakt abfangende wasm::Code in JitActivation am Leben.
Der Test führt einen Cross-Instance-Tail-Call mit falscher Signatur aus. Ein Debugger-Unwind-Hook löscht die letzte Zielreferenz der Tabelle und erzwingt einen verkleinernden GC, während die Engine den Trap behandelt. Vor dem Eintritt in den Tail-Call ruft Wasm einen normalen JavaScript-Import auf, der den Marker ausgibt.
9b564f641a42: Status 139 (SIGSEGV).9823b5c86ffa: gibt PASS: trap handled after target release aus und
beendet sich mit 0.poc-controlled.js erweitert die Shared-Stub-Allokation des Ziels um 144
Importe. Seine veraltete Throw-Fortsetzung landet innerhalb einer von vier ausführbaren
Seiten. Ein vorab erstellter Lazy-Tier-Träger bettet 6.000 eindeutige SIMD-Konstanten in ein
vier Seiten umfassendes optimiertes Codesegment ein. Während des Exception-Unwinds gibt der GC das
Ziel frei und synchrones Tiering nutzt dieses Loch erneut. Eine Syscall-Startbahn alle 64
Bytes gibt UAF NACHOS aus und ruft exit_group(0) auf.
Ausführen:
js --wasm-compiler=baseline+ion \
--setpref=wasm_lazy_tiering_level=9 \
--setpref=wasm_lazy_tiering_synchronous=true \
--more-compartments poc-controlled.js
Beobachtete Zuverlässigkeit auf der selbst gebauten Linux-x86-64-Pre-Fix-Shell: 3/3
Läufe gaben den Marker aus und beendeten sich mit 0. Die passende gefixte Shell wirft den normalen
RuntimeError: indirect call signature mismatch und gibt ihn nicht aus.
Der kontrollierte PoC verwendet nur Shell-spezifische Debugger- und GC-Funktionen, um den Wettlauf deterministisch zu machen. Er etabliert native Kontrolle in jsshell, nicht die Auslieferung von einer Webseite oder einen Escape aus der Firefox-Content-Sandbox.
Mit einer äquivalenten Debug-Shell ausführen:
js --wasm-compiler=baseline --more-compartments poc.js
Dies ist ein Nachweis einer Lebensdauer-Regression, kein Memory-Primitive oder Exploit. Der Marker erscheint auf beiden Builds und resultiert nicht aus dem UAF.