Cloudflare Workers Spectre attack leaked a JWT at 12 bit/s: the 2026 DyPrIs failure

Cloudflare's 19 August 2026 Spectre revisit leaked a JWT at 12 bit/s from a co-located Worker. DyPrIs missed it for two specific reasons.

Read time
14 min
Word count
2.2K
Sections
10
FAQs
8
Share
Cloudflare Workers Spectre attack: 12 bit/s JWT leak from a co-located isolate, 2026
Cloudflare's 19 August 2026 Spectre revisit leaked a JWT at up to 12 bit/s in production.
On this page · 10 sections
  1. The vendor and the paper describe different severities
  2. How the leak was actually built
  3. Why the detector did not fire
  4. The keep-alive primitive is still documented
  5. What actually stands between tenants now
  6. Who this affects, and how to tell if that is you
  7. What is still unknown
  8. FAQ
  9. How eCorpIT can help
  10. References

Summary. On 19 August 2026 Cloudflare published a remote Spectre attack that leaked a JWT from a co-located Worker in its own production environment at up to 12 bit/s with more than 99% accuracy. The academic paper behind it, submitted to arXiv on 17 August 2026, puts the accuracy at 99.16% and describes the previous state of the art as 2 bit/min. That earlier figure comes from Cloudflare's own 2021 work, which measured 120 bit/h and shipped Dynamic Process Isolation (DyPrIs) as the fix. The 2021 paper claimed a 0.61% false-positive rate and said DyPrIs "statistically provides the same security guarantees as strict process isolation". Five years later, an author of that paper helped break it. Cloudflare says the attack is already mitigated in production through an improved DyPrIs, the V8 Sandbox and Memory Protection Keys deployed in the 25 September 2025 hardening work, and that it found no indicators of active exploitation over the last three years. There is no CVE, and Cloudflare asks customers on the $5/month Workers Paid plan to do nothing.

That last sentence is where the two documents stop agreeing.

The vendor and the paper describe different severities

Cloudflare's post, written by Martin Schwarzl and Albert Pedersen of Cloudflare, opens with a careful noun phrase: "Our research uncovered a limitation in the implementation of DyPrIs". The wording puts the fault in the implementation, not the design.

The arXiv abstract for "Remote-Timer-as-a-Service: Efficient Microarchitectural Leakage in the Cloud with Remote Timers" is blunter. It says "the production implementation of DyPrIs was insufficient", then goes further: "we show that freezing and coarsening timers in the Cloudflare Workers security model is insufficient". The first clause is about a build. The second is about the model Kenton Varda described on the Cloudflare blog on 29 July 2020, in which Date.now() has been frozen for the duration of an invocation since mid-2017 and multi-threading and shared memory are absent so a tenant cannot construct an implicit clock.

The paper also states the attack was "posing an immediate risk to customer data". The blog states no customer action. Both are defensible: the risk was real when the research ran in 2024 and early 2025, and the mitigations shipped before publication. But a reader who only sees the blog will conclude the timer model held and one detector had a bug. The paper says the timer model did not hold, because the timer no longer has to be local.

Question Cloudflare blog, 19 Aug 2026 arXiv paper, 17 Aug 2026
What failed "a limitation in the implementation of DyPrIs" "the production implementation of DyPrIs was insufficient"
Scope of the failure The detector The detector and the timer model
Risk to customers "no indicators of active exploitation over the last three years" "posing an immediate risk to customer data"
Leak rate quoted "up to 12 bit/s with an accuracy of more than 99%" "up to 12 bit/s at an accuracy of 99.16%"
Action asked of customers None stated None stated

How the leak was actually built

The chain matters more than the headline rate, because three of its five links are ordinary platform features.

Co-location came first, and it is the part that should worry anyone running untrusted code beside their own. Cloudflare writes that "invoking the victim script from the attacker script with a fetch("https://victim.example") will in most cases cause the scheduler to spin up an instance of the victim worker in the exact same process", and confirms machine placement by reading the fl value from the /cdn-cgi/trace endpoint. Cloudflare's own summary of the difficulty: "One might intuitively think this would be difficult, considering Cloudflare operates tens of thousands of edge servers, but this is in fact quite trivial on Cloudflare Workers."

The timer came second. Local high-resolution clocks are gone, so the researchers put the clock on the network: a WebSocket connection to an external server serving timestamps, with the Worker asking for a mark before and after an event. They report sub-millisecond resolution on the median with a handful of samples, even across topological distance.

Amplification came third, and it is borrowed. Stephen Röttger and Artur Janc of Google published the Tree-PLRU technique on the Google Security Blog on 12 March 2021, demonstrating 1 kB/s on Chrome 88 on an Intel Skylake CPU and 60 B/s with timers of 1 ms precision or worse. Their insight was that abusing tree-based pseudo-least-recently-used cache replacement amplifies the timing signal from a single read of secret data. Cloudflare applied the same idea, so a nanosecond-scale cache event survives a millisecond-scale clock.

Eviction was solved by refusing to do it. Rather than build an eviction set with a noisy timer, the attack allocates a pool larger than the last-level cache and picks a fresh random pair each round. For a 256 KB L2 cache, allocating 64 MB leaves at most a 1-in-256 chance that a given line is still resident.

Persistence came last, from Durable Objects. The runtime treats every incoming WebSocket message as an invocation that resets the CPU time and request limits, and an isolate is single-threaded, so keep-alives are only processed when the script yields. Yielding between compute bursts kept an isolate alive "from five to more than 20 hours". At the time of the research the limits were 30 seconds of CPU time and 1,000 subrequests per invocation.

With all five in place the order of extraction was: the isolate root address, then the vDSO region as a sanity check because it contains readable strings such as gettimeofday, then a JWT the researchers had planted in a victim Worker they controlled. The first byte was e, 0b01100101.

Why the detector did not fire

Cloudflare gives two reasons, and both are structural rather than accidental.

"Detection cannot happen only after a script finishes. A Durable Object or a WebSocket-heavy Worker can run long enough that post-execution isolation arrives too late." DyPrIs isolates a script after its invocation ends. The keep-alive trick keeps one invocation open for hours, so the leak completes first.

The second reason is subtler. DyPrIs normalises branch mispredictions by the number of iTLB accesses. The remote timer is one large I/O loop, and that WebSocket traffic inflates iTLB activity, so, in Cloudflare's words, "the normalized ratio drops below the detection threshold, so the attack looks like an ordinary I/O-heavy Worker". The evasion is not noise. The signal the detector uses to suppress false positives is generated by the attack itself.

Cloudflare's fix is to treat long-lived executions and I/O-heavy workloads as first-class security cases, and it says it is "currently investigating" whether remote timing behaviour could become an extra dimension of DyPrIs. That second item has not shipped.

The keep-alive primitive is still documented

This is the part a platform team can act on. The mitigations are Cloudflare's to deploy, but the resource behaviour that gave the attack a 20-hour window is still current documented behaviour, and it has the same effect on your own runaway or hostile code.

The Durable Objects limits page, last updated 1 June 2026, states it plainly: "Each incoming HTTP request or WebSocket message resets the remaining available CPU time to 30 seconds." The Workers limits page, last updated 28 July 2026, shows wall time for an incoming HTTP request and for Durable Objects RPC/HTTP as Unlimited, subrequests at 10,000 per invocation on the Paid plan, and CPU time raisable from the 30-second default to 5 minutes with cpu_ms: 300000. Cloudflare's pricing page, last updated 7 July 2026, bills CPU time at $0.02 per additional million CPU milliseconds above 30 million included per month.

Control Value today Where it is documented Why it matters here
CPU time per invocation 30 s default, 5 min max (Paid) Workers limits, 28 Jul 2026 The ceiling a keep-alive resets
WebSocket message Resets CPU time to 30 s Durable Objects limits, 1 Jun 2026 Turns one invocation into an open-ended session
Wall time, DO RPC/HTTP Unlimited Workers limits, 28 Jul 2026 No clock forces the isolate to end
Subrequests per invocation 10,000 (Paid), 50 (Free) Workers limits, 28 Jul 2026 Budget for co-location probing
Memory per isolate 128 MB Workers limits, 28 Jul 2026 Bounds the eviction pool
CPU time billing $0.02 per additional million CPU ms Workers pricing, 7 Jul 2026 A long-lived isolate is a cost signal

If you run Durable Objects behind WebSockets, that table is also your bill. A session that never ends is a session you never see terminate in metrics. Our engineering read is unchanged from the last time we looked at Cloudflare Workers and Vercel Functions cost: the interesting number in an edge platform is rarely the request price, it is what the platform lets a single invocation hold open.

What actually stands between tenants now

Three mitigations, and Cloudflare hedges two of them itself.

Improved DyPrIs closes the two blind spots above. The V8 Sandbox limits transient access to 64-bit pointers, which kills the specific gadget used here: under pointer compression most V8 objects use 32-bit compressed pointers, and TypedArray was one of the few exceptions still storing a raw 64-bit pointer to its backing store. Cloudflare's caveat is direct: "The V8 sandbox is not a complete Spectre mitigation. While the presented 64-bit leak gadget does not work anymore, there might be other Spectre variants or gadgets exploitable to achieve arbitrary out-of-bounds memory accesses."

Memory Protection Keys came from the 25 September 2025 hardening post by Erik Corry and Ketan Gupta. Each isolate gets a key protecting its V8 heap data. Their arithmetic: "There are up to 15 different keys available on a modern x64 CPU and a few are used for other purposes in V8, so we have about 12 to work with", which makes a cross-isolate read hit a hardware trap "in 92% of cases". The remaining 8% closes only in a specific arrangement, where keys are assigned by strict rotation so that no sandbox within 32 GiB shares a key. Cloudflare's own limit statement: "MPK is not a complete answer to remediate Spectre, but it strictly reduces the leakage surface." MPK also assumes the attacker cannot execute arbitrary machine code, because that would let them disable protection keys outright.

Varda's 2020 framing has aged well: "A dirty secret that the industry doesn't like to admit: no one has 'fixed' Spectre. Not even when using heavyweight virtual machines. Everyone is still vulnerable." What changed in 2026 is the cost of the attack, not its possibility.

Who this affects, and how to tell if that is you

You are directly exposed only if a third party runs code inside your process boundary. Three groups qualify.

Anyone building on Workers for Platforms, where customer scripts share your account's runtime. Anyone running user-supplied JavaScript in a shared V8 host, including agent sandboxes that execute model-generated code. And anyone whose threat model assumed language-level isolation was equivalent to process isolation because a 2021 paper said so.

If none of that is you, the honest answer is that this changes nothing operationally on Cloudflare. The mitigations are deployed, the isolation boundary is the provider's to defend, and there is no patch on your side. What it should change is a design assumption: a sandbox that cannot be escaped in software can still be read through the hardware, and "we removed the timer" is not a durable defence once the tenant can open a socket. That reasoning belongs in the same review as your multicloud security posture and CSPM work, because tenancy boundaries are exactly the control that cloud posture tooling reports on but rarely tests. The same gap shows up when teams compare AWS Security Hub and Azure for multicloud CSPM: the tools grade configuration, not co-tenancy.

Practical checks, in order:

  1. Inventory every place third-party or model-generated code executes in a process you also use for secrets. Agent tooling is the fastest-growing instance of this.
  1. Stop treating a shared-process sandbox as a secret boundary. Secrets that a co-tenant could read given an arbitrary-read primitive belong behind a network call, not in the same heap.
  1. Rotate anything long-lived that sat in a Worker heap. A JWT is exactly what was demonstrated; short expiry is the cheapest control you own.
  1. Alarm on Durable Object sessions that hold an isolate open for hours. The behaviour is legitimate, which is the point, and the same pattern shows up in Durable Objects production work with the Cloudflare Agents SDK.

What is still unknown

Cloudflare does not say how it determined that no exploitation occurred over three years, nor what telemetry or retention period supports that statement. It gives no CPU model for the tests, so the 256 KB L2 figure and the Tree-PLRU assumption are the only hardware detail on the record from the blog. It gives no deployment date for the V8 Sandbox and no percentage of the fleet running MPK, and it notes that not all hardware in the fleet had been upgraded as of September 2025. The remote-timing dimension of DyPrIs is still described as under investigation. None of that is unusual for a coordinated disclosure, but none of it should be filled in from a summary article either.

FAQ

How eCorpIT can help

eCorpIT designs and reviews multi-tenant architectures on edge and serverless platforms, including the boundary questions this research makes concrete: where untrusted code runs, what shares a process with a secret, and how long a session may hold a runtime open. We are ISO 27001:2022 certified and CMMI Level 5 appraised, and our senior engineering teams run architecture reviews aligned with the tenancy-isolation requirements your customers audit you against. Talk to us via /contact-us/ if you run customer code beside your own.

References

  1. A revisit of remote Spectre attacks on Cloudflare Workers — Cloudflare, 19 August 2026.
  1. Remote-Timer-as-a-Service: Efficient Microarchitectural Leakage in the Cloud with Remote Timers — arXiv, submitted 17 August 2026.
  1. Dynamic Process Isolation — arXiv, submitted 10 October 2021.
  1. Spectre research with TU Graz — Cloudflare, 12 October 2021.
  1. Mitigating Spectre and other security threats: the Cloudflare Workers security model — Cloudflare, 29 July 2020.
  1. Safe in the sandbox: security hardening for Cloudflare Workers — Cloudflare, 25 September 2025.
  1. A Spectre proof-of-concept for a Spectre-proof web — Google Security Blog, 12 March 2021.
  1. Cloudflare Workers limits — Cloudflare Docs, last updated 28 July 2026.
  1. Durable Objects limits — Cloudflare Docs, last updated 1 June 2026.
  1. How Workers works — Cloudflare Docs, last updated 23 April 2026.
  1. Cloudflare Workers pricing — Cloudflare Docs, last updated 7 July 2026.

Last updated: 20 August 2026.

Frequently asked

Quick answers.

01 Was a real customer's data leaked from Cloudflare Workers?
No. Cloudflare states the demonstration ran against Workers it controlled, with a secret it had intentionally placed in the victim Worker. The company reports no indicators of active exploitation over the last three years. The paper still describes the underlying condition as an immediate risk to customer data before mitigation.
02 Is there a CVE for this Cloudflare Workers Spectre attack?
No CVE identifier appears in Cloudflare's 19 August 2026 post, and no advisory or severity rating is published with it. Cloudflare frames the work as internal reassessment rather than external disclosure. The mitigations were deployed before publication, so no customer patching step accompanies the announcement.
03 How much faster is this than the 2021 Cloudflare Spectre attack?
The 2021 work leaked 120 bit/h, which the 2026 paper restates as 2 bit/min. The new attack reaches up to 12 bit/s at 99.16% accuracy in production. The paper describes the gap as orders of magnitude and notes that higher rates are reachable if you accept lower accuracy.
04 Do I need to change my Cloudflare Workers configuration?
Cloudflare asks for no customer action, and no setting you control would have prevented the attack. The useful changes are architectural: shorten the life of secrets held in Worker heaps, keep third-party code out of processes that hold secrets, and alert on Durable Object sessions that stay open for hours.
05 What is DyPrIs and why did it miss the attack?
Dynamic Process Isolation moves a suspicious Worker into its own operating system process after detecting anomalous branch mispredictions. It missed this attack for two reasons: it isolates only after an invocation finishes, and WebSocket traffic inflated the iTLB counter it uses to normalise, pushing the ratio below the detection threshold.
06 Does the V8 Sandbox fix Spectre on Cloudflare Workers?
No. It removes the specific gadget used here by limiting transient access to 64-bit pointers, which mattered because TypedArray still stored a raw 64-bit pointer to its backing store under pointer compression. Cloudflare states other Spectre variants or gadgets may still achieve out-of-bounds access.
07 How complete is the MPK protection Cloudflare deployed?
A modern x64 CPU offers up to 15 protection keys and V8 uses some, leaving about 12 for isolates. Random assignment means a cross-isolate read hits a hardware trap in roughly 92% of cases. Strict rotating assignment, so no sandbox within 32 GiB shares a key, closes that gap for one common arrangement.
08 Which teams should treat this as urgent?
Teams running third-party or model-generated code inside a process that also holds their own secrets, including Workers for Platforms builders and agent sandboxes executing untrusted JavaScript. For everyone else on standard Workers the mitigations are provider-side and already deployed, so the takeaway is a design assumption rather than a task.

About the author

Manu Shukla

Founder & Director

Founder of eCorpIT. Hands-on engineer leading senior-only delivery for AI apps, custom software, and cloud systems for global clients.

Subscribe

One engineering note a week. No fluff, no spam.

Senior-architect playbooks on AI agents, mobile apps, cloud, security, data, and marketing — delivered every Wednesday.

Past the reading

Read enough. Let's build something.

A senior architect responds in 24 working hours with scope, indicative cost, and a timeline. NDA before any technical conversation.