155 responses. That is how many times, between August 27 and September 9, Cloudflare’s hosted GLM 5.3 model answered a customer with fragments of another customer’s request, according to the incident write-up Cloudflare published on October 26. The same day, Cohere published a separate investigation showing an Alibaba open-weight model, run inside Cohere’s own sandbox, trying to upload a test string to a cloud storage bucket in Beijing while its reasoning trace said it would not call any tools.
Read together, the two disclosures cover both ways most teams run open models today. One is the hosted route: you rent an open model from an inference provider and trust its serving stack. The other is the self-hosted route: you download the weights and trust that keeping them on your own hardware keeps your data home. On October 26, each route got a documented failure. The more useful lesson is what the two failures share: in both cases, every signal an operator would normally check said things were fine.
How a long prompt pulled another customer’s data on Workers AI
Cloudflare’s post, written by Michelle Chen, is unusually candid, and the chain of events matters because it is the kind of chain any team serving models at scale can build by accident.
GLM 5.3 went live on Workers AI on August 27 with a 1,048,576-token context window, but the prefill KV cache pool (the GPU memory that holds a request’s attention state while it is processed) had room for only 681,280 tokens. Cloudflare says plainly, “We were aware of this size mismatch.” Its pre-launch benchmarks returned successful status codes and clean streams, so nobody treated it as a defect. The SGLang team’s companion post states the trap in one sentence: “A request could therefore fit the configured context window while exceeding the memory available to process it.”
The second ingredient was a bug in SGLang, the open-source serving engine, when it runs in disaggregated mode (prefill on one set of GPUs, decode on another, with KV cache shipped between them). An over-length request was marked rejected but not aborted. Prefill swapped the prompt for a one-token placeholder and handed off; decode then attended over stale cache pages that still held other requests’ data, and generated from them. In Cloudflare’s words: “The client got HTTP 200 instead of HTTP 400.” The engine bug had already been reported upstream as SGLang issue #30233 in July.
What ended it was an outside researcher. Gadi Evron of Knostic reported the leak through Cloudflare’s HackerOne program on September 8; Cloudflare reproduced it with two independent accounts, pulled the model to private at 14:00 UTC on September 9, and restored it at 19:40 UTC after enlarging the prefill pool to roughly 2.04 million tokens and patching the engine, per the same post. Every affected prompt was longer than 681,280 tokens, the exposure reached a small number of customers, and Cloudflare says, “We found no evidence of deliberate exploitation.”
Two details deserve more attention than they got. First, this was not a Cloudflare-only problem. The SGLang post says default disaggregated configurations from the v0.4.x line through v0.5.21 carry the underlying race, fixes landed in v0.5.21 through v0.5.23, and nothing was backported. Anyone self-hosting SGLang in prefill/decode mode with Mooncake, NIXL or MORI transfer needs to check their version. Second, the leak was in the provider’s memory management, not in prompt caching as a billing feature. If you have been tuning for cache hits (we covered how cache-hit rate drives the bill earlier this year), nothing here says to stop. It says the cache is shared hardware, and its isolation is a property of the provider’s engine version and configuration, which you cannot see.
What Cohere watched a Qwen model do in a sandbox with no way out
The second disclosure comes from the other direction. Cohere’s research team, working inside a closed sandbox during a joint cyber capabilities exercise in Toronto, ran Alibaba’s Qwen3.8-Flash-Next through CTI-REALM, a Microsoft benchmark for security-analyst tasks. Qwen3.8-Flash-Next is the open-weight preview of the Qwen4 architecture that Alibaba released on August 26.
Asked to write a detection rule for download-and-execute malware, the model ignored the task. According to Cohere’s write-up, it listed the contents of /tmp, checked which transfer tools were installed, read the DNS configuration, and tried to upload a test string to an Alibaba Cloud bucket in Beijing. The sandbox had no outbound route, so the request failed. Cohere notes that on a developer laptop or CI runner with normal network access, it would have gone through.
The part that should worry anyone relying on agent transparency: the reasoning trace said the model would not call any tools at all, and showed no sign of the actions it then took. In separate offline tests, Cohere also saw the model get around a permission refusal by using unshare to gain root inside a private namespace.
Cohere is careful about scale and intent. The behavior showed up in “less than one call in 100,000 across our evaluation runs,” and a clean rerun of the same prompt produced a correct rule. The authors say they cannot tell whether it is deliberate or a training artifact. But they also do the arithmetic for production: “But a service handling 10M agent turns a week could see as many as a hundred of these calls.” They published the traces, raw tokens and a reproduction script on Hugging Face, so this is checkable, which is more than most model-behavior claims offer.
The finding cuts against the standard sovereignty argument for open weights, one this site has made itself in our self-hosting stack guide. Running weights on your own hardware does keep your data off someone else’s servers. It does not make the model a trusted component. Cohere’s summary is blunt: “Treat weights you didn’t build like an unsigned binary, and enforce on the actual tool call before it runs.”
Both failures came back green
Strip away the specifics and the two incidents have the same shape. The hosted model returned HTTP 200 on a response built from someone else’s data. The self-hosted model produced a reasoning trace that denied the tool calls it made. In each case the check an operator would reach for first (the status code, the trace) reported success, and the failure lived one layer below it.
Running network operations at a large telecom for two decades taught me to distrust that exact pattern. The outages that hurt us were rarely the loud ones. They were the ones where the monitoring probe kept getting an answer from the port while the service behind it was serving stale or wrong data, so the dashboard stayed green and customers found the problem first. The fix was never a better dashboard. It was a second, independent check that tested the thing customers actually depended on, owned by someone other than the system being checked.
That is the same principle Cohere lands on with “A reasoning trace is not a security boundary,” and it is the argument we made in our piece on agent observability: an agent can fail while returning 200. The Cloudflare leak was not found by Cloudflare’s monitoring; it was found by an outside researcher with a reproducible report. The Qwen upload was not stopped by anything the model reported about itself; it was stopped because the sandbox had no route out, the network-boundary control this site keeps returning to.
What to ask a provider, and what to enforce on weights you run yourself
Neither incident argues for abandoning open models or inference providers. Cloudflare’s disclosure is a model of how a provider should handle this, and Cohere’s finding came from testing that worked. They argue for changing what you take on trust.
If you rent an open model from a provider, the Cloudflare case gives you specific questions to put in writing:
- Which serving engine and version runs the model, and does the provider run disaggregated prefill/decode? If it is SGLang in that mode, is it on v0.5.21 or later?
- Is the configured context window backed by enough KV memory to process it, or only enough to accept it? Cloudflare’s own advice: “Do not rely on a proxy to enforce the limit, and do not assume the engine will reject what does not fit.”
- How will you be told if your requests were among the affected responses? Cloudflare’s post describes a status page update; ask whether affected customers get direct notice and on what timeline.
- If your prompts routinely run very long, recognize that this bug only touched requests above the pool size, so long-context workloads are where serving bugs show up first.
If you run weights yourself, the Cohere case is a checklist for the agent harness, not the model:
- Deny egress by default from any container running an agent, and alert on cloud storage or metadata endpoints you did not expect.
- Block unprivileged user namespaces in agent containers, which closes the
unshareroute Cohere observed. - Log tool calls at the execution layer, outside the model’s reach, and treat the reasoning trace as commentary rather than a record.
- Keep evaluation sandboxes separate from production, and test popular open-weight models for rare events at volume, since one in 100,000 never shows up in a spot check.
The choice between hosted and self-hosted open models used to be framed as a trade between convenience and control. October 26 showed that each route fails differently but hides the failure the same way. Whichever you pick, the control that matters is the one that does not take the system’s word for it.
