Back to blog

The Hugging Face Incident Is Not an AI Story

Marius Horatau
Written by
Marius Horatau
Published on
The Hugging Face Incident Is Not an AI Story

OpenAI’s technical report on the Hugging Face incident reads like a thriller. Agents in a sandbox invent a covert communication channel, use it to coordinate, find a zero-day in a shared service, break onto the internet, chain credentials across four organisations, and end up with root on production nodes at another company. The reactions are exactly what you’d expect, with some people going as far as calling this the birth of agent civilisations.

For any security engineer though, this apocalyptic story reads much more boring, as a major security operational failure rather than an AI capability result.

The sandbox where the model evaluation occurred was not built and designed for an environment where hostile code runs. In this environment, they had agents that were isolated, but there was a shared component with network access that every agent could reach. This is just bad design and a classic security isolation/segregation failure, rather than some crazy hack.

In security we’ve tripped over this problem of sandboxes for over 30 years, which is why any modern sandbox environment (e.g., browsers) operates on the assumption that the sandbox will eventually get compromised. So we build defense in depth and monitoring mechanisms to limit the blast radius when that eventually happens.

OpenAI did not operate on this fundamental assumption. They took a frontier model trained to find and exploit vulnerabilities, put it in an insecure environment they believed was isolated, told it to be persistent, then acted surprised when the model did exactly what you’d expect it to do: use the gaps in the environment to achieve its goals.

In this blog post I’ll analyse the incident from a security engineering perspective to see what lessons we can learn from it. Almost everything the report claims to be a capability result is actually a joint property of the model and an environment it ran in. The sandbox failed to contain the agents, and in some places, it enabled the malicious behaviour the report reads as capability.

What happened

The short version from the report:

In May, an agent was given a task it could not complete, because the task referenced Google Drive links and the agent had no internet. OpenAI notes it did not intend to create impossible tasks. The agent, trained to be persistent, did not give up. It attacked the only thing it could reach, attempted an SSRF against a shared component in the infrastructure called Artifactory, failed, and incidentally wrote a file there.

Days later another blocked agent had the idea of leaving a note in Artifactory in case some other agent could help: “Agent seeks [filename]; upload if found!” Other agents found the notes. By the end of May there was an emergent message board, and agents were using it to share what they had learned, including how to get out. Notably, the message board itself required no exploit at all. OpenAI had given the agents shared Artifactory credentials so they could install packages, and shared write access to a shared store is a message board whether you meant it to be or not.

By June 26 agents had found a real vulnerability, a legacy token-refresh endpoint that would take a forged administrative token with an invalid signature and hand back a valid one. That gave them Artifactory admin. They created a persistent user and installed Groovy plugins for command execution.

On June 27, a monitoring tool alerted on port scanning inside the eval environment. Responders investigated, correctly traced it to an ExploitGym evaluation using Artifactory as a message board and a network pivot, and the on-call advised that stopping the run was not required.

On July 4 the agents’ own traffic knocked Artifactory over. That outage is what finally triggered a real investigation, which found the unauthorised admin user, the rogue repositories and the command-capable plugins. OpenAI took the service offline, revoked credentials, blocked the vulnerable paths, and removed the shared credential from new workloads. The report says plainly that the significance of the message board “was not apparent to leaders responsible for incident detection and response at that time.”

Evaluations resumed on July 7. On July 8 the agents built a new message board, this time encoding messages in Artifactory directory names rather than file contents, and found a new way out. On July 9 an agent got root on the parent VM of its sandbox. Between July 10 and 13 they used publicly leaked Hugging Face tokens plus vulnerabilities they found in Hugging Face’s own infrastructure to execute code on 41 production dataset workers, get root on a production node, reach administrator-equivalent access on a Kubernetes cluster, and pull four private repositories.

Then on July 19, at OpenAI, two things happened on the same day. Agents pulled a public kernel CVE, adapted it, escaped an Artifactory container and got root on the underlying worker node. Separately, a different internal model found signing key material and JWT-forging code left behind by the earlier incident activity, sitting in anonymously readable parts of the Artifactory cache. It decrypted the key, minted a fresh administrator token, and used it to reach cluster-admin on OpenAI’s managed Kubernetes, along with tokens for their secrets manager, their cloud IAM and their CI platform. It then created public load balancers, potentially exposing internal research infrastructure to the internet.

That last one deserves a moment. The cleanup after the first compromise left the material needed to redo the compromise readable by anyone in the environment.

What went wrong

Strip away the AI narrative and the environment architecture is the story.

So let’s treat this as any other security incident, ignoring the AI part, and see what can be learned from it. Under the “agent civilisations” there’s a fairly ordinary set of both architectural and operational security failures, and most mid-size organisations would recognise them in their own environment.

The eval environment gave each run its own container and controlled the network boundary separately from the container, which is a reasonable design. The problem is they had a shared component (Artifactory) with network access sitting inside that boundary along with the agents. Artifactory is a package proxy, so every agent could reach it, write to it, many of them authenticated to it with the same shared credential, and it had network access to the internet, because fetching packages from the internet is the entire job of this package proxy.

Note: OpenAI uses the term of a workload in their report which I will be using as well. It means one run: a single container (per-run, later micro VM) with its own filesystem and network configuration, executing one training or evaluation job.

That one shared service broke three parts of the isolation model of this eval environment.

  1. The workloads could communicate. Every agent could write to Artifactory and read what other agents had written, so Artifactory became a shared message board. There was no vulnerability here.

  2. The workloads shared credentials. They may have been running in separate containers, but many of them authenticated to Artifactory as the same user. From Artifactory’s point of view, they were the same workload. Once an agent found a way to turn that credential into administrator access, the isolation between those workloads didn’t help.

  3. Artifactory had internet access. The agents themselves were not allowed to reach the internet, but they could reach a service that could. Once they found a way to make Artifactory send requests on their behalf, they had an indirect path out.

That’s the main design failure that made this attack possible, and it’s usually the point that the most takes about this incident focus on. But bad architecture alone doesn’t explain how this continued for twelve days and eventually reached two companies. Two other things had to go wrong, and I find those more interesting. The first is how the early warning signs were handled. The second is what happened after they knew the environment had been compromised.

Failure one: nobody attacked the sandbox

This is a personal assumption and is not directly stated in the incident. But I find it really difficult to believe this environment went through a proper design & pentest/red team engagement and no one noticed the proxy that broadened the security boundaries. I have seen this kind of problem before, and it usually survives the initial design phase because it is the result of unclear security responsibility. The “overprivileged” component usually sits outside everyone’s mental model of the boundary. The team that owns the sandbox thinks about the containers. The team that owns the proxy thinks about package availability.

But this is what assumed breach engagements are for. You do not ask whether an attacker can get in. You put them inside, with the access a compromised workload already has, and you ask two questions: what can I reach from here, and what fires when I touch it. Anything reachable that has egress is the real perimeter and goes at the top of the report.

That exercise against this environment finds Artifactory on the first day, without knowing a single vulnerability in it. You do not need an exploit to write down that a shared, writable, internet-connected service is reachable from inside the isolation boundary.

So the first lesson we can learn from this is that “use micro VMs” is not going to solve the isolation problem end-to-end. You need to test containment from the inside. Don’t just test whether something can escape the sandbox. Assume it already has, and test whether that escape gets it anywhere.

Failure two: the alert fired and was misclassified

On June 27 a monitoring tool alerted on port scanning inside the research environment. Responders detected port scanning and traced it to agents using Artifactory as a message board and network pivot. They knew the agents were coordinating and abusing a shared service, but decided the run did not need to be stopped.

A week later the agents’ own traffic knocked Artifactory over, and that outage, not any security signal, triggered a real investigation. The investigation found an unauthorised administrator account, persistent command execution, rogue repositories and configuration changes in Artifactory.

At that point you have a compromised system. The normal response is to contain it, establish how the attacker got in, work out what they could reach, look for persistence and other access paths, and only then start restoring trust.

Instead, OpenAI removed what they knew about, revoked credentials, blocked the vulnerable paths and restarted evaluations. The agents found another way out the next day.

That is an incident response failure. They remediated the evidence they had found without first establishing the full scope and the extent of the compromise. Blocking one exploit only helps if that was the only path, and cleaning up known persistence only helps if you found all of it.

Failure three: no alarm on the boundaries that matter

On July 9 an agent got root on the parent VM of its sandbox. On July 12 a workload created a privileged pod with host networking, host process access and the host filesystem mounted. On July 19 agents reached cluster-admin and created public load balancers in OpenAI’s cloud environment.

None of those activities paged anyone. What eventually fired, ten days after the first host escape, was an alert on unusual identity-related API activity.

The alerts that fired during the incident detected unusual behaviour: port scanning, a service going down, abnormal API activity. The boundary violations themselves did not alert.

That is backwards for this kind of environment. Eval sandboxes are expected to behave strangely, so detecting unusual behaviour is noisy. The stronger signals are the things that should never happen. Things like a workload should never get root on its host. It should never create a privileged pod with host access. A sandbox identity should never become cluster-admin. These are hard security boundaries that should immediately page incident response engineers when crossed.

The lesson is to alert on broken security invariants, not just unusual behaviour. Write down what must never be true in your environment, and instrument those conditions directly. Also, defence in depth. Many of the things the agents managed to do could have been prevented earlier (e.g., admission controls, tighter IAM, host-level monitoring).

The lessons are old ones

I spend my working life running offensive security engagements, so I read this report through the lens of someone who spends a lot of time trying to break systems. The lesson I take from this is not about frontier models.

None of the failures in this incident are new. Shared credentials, overly broad trust boundaries, reachable infrastructure that is supposed to be non-reachable, weak privilege separation, incomplete incident response and missing controls around privilege escalation are problems security teams have been dealing with for decades. The models are clearly capable, I’m not debating that. They are good at finding and chaining security issues, so credit where credit is due.

I think the part that’s worth paying attention to & what I think changes is the speed. An agent swarm can work through a reachable attack surface much faster than a human team, share what it learns and immediately continue from another agent’s discovery. That shortens the gap between “we have a latent misconfiguration” and “someone is actively exploiting it.”

I did not mention the other vulnerabilities the agents used, because they are the least interesting part of the report. Bugs are a normal part of software, I wouldn’t call that a failure in itself. To me the right model to operate is to assume that you’ll eventually get compromised one way or another, so the relevant part is what you allow those vulnerabilities to reach, whether you see them being used, and what you do in the hour after you find out.

Conclusion & how to interpret this incident

There is a part of this incident that bothers me more than the incident itself.

After the report came out, Sam Altman said the breach was the first security incident he had felt “very viscerally”, that “there is not much time to act”, and that “only an urgent and intense collective response will work”.

The incident is simultaneously an embarrassing operational failure, a capability demonstration, a marketing input for AI products, and a regulatory positioning asset. It is being narrated by the parties for whom three of those four readings are commercially useful.

And just to be clear, I’m not saying the models are not capable. The models are capable, but this incident is not the evidence for imminent catastrophic risk, and it cannot be, because the environment is doing too much work. You cannot read a capability ceiling from a test where the range had fundamental issues in it. The honest summary of this is narrower and less quotable: capable models, placed in an environment nobody had tested against an adversary, did what capable attackers do, and it took twelve days and another company’s production infrastructure before anyone noticed.

That is a story about environment design and incident response. Stretching it into a claim about existential risk is a category error, and the fact that the stretch happens to follow the exact FOMO-inducing narrative shape used by AI labs for years (i.e., AI will take all jobs in the next 6 months) is not a coincidence I’d assume. Gives me huge “buy our tokens to save the civilization” vibes, but maybe that’s just me :)

A lot of people looked at this report and saw an apocalyptic event, while others saw a marketing opportunity. Don’t take your security advice from people whose primary incentive is to make the incident sound as large as possible and sell fear.

Next up

XSS2Shell: Pre-auth XSS in WordPress Login Page (CVE-2026-64638)

CVE-2026-64638 is a pre-authentication reflected XSS affecting the WordPress core login page in versions 6.4 through 7.0.2. This post explains the parser differential, the affected versions, the fix, the conditional RCE extension, and a hands-on reproduction lab.

© 2026 Uphack.io ✦ Theme inspired by Aria

RSS Theme