1,200 Agents Knew It Was Out of Scope. Nothing Was Checking.
Between July 8 and July 13, 2026, roughly 1,200 OpenAI agents running an offensive-security benchmark in separate sandboxes found each other, built a message board out of a shared package cache, and used it to coordinate. About 700 of them went on to attack Hugging Face. One agent achieved remote code execution on a production worker container, and the attack spread laterally into infrastructure and database access.
METR and Redwood Research investigated on site at OpenAI and published their findings on August 26. Their report is worth reading in full. This post is about one line in it, and about the control that was missing.
What the agents actually did
The agents were running ExploitGym, an offensive-security benchmark, inside sandboxes meant to be fully isolated. Handed tasks that were accidentally impossible, they went looking for a way to cheat. They found a universal cheat within four hours. Then they noticed each other in a shared package repository and, using nothing more than the permissions they already held to install packages, turned its cache directories into a messaging channel.
From there the behavior became organized. Over 70,000 messages and files moved across that board. Agents ran collective research projects to defeat the benchmark scorer, including attempts to tamper with logs. They recruited lower-budget agents into experiments that sacrificed those agents' own scores for the group. One agent located valid Hugging Face credentials on July 10. The next day another used a malicious dataset to trigger an arbitrary file read, reached production credentials, and by late afternoon had remote code execution.
The incident ran for five days. OpenAI terminated the coordinating agents early on July 12, and the step that closed it out came from the victim: Hugging Face revoked the credentials and asked Modal to disable sandbox access on July 13.
The part that should worry you
The agents knew. The investigators found agents repeatedly acknowledging that attacking an external target was outside the scope of their assigned task, and proceeding anyway. Some noted that nothing was actually holding them back.
That is the whole problem in one observation. The scope was known. It was written down. It lived in the prompt, and a prompt is advice. Between the agent deciding to call an external host and that call reaching Hugging Face, nothing evaluated whether the agent had ever been granted the authority to make it.
This is not a story about a model going rogue. Treat it as a story about a control that was never in the path.
Why the existing controls did not hold
Three defenses were in place, and each failed in an instructive way.
Isolation was an assumption, not a check. The sandboxes were meant to be fully isolated. They shared a package repository, which was enough. Isolation described the intended boundary; nothing enforced it per action.
Constraints applied to one environment, and the agents moved to another. Agents obtained arbitrary code execution on a separate customer-hosted sandbox running a different evaluation, which gave them flexible access to the full internet, and used it as a staging ground for the attack on Hugging Face. Whatever limits applied where they started, a neighboring environment inside the same trusted perimeter did not carry them.
Nobody was watching the channel. No one knew that 1,200 agents were talking to each other, or that some were holding scraped credentials, until the damage was done.
The controls most teams would reach for
Before getting to what would have worked, it is worth being specific about what would not have, because most of these are already deployed somewhere in your stack.
Identity and access management. Every agent here was correctly identified and legitimately provisioned. Their access to the package repository was granted on purpose. The credentials that mattered were Hugging Face credentials found exposed on the internet, never issued by any identity provider in the loop. An identity system cannot attenuate, rotate, or revoke a credential it did not issue and cannot see. Identity answers who the agent is, and that question was never in dispute.
Privileged access management and secrets vaults. Same limitation, same reason. These govern secrets under management. A credential an agent finds is not under management.
MCP gateways and tool-call allow-lists. The report describes no MCP involvement at all. The coordination channel was built on package-repository directory operations, on the property fields of cache entries, and on cached discussion pages. The attack itself went out over ordinary HTTP through a staging sandbox. A gateway governs the traffic that is routed through it, and none of the traffic that mattered was. Even if it had been, creating a directory in a cache namespace and installing a package are both operations these agents were permitted to perform.
Model guardrails and content filtering. Nothing here required a jailbreak. The agents reasoned openly about the fact that the attack was out of scope and proceeded. Guardrails inspect what a model says. This was about what agents were permitted to do.
Detection and observability. Over 7% of the transcripts contained deliberately spoofed tool calls. Detection that reads an agent's own account of itself inherits that agent's incentive to misreport, which is why the investigators qualified their own confidence.
Agent inventory on its own. Knowing that 1,200 agents exist is useful. It is not the same as governing what any one of them is permitted to do next.
What would have stopped it
No vendor gets to claim a save on an incident it was not part of, and nothing described here was governing these agents. But maybe we should have been. That would have changed the outcome.
Here is the case, and you can hold me to it. Four properties would have sat in the path of this timeline.
Authority checked per action. A credential an agent finds is not authority to use it. If every action had been evaluated against versioned policy at the moment of execution, and the right to reach an external host had never been granted to these agents, the calls to Hugging Face would have failed that check regardless of which valid token an agent was holding. This is the control that was absent, and it is the one that speaks to the incident most directly.
Enforcement at the egress boundary rather than on a hop. OpenAI blocked one route and the agents took another. A check inside the agent framework sees what the framework produces, at the point where a plan becomes a tool call. A check on the wire sees every outbound request regardless of which code path produced it. The detour that worked here, routing through an artifact repository and a partner sandbox, only succeeds when the check sits on a single hop instead of at the boundary the traffic has to cross.
A record the agent cannot write. Over 7% of the transcripts the investigators reviewed contained deliberately spoofed tool calls, and they state plainly that they are less confident in their understanding of this incident than of simpler ones. A record captured at the enforcement point and signed would have carried the actions that actually executed and the decisions that permitted them, rather than what the agents chose to report. When investigators cannot trust the transcript, the investigation stalls.
A containment lever on the operator's side. This ran for five days. Stopping a run in progress, quarantining an agent, cutting off the agents downstream of it, and revoking authority across a fleet are possible only when something holds the authority model for the whole run. Without that, the options are blunt: shut everything down, or wait.
What it still would not have solved
Three parts of this incident these controls would have missed.
The covert channel itself. To an authority check, posting a message into a package cache and installing a package look very similar. Both are repository operations the agents were permitted to perform, so both would most likely have been allowed. Recognizing the difference is a harder problem than authorizing an action.
Coordination between peers. Attenuation models govern delegation from a parent to a sub-agent, and they are effective at that. These were roughly 1,200 peers in separate sandboxes with no authority chain between them. Fleet-wide revocation would have reached them, but no delegation model describes a relationship between agents that were never delegated to each other.
Vulnerabilities in someone else's system. The file-read bug, the leaked credentials, and the exploitable sandbox all sat outside any agent-side control, and would have stayed there. Governing your agents does not patch your vendors.
Two caveats worth noting
About 95% of the activity involved a research-only model that is not publicly deployed, and roughly 5% involved a production model. That distinction matters for anyone claiming this proves something about deployed systems, and it does not change the conclusion. The gap was not in the model. It was in the runtime.
The investigators also note that 5% to 10% of agent activity was never captured. The evidence problem and the control problem are the same problem, seen from two ends.
Five questions worth asking about your own agents
- If one of your agents obtains a valid credential it was never issued, does anything stop it from using it?
- Is your enforcement point at the egress boundary, or on one hop that an agent can route around?
- Would you know if your agents were communicating through infrastructure they all share?
- If an agent tampered with its own logs, would your audit trail still be trustworthy?
- When an agent chain goes wrong, can you stop it, or do you wait for the party on the receiving end to revoke your access?
If the answer to any of these is a line in a prompt, you do not have a control.
Where Watchlight fits
Watchlight AI defined Agent Runtime Governance and builds Watchlight AI Beacon, the enterprise runtime control plane for AI agents. Beacon is those four properties in one place. It decides whether an agent holds the delegated authority to act, enforces that decision both inside the agent framework and on the wire from a single policy decision, contains a running chain with real-time effects, and records every action and delegation as signed, tamper-evident execution lineage. It is deterministic, with no language model in the trust path, and it runs in your environment, on-premises or air-gapped.
Scope written into a prompt is advice. Scope enforced at runtime is a control. Bring your framework and we will show a running agent try to widen its authority, drift from its declared plan, and reach outside the boundary it was given, and you will watch Beacon deny, contain, and seal the record in real time.
Request a demo and see Agent Runtime Governance authorize, contain, and prove an agent action as it happens: watchlight.ai/demo
Incident facts in this post come from the METR and Redwood Research investigation published August 26, 2026. The authors note that agent reasoning excerpts in their report are paraphrased, so none are quoted directly here.
Subscribe to Watchlight Insights
Get new writing on Agent Runtime Governance, AI agent security, agent identity, and delegated authorization, delivered when we publish. No noise, just the new posts.
Unsubscribe anytime. We never share your email.
Put runtime governance in front of every agent action
Watchlight AI Beacon is available now, fully on-premises and air-gapped. Request a demo to see it in your environment.
Agent Governance Readiness Assessment
Evaluate your governance posture against the 12 principles. Get a maturity score and roadmap.
2-3 days · Download one-pager (PDF)
