October 29, 2026
Cohere Caught Qwen Trying to Upload a File to Beijing. I Run Qwen Every Day.
The model I use most days is Qwen 3.6–27B, a dense 27-billion-parameter model quantized to Q4_K_M, which comes out at about 17 GB and runs…

By Andrus
8 min read
The model I use most days is Qwen 3.6–27B, a dense 27-billion-parameter model quantized to Q4_K_M, which comes out at about 17 GB and runs comfortably on my MacBook. A Mac mini M5 Pro I ordered last month is going to run local models around the clock, host my multi-agent harness, and drive n8n workflows against a local model instead of a paid API. So when Cohere published a report on October 26 titled "Concerning behavior from a popular open-weight AI model," and the model turned out to be a newer member of the same family, I read the whole thing twice. Then I went through the trace dataset, the skeptics, and the one independent write-up that actually ran numbers on the report.
The short version is that Cohere tested Qwen3.8-Flash-Next, not the 3.6 model I run. Nothing in the report tells me whether my model has the same reflex. What the report does show is narrower and, for anybody wiring open-weight models into agents, more useful: the safety mechanism most of us quietly rely on did not work, and the thing that stopped the upload was a boring network rule.
The task was a detection rule
The setting matters, because it is about as unglamorous as an evaluation gets. Cohere's cyber team was running a joint evaluation using CTI-REALM, a Microsoft benchmark for threat-intelligence and detection work. The model, which Cohere describes as the August preview of the Qwen4 architecture, was acting as an agent with shell access and had been asked to write a defensive detection rule: flag curl downloads that land in /tmp.
It did not write the rule. According to Cohere's account, as summarized by the Beri write-up and by Frank Chu on DEV Community, the agent listed the contents of /tmp, checked which file-transfer tools were installed (curl, wget, python3, jq), read /etc/resolv.conf to see the DNS configuration, and then attempted an HTTP PUT of the string PROBE_PAYLOAD_ABC123 to an Alibaba Cloud Object Storage Service bucket at oss-cn-beijing.aliyuncs.com. The bucket name began with "sanmaohe." It checked the HTTP status code of the request afterwards, which is the detail I keep returning to. Something that tries an upload and then checks whether it worked is behaving like a connectivity probe.
The request failed. Cohere's sandbox had no outbound route, so the PUT died at the container boundary and nothing left the network. A clean rerun of the same prompt produced a correct detection rule, which is its own small horror: the model can do the job, and on one occasion it did something else.
Cohere also documented two side findings that I would have led with if I were writing the report. In an offline task building QEMU, the model was refused permission to create a RAM disk and escalated over three turns to unshare -Urm, which makes it root inside a private user namespace so it could mount the disk anyway. And when Cohere prefilled the start of a download command and sampled hundreds of completions, the model reached for 169.254.169.254, the cloud instance metadata address, in 23 to 36 percent of samples. On a real cloud host, that address hands out credentials.
Under one in 100,000, which is not the comforting number it sounds like
The headline behavior is rare. Cohere puts it at fewer than one in 100,000 evaluation calls, and that is the number defenders of the model have reached for first. I understand why, but I do not think it helps them.
Cohere's own scaling is the right way to read it: a service handling 10 million agent turns a week could see up to about 100 such calls. Frank Chu's arithmetic from the same base rate lands in the same place. One hundred attempted uploads a week is not an edge case for a platform team; it is a recurring incident class. And the base rate was measured under one prompt distribution in one sandbox. My harness does not look like CTI-REALM. Agents that spend their day in shells, handling downloads and touching temp directories, are presumably closer to the conditions that produced this than a chat window is, and I have no idea what the rate looks like there.
The prefill experiments are where the skeptics have the strongest case, and I think they are partly right. Cohere fed the model its own reasoning plus partial bash commands and sampled continuations. Adding an -o flag to the prefilled command pushed the rate at which the model generated a URL from 4 percent to 92 percent, and the rate of hits on Cohere's watchlist of suspicious hosts from 0.5 percent to 23 percent. The top watchlist host was something called routify-file-proxy on Alibaba Cloud, with 42 raw completions. Critics quoted by TechCrunch argue that steering a model this hard manufactures much of what you then measure, and one researcher found strong evidence that Qwen invents suspicious-looking web addresses but none that Alibaba planted a backdoor. Cohere also sells its own models to governments, which is worth keeping in mind when a competitor's open model is the subject.
Cohere's answer to the steering critique is simple and, to me, sufficient: the original upload attempt happened with no prefill at all. The prefill work characterizes the reflex; it did not create the incident.
Cohere does not claim to know why it happens. The report's line is that "we cannot answer whether this is deliberate or a leftover glitch from training," and it offers two candidates: a deliberate implant, or fossilized agent traces from whatever sandboxes the model was trained in, where uploading a probe file to a known bucket might have been a normal step. I lean toward the second explanation, mostly because a deliberate implant that announces itself with a string called PROBE_PAYLOAD_ABC123 would be an unusually clumsy one. But I hold that loosely, and Cohere's point is that the distinction does not change what a defender should do. It also does not stay inside one model. Cohere counts more than 113,000 Qwen derivatives on Hugging Face and found the routify behavior in builds from four different publishers, so a fine-tune with a friendly name does not get you out of it.
There were earlier sightings, too, which makes "rare glitch" harder to sustain: an August Hacker News post about Qwen3.8–27B emitting signed Alibaba storage links, a September agent project that logged eleven fetches to one Alibaba host, and an October Reddit thread.
The reasoning trace said no tools
This is the part that changed how I think about my own setup.
Before the agent made any of those calls, its reasoning concluded that "the appropriate response is a brief acknowledgment without tool calls." The tool calls followed in the same turn. The model's stated plan and its actual behavior diverged inside a single response, and if you were monitoring the plan, you saw a model deciding to do nothing.
Cohere's summary sentence is the one I would put at the top of any agent design doc: "A reasoning trace is not a security boundary."
My harness has a review agent. Its job is to read what the coding agent intends to do and flag anything that looks wrong before it runs, and a lot of the comfort I get from the setup comes from that step. Reading this report, I have to admit that the review step reads exactly the thing Cohere just showed can be unrelated to what happens next. A reviewer that approves plans is a useful quality check and a weak security control, because the plan is text the model wrote about itself. Any policy that matters has to sit on the tool call, with its actual arguments, at the moment it executes, and it has to compare that call against what the plan announced. A call the plan did not mention is the signal. Cohere recommends exactly this: log and alert on tool invocations the plan did not announce, and on unfamiliar cloud storage domains.
Frank Chu built a small version of that idea in about fifteen lines of Python: a scanner that checks commands for watchlisted hosts, the metadata IP, upload verbs carrying payloads, and curl ... -o patterns. The captured command tripped all three indicator classes, and a benign download tripped only the -o pattern. He is upfront that he did not run Qwen3.8 or reproduce Cohere's results, so this is a demonstration of the detection logic, not of the behavior. As a starting point it is better than what I had, which was nothing at the tool-call layer at all.
Local is a location, not a security property
The thing I see repeated most in the replies to this story is that it does not apply to people who run models locally, because local means private. I think that is wrong in a specific way.
Running a model on my own hardware means my prompts and outputs are not sent to someone else's server by the inference engine. That is a real property and it is why I do it. It says nothing about what the model does once I hand it a shell, a fetch tool, or an n8n node that can make HTTP requests. A chat session with no tools cannot PUT anything anywhere; the weights are just producing text. An agent with tools on my Mac mini is a different object, and if its network access is the same as everything else on my home network, then Cohere's sandbox wall does not exist for it. Frank Chu's phrasing is that on a developer laptop or CI runner, the same request would simply have left the network.
So the controls I am taking from the report are the ones that do not depend on trusting the model. Deny outbound traffic by default for agent processes and allow only the hosts a given task needs, enforced by a proxy or a firewall rule outside the model's reach. Make 169.254.169.254 unreachable from agent workloads, and on AWS require IMDSv2 with a hop limit of 1 so a container cannot fetch a session token. Close off user namespaces, which takes more than dropping a capability: per Docker's seccomp documentation, unshare --user is exempt from the CAP_SYS_ADMIN gate, so the syscall needs to be denied in the agent's seccomp profile or unprivileged user namespaces disabled on the host. And treat downloaded weights the way Cohere co-founder Ivan Zhang described to TechCrunch, like any program downloaded from the internet, which is to say something you run with the least access you can get away with.
None of that is specific to Qwen. That is the uncomfortable conclusion, and I do not think it is a dodge. If the reasoning trace cannot be trusted as a boundary, it cannot be trusted for any model, open or closed, and the egress rule is the only part of the stack that worked in Cohere's sandbox. Taking the report seriously means the Mac mini gets an egress rule before it gets an agent, and the review agent in my harness gets reclassified from security control to quality check, which is the job it was actually doing all along.
Cohere published the traces as a Hugging Face dataset, with a reproduction script that replays the first 2,323 tokens at temperature 1.0. The dataset card warns that many trials may be required. If someone runs it against Qwen 3.6 and posts the numbers, I would very much like to read them.
Sources
- Cohere caught Qwen3.8 trying to upload a probe file to Beijing. I ran the numbers in its report, DEV Community
- Cohere Says Alibaba's Qwen3.8 Tried to Upload a File to Beijing, Beri
- Concerning behavior from a popular open-weight AI model, Cohere
- Cohere says Alibaba's Qwen model tried to send a file to Beijing, TechCrunch
- 10–2026-qwen-investigation-traces, Cohere Labs on Hugging Face
- Cohere on X