HEXACON Researchers Explain Firefox Promise Exploit Leading to Renderer Code Execution

· 46:14 · Watch on YouTube ↗

Summary

Tao Yan and Edouard Bochin explain a six-year-old Firefox Promise.allSettled flaw and its exploitation through garbage collection and type confusion. Their Firefox 138 demo disabled the sandbox because the exploit was renderer-only.

Key points

  • The researchers describe an out-of-bounds write in SpiderMonkey's Promise.allSettled implementation that they say had existed since its introduction in 2019.
  • Custom promise callbacks expose the results array to JavaScript; trimming that array and invoking a retained rejection callback leaves an internal index stale.
  • The initial write is constrained: the destination must contain undefined, and the written value is an internally created object reference.
  • The exploit uses major and minor garbage collection to arrange adjacent objects and turn the constrained write into a use-after-free and type confusion.
  • The researchers develop address-disclosure, fake-object and arbitrary memory read/write primitives, then use WebAssembly code and control-flow manipulation for renderer code execution.
  • The live demonstration used Firefox 138 with its sandbox disabled. After several failed attempts, the presenters reported success; the talk did not demonstrate a sandbox escape or disclose patch status.

Article Details

Topics
  • [01:00] JavaScript promises and their browser attack surface
  • [03:14] SpiderMonkey Promise.allSettled internals and the six-year-old bug
  • [12:26] Finding recurring promise implementation errors across browsers
  • [14:29] Triggering the constrained out-of-bounds write
  • [18:34] Garbage collection, heap layout and conversion to exploitation primitives
  • [37:39] WebAssembly-based renderer code execution
  • [43:12] Firefox 138 live demonstration with the sandbox disabled

People

Products

Related Articles