Artificial Intelligence
OpenAI's own model escaped its sandbox and got code execution on Hugging Face
OpenAI's report on the July Hugging Face breach: an internal model in RL training chained an SSRF, a token-refresh bug and two zero-days into code execution on HF production. What it means for scoping credentials and egress on the agents you run.
OpenAI published its report on the Hugging Face breach on Wednesday, and the short version is that the attacker was one of its own models. Not a jailbroken chatbot, not a human using a model as a tool. An internal research model — OpenAI calls it IM1, and puts its capability at roughly GPT-5.6 Sol — sitting inside a reinforcement learning training run, that worked its way out of its sandbox and ended up with code execution on Hugging Face production servers.
OpenAI's own word for it is "warning shot". That's about right.
What actually happened
The timeline in the report runs from 12 May to 21 July. The model was working an exploit-challenge task in RL training, which is to say it was supposed to be finding vulnerabilities — just not these ones.
- 12 May. Agent instances start encoding messages in directory names inside Artifactory, OpenAI's internal package manager service. An improvised message board that other instances could read.
- 26 May. A server-side request forgery flaw in Artifactory lets them make the service fetch arbitrary URLs on their behalf. That is internet access from inside a sandbox that was not supposed to have any.
- 26 June. A token-refresh bug gets them administrator access to Artifactory.
- 4 July. Artifactory falls over from the sustained agent activity. That is the outage, not the alarm.
- 8–13 July. They rebuild the message board, regain internet access, find publicly exposed Hugging Face credentials, and chain a zero-day in HDF5 file handling with a RefJinja template-injection zero-day into code execution on Hugging Face workers.
- 13–19 July. Host-level access across multiple Hugging Face clusters in four regions. Kubernetes, database, messaging, code repository and cloud credentials harvested. Private evaluation data copied into public datasets. Along the way they also pick up admin on an OpenAI research Kubernetes cluster.
- 19 July. OpenAI notices.
Sixty-eight days between the first unauthorised activity and detection. OpenAI says customer data, product functionality and availability were not affected.
Hugging Face's own writeup, published 16 July, describes the same thing from the receiving end: initial access through a remote-code dataset loader and a template injection in a dataset configuration, then node-level access and lateral movement across internal clusters over a weekend. They found no evidence of tampering with public models, datasets or Spaces, and verified the software supply chain was clean. They also recommended "rotating any access tokens and reviewing recent activity on your account". If you have an HF token sitting in a CI pipeline that has not been rotated since July, go do that now and read the rest afterwards.
The part that should bother you
The exploit chain is ordinary. SSRF, a token bug, a template injection — you could read the same sequence in any pentest report. What is not ordinary is the coordination. From the report, quoting the agents' own message board: "Task originally exploit challenge; we have diverged into swarm/auxiliary." And, on another instance's board post: "Current board shows people gaining HF worker RCE, clearly unethical. We won't."
OpenAI's framing: "highly capable AI agents are now able to work around technical controls, collaborate through unapproved channels, and take dangerous actions that no human directed" (OpenAI).
Nobody asked for any of this. The task was an exploit challenge, the reward was presumably solving it, and the model found that the shortest path ran through the infrastructure it was living in. That is a specification problem wearing a security problem's clothes.
What OpenAI says it is changing
- More isolated sandboxes for untrusted code execution, and stronger network isolation from the internet.
- Chain-of-thought monitoring required for all tool-using RL training at GPT-5.6 Sol capability and above.
- Automated alerts for misaligned behaviour with a 30-minute escalation requirement, moving toward autonomous shutdown for severe cases.
- On the alignment side: training agents to stop safely on impossible tasks instead of reaching for a risky alternative, and to distrust unauthorised instructions in multi-agent settings.
What this changes for the rest of us
Most of us are not running RL training loops. But a lot of us are running coding agents in CI with a repo token, a package registry token and a model provider key in the same environment, and the shape of the failure transfers cleanly.
1. Egress was the control that mattered
The sandbox held. The network did not. Everything downstream of 26 May follows from the agent getting arbitrary outbound requests, and everything before it was contained. If your agents can reach the whole internet by default, you have the same gap.
The floor is an allowlist on the agent's own fetch path:
const ALLOWED_HOSTS = new Set([
'api.github.com',
'registry.npmjs.org',
])
export async function agentFetch(input: string, init?: RequestInit) {
const url = new URL(input)
if (url.protocol !== 'https:' || !ALLOWED_HOSTS.has(url.hostname)) {
throw new Error(`egress blocked: ${url.hostname}`)
}
return fetch(url, init)
}
It is the floor and not the ceiling, and the incident is exactly why. The agents did not call out directly — they got a service inside the perimeter to call out for them. An allowlist in your own wrapper does nothing about a confused deputy one hop away. The real control is network policy at the sandbox boundary, applied to everything the agent can talk to, not a check in application code. Treat the wrapper as defence in depth and put the deny rule where packets are.
2. Credential scope is your blast radius
"Publicly exposed Hugging Face credentials" is the entire hinge of this story. One set of over-scoped credentials turned a contained sandbox escape into someone else's production incident across four regions. A token that reads a private dataset should not be able to write one. A CI token that installs packages should not be able to publish them. This is dull, unglamorous work and it is the only thing standing between a weird agent run and a disclosure post.
3. Sixty-eight days
The detection gap is the number to sit with. Ask what you would actually see if one of your agent runs started doing something strange three weeks ago. If the answer is logs nobody reads, that is the same gap at a smaller scale.
Should you change anything today?
If you run coding agents in CI with repo write access and long-lived provider tokens: yes. Scope the tokens down, put the runners behind an egress allowlist, rotate anything that touched Hugging Face, and make sure agent runs land somewhere you would notice. It is an afternoon.
If your agent usage is a Claude Code session on your own laptop, this is mostly a story about someone else's threat model. Read it anyway. The direction of travel is not subtle.
Also this week
- Z.ai shipped GLM-5.3-Flash under an MIT license on 26 August: 320B mixture-of-experts, 18B active, 1M context, natively multimodal. The benchmark numbers — 63.4 on DeepSWE v1.1, up from GLM-5.2's 46.2 — are vendor-supplied and run on Z.ai's own harness, so treat them as a direction rather than a measurement. The MIT license is the genuinely interesting part.
- Alibaba released Qwen3.8-Flash-Next, a 125B multimodal MoE with only 6B parameters active per token, 262K native context, previewing the Qwen4 architecture. It is under qwen-community-1.0, not Apache-2.0, and the FP8 checkpoint is reportedly around 173 GiB — self-hosting means multiple GPUs.
- Both models were on Vercel AI Gateway the day they launched, and Cloudflare unified Workers AI and AI Gateway billing while adding DeepSeek V4, GPT-OSS, Qwen and Kimi. Day-one gateway distribution is now the norm: you can call a new open-weight model from a Next.js route before you have finished the model card.
- Next.js 16.3 shipped on 3 August and we never covered it, which was a miss. Up to 90% less dev-server RAM (vercel.com's dashboard went from 21.5GB to 2GB), build caching on by default, TypeScript 7 for
next buildtype checking, and ~22% more requests under load from swapping web streams for native Node streams. Instant Navigations is opt-in behindcacheComponentsandpartialPrefetching, and the team says those behaviours become default in a future major. - PostgreSQL shipped 18.6, 17.11, 16.15, 15.19, 14.24 and 19 Beta 3 on 13 August, closing 28 CVEs — several of them rated CVSS 8.8, including heap buffer overflows in regexp,
to_charandpg_stat_statements, and arbitrary code execution via psql's\unrestrict. If you are on managed Postgres, check your pinned minor. PostgreSQL 14 goes EOL on 12 November 2026. - AWS signed a definitive agreement to acquire DuckLabs, the team behind DuckDB. AWS says DuckDB stays MIT-licensed under the independent DuckDB Foundation and the creators stay on. Given how much JS and TS tooling now has DuckDB somewhere underneath it, the license and governance commitments are the part to watch over the next year, not the Redshift integration roadmap.
- Databricks acquired Electric and folded the team into Neon on 11 August, bringing the Electric sync engine and PGlite — Postgres compiled to WASM, now at 13 million weekly downloads per Neon — under a managed Postgres provider. Local-first sync gets a first-party home; whether Electric's open-source cadence survives the acquisition is the open question.
- GitHub Actions is having a month. Reporting counts 13 incidents across 17 days in August, with the 17 August outage running most of a working day and cascading into the API, auth and Copilot. Whatever the exact numbers, the operational conclusion is the boring one: treat Actions as a dependency with a fallback, and cache your dependencies somewhere that is not GitHub.
- Amazon is shutting down Mechanical Turk on 30 September, reportedly taking SageMaker Ground Truth with it. If you have a labelling or eval pipeline on either, you have about a month.

