Skip to content

Build Independently confirmed2 publishers 2 min read Published

VUSec's BTR reuses a branch-target entry that outlives the JIT code it pointed to

VUSec disclosed Branch Target Reuse, a Spectre-v2 attack on JIT engines whose Linux exploit leaks memory at 8 bytes a second. It bypassed every enabled mitigation, and the kernel's fix had already shipped in July.

The Engineer · Build desk

Send a correction

What happened

  • Modern processors restore architectural coherence after self-modifying code but leave the stale indirect-branch predictions that once pointed at it sitting in the predictor.
  • Inside a JIT, that stale target outlives the freed code and gets reused when the cache is repopulated, so the CPU speculatively runs whatever used to live at that offset.
  • VUSec analyzed Linux cBPF, Oracle's GraalVM and Firefox's SpiderMonkey, and built two full exploits against the Linux kernel.
  • The Linux demo pulls the root password hash out of a running su process by walking the kernel task list and then the page tables.
  • Every processor the team evaluated was affected, including Intel, AMD and Arm hardware.

Why it matters

  • What it limits constraint The primitive lives in the branch predictor, not the executable code, so JIT defenses that rewrite or mask the generated code do not stop it.
  • Who has to decide decision Each affected project chose its own mitigation, so a shop running these JITs has to adopt and benchmark three unrelated changes, one per runtime.
  • Who's exposed exposure Until Firefox finishes deploying site isolation, a malicious page's JavaScript shares an address space with other tabs, putting their data within reach.

The kernel's answer shipped before the public write-up. BTR was privately disclosed in July [9], and Phoronix reports the Linux kernel then landed patches enabling an Indirect Branch Predictor Barrier flush on every BPF JIT allocation, plus hardening against JIT spraying [10]. Those changes were mainlined and backported to stable kernels, so the public disclosure arrives with no new kernel mitigation attached [10]. IBPB flushes the branch predictor. The stale target lives there, and software hardening inside the JIT never reaches it [2].

That gap is clearest in cBPF. The bpf_jit_harden option blinds immediate constants to block direct JIT spraying, and it is off by default [14]. Even so, VUSec got past it by encoding instructions in jump offsets, the first time that spraying technique has been applied to cBPF [14]. GraalVM goes further: its strictest sandbox masks every guest memory access so the code cannot reach outside its arena [7]. BTR gets past that too, because the speculative jump lands on the obsolete entry point before any of those checks run [3].

The working exploit is slow but sufficient. The cBPF leak runs at 8 bytes per second, and VUSec's point is that careful pointer chasing needs only a small amount of leaked data to reach the secret [5]. SpiderMonkey is earlier work. The proof of concept speculatively jumps into the WebAssembly literal pool, and on Intel the team confirmed that branch-target buffer entries survive a full deallocate-and-reallocate cycle, at an estimated tens of bytes per second; a real browser exploit still needs more work [16].

By Phoronix's account, the three affected projects took three paths. The kernel took the IBPB barrier [10]. Oracle is randomizing GraalVM's JIT code-cache locations so a freed chunk and its replacement are less likely to share an address [11]. Mozilla evaluated IBPB for SpiderMonkey and decided against it, prioritizing site isolation instead [17]. The chip vendors are pointing operators to existing mitigation mechanisms [12]. None of this material puts a performance number on any of these options.

What to watch

  • Whether VUSec's SpiderMonkey proof of concept becomes a working end-to-end browser exploit.
  • Published performance figures for the IBPB-on-JIT-allocation flush and GraalVM code-cache randomization.
  • Whether JIT runtimes beyond the three VUSec analyzed adopt IBPB flushes or code-cache randomization.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence70
Adoption55
Hype gap+20
Incentives40
Confidence68
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    Branch Target Reuse (BTR) is a new Spectre-v2 attack targeting just-in-time compilers, affecting JIT engines in web browsers, language runtimes and the operating system kernel across multiple CPU vendors.

  2. [2]

    Modern CPUs restore architectural code coherence after self-modification but do not necessarily invalidate stale indirect branch prediction entries (branch targets).

  3. [3]

    In JIT engines the stale branch targets can outlive the original code and be reused when the code cache is repopulated, yielding a speculative execute-after-free primitive that hijacks control flow to code at obsolete offsets and bypasses software hardening.

Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.

Add to ChatGPTAdd to Claude

Sources

2 independent publishers whose own reporting we read for this story.

  1. phoronix.com

    1 article · September 29, 2026

    Branch Target Reuse, BTR: New Spectre V2 Attack Targeting JIT Compilers
  2. vusec.net

    1 article · September 25, 2026

    Branch Target Reuse: Spectre-v2 Attacks in JIT Engines

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Loading related stories