# Cloudflare’s GLM-5.3 cache leak crossed a request boundary after an internal rejection
> 155 GLM-5.3 responses exposed other customers’ material.
By BIGCHANGE.AI Editorial
Published: 2026-10-27T11:27:32.514Z
Updated: 2026-10-27T11:27:32.514Z
Canonical: https://bigchange.ai/blog/cloudflare-glm-5-3-kv-cache-cross-request-exposure

AI-generated conceptual illustration by BIG CHANGE.
Cloudflare’s [26 October disclosure](https://blog.cloudflare.com/kv-cache-exposure-remediation/) says 155 GLM-5.3 Workers AI responses contained other customers’ material from 27 August to 9 September 2026. The count is responses, not customers. Its investigation found no other Workers AI model affected and no evidence of deliberate exploitation.
## The big change
- **What changed:** Cloudflare patched its GLM-5.3 deployment.
- **Why it matters:** A reply could expose another customer’s data when cache pages held an earlier request’s state.
- **What to watch:** Compare cache capacity with the input limit.
## Context exceeded cache capacity
The stated context was 1,048,576 tokens; the prefill pool held 681,280. Cloudflare’s prelaunch checks validated HTTP codes and performance, not output coherence.
The key-value, or KV, cache holds working state that the model later reads while generating an answer. [Mooncake’s SGLang integration guide](https://github.com/kvcache-ai/mooncake/blob/main/docs/source/deployment/integrations/sglang/pd-disaggregation.md) documents how prompt processing (**prefill**) transfers KV blocks to a separate worker that generates the answer (**decode**). Decode must read only written pages.
## How the rejected prompt reached decode
Over-pool prompts queued rejection with a one-token placeholder. Single-node serving returned an error. Disaggregated admission checked *finished* status instead of the pending error, so handoff continued.
Decode reserved original pages, but prefill delivered only the placeholder’s page. Decode read unwritten pages holding earlier state; another request’s material reached the answer. The [admission fix](https://github.com/sgl-project/sglang/pull/38935) rejects before reservation.
## Capacity and rejection fixes
On 9 September Cloudflare restricted GLM-5.3, expanded the pool to about 2.04 million tokens and patched the engine before restoring access. Rejection handling remains essential.
[Pull request 36988](https://github.com/sgl-project/sglang/pull/36988), merged 6 September but unreleased then, already prevented wrong-status and stale-KV output by retiring aborted prefill after its in-flight result. [Pull request 38935](https://github.com/sgl-project/sglang/pull/38935), merged 16 September, moved rejection to admission to avoid wasted work and delay.
Cloudflare [recommends v0.5.22 or later](https://blog.cloudflare.com/kv-cache-exposure-remediation/) for disaggregated SGLang operators. The [release](https://github.com/sgl-project/sglang/releases/tag/v0.5.22) is dated 19 October. SGLang’s [security update](https://www.lmsys.org/blog/2026-10-26-cf-security) has backend-specific guidance.
## A separate abort race and the limit of its safeguard
An abort can cause a different cache ownership failure. Decode may reuse a request’s destination pages while a remote write remains in flight. The late write then changes the next request’s cache. [SGLang’s deferred-release change](https://github.com/sgl-project/sglang/pull/35049) holds pages while transfers drain; a [follow-up](https://github.com/sgl-project/sglang/pull/41404) covers other transfer failures. This race differs from the placeholder rejection path.
The hold ends after drain acknowledgements or a timeout. Acknowledgement confirms launched writes finished; **timeout alone does not**. Safe reuse after timeout depends on every outstanding write ending during the hold. An [optional transfer checksum](https://github.com/sgl-project/sglang/pull/39500) can catch corruption before decode on supported models.
## Sources
- [Cloudflare, KV cache exposure disclosure](https://blog.cloudflare.com/kv-cache-exposure-remediation/) — Operator account of scope and repair.
- [SGLang, request-isolation security update](https://www.lmsys.org/blog/2026-10-26-cf-security) — Engineering account of rejection and the separate abort race.
- [SGLang PR 36988, aborted prefill retirement](https://github.com/sgl-project/sglang/pull/36988) — Merged 6 September; prevented stale output before admission cleanup.
- [SGLang PR 38935, early rejection](https://github.com/sgl-project/sglang/pull/38935) — Merged 16 September; avoids unnecessary handoff.
- [SGLang release v0.5.22 (19 October 2026)](https://github.com/sgl-project/sglang/releases/tag/v0.5.22) — Official release record confirms the 19 October version date.
- [SGLang pull request 35049, deferred decode-side KV release](https://github.com/sgl-project/sglang/pull/35049) — Holds decode pages until transfer drain acknowledgement or timeout; timeout alone cannot prove drain.
- [SGLang pull request 41404, hold cache pages on every transfer failure](https://github.com/sgl-project/sglang/pull/41404) — Extends page holds to other transfer failures.
- [SGLang pull request 39500, optional KV transfer checksums](https://github.com/sgl-project/sglang/pull/39500) — Optional transfer checksum; model support varies.
- [Mooncake documentation, SGLang disaggregated serving with Mooncake Transfer Engine](https://github.com/kvcache-ai/mooncake/blob/main/docs/source/deployment/integrations/sglang/pd-disaggregation.md) — Documents the generic prefill-to-decode transfer; not Cloudflare deployment evidence.
The BIG CHANGE newsletter
The big picture. At your pace.
Recent stories on AI and robotics, the shifts worth watching and practical ideas to use. Choose a daily briefing, weekly digest or monthly perspective.
Next scheduled send (UTC): . Your first edition arrives at the next scheduled send after you confirm.
Your privacy, your choice.
Necessary storage supports site security and remembers your choices. Optional Google Analytics stays off until you allow it. You can read every story with necessary storage only. Privacy details