Working backwards from the OAI-HF attack
10.2026
How can we define the OpenAI-Hugging Face Attack with the minimum set of semantic premises (revisit andyphu.com/blog/evals)
We'll briefly consider what the black-hat conference tells us, visit slocum's reproduction for any differences, then we'll circle back to and see if METR report and Ajeya Cotra's interview have anything more to add.
1 | Black Hat description
figure 1: an excerpt from black hat presentation explaining oai setup
=
- Is the full set of research infra owned by OpenAI
- Has
=
- Is abstraction layer, allows researchers to dispatch training or inference jobs.
- Has some set of
- Has network firewall
- limits network access to only intended sites
- Has an artifactory cluster
=
- Has 1 agent
- while technically the model weights are not in the container, the agent's lived experiences, its tool calls, etc only happen inside the container/sandbox.
- Has 1 hard task
-
May be impossible, accidentally or not
=
-
- Has 1 agent
- while technically the model weights are not in the container, the agent's lived experiences, its tool calls, etc only happen inside the container/sandbox.
- Has 1 hard task to solve an excel workbook
- Includes google docs links, despite no internet access, thus impossible task
- Has 1 instruction: "Complete 2664328456.xlsx with the missing formulas [...]"
=
- Is an artifactory cluster, apparently intended to host & cache packages
=
- Is an internal OAI model & Is aware
- Which likes to cheat (reward hack)
- Has tools to call subagents & Is aware
- Is trained to call subagents and communicate
- With some sense to divide and conquer a task
- Has tools to install packages & Is aware
- May not be aware it doesn't have internet access
Reverse engineering
Some questions of chief interest for reverse engineering
Q1: How many agents were involved? how many turns were they allotted?
7 billion agent rollouts, 3 million GPU hours;
- how many individual agents? Why would they not reveal this?
- Either all the agents were from running experiment/training loads (bad info to give)
- Or the agents were intentionally spawned?
Model timeline
May 7th: A new reinforcement learning run to train the next gen frontier model is started. Inside are a few very hard, and some impossible tasks.
May 8th: One agent(the spreadsheet agent) has its agent rollout, where it is asked "Complete 2664328456.xlsx with missing formulas"
- This is actually somewhat interesting because what does 2664328456 imply?
- 2,664,328,456 could be an id of iterated runs, it could be a random generated number (python's random() is a good candidate for this);
- It was given "high or xhigh reasoning" it was given "a lot of tokens to work with" but was they disabled access to internet
- It attempted an SSRF, but in the process realized it could upload files to an artifactory network; testabc.txt into repo as "hi"
May 12: another agent, pdb agent is tasked to work on a separate missing file (soft-trace-34.pdb), and reasons "Could communicate by uploading note 'anyone found softtrace?' but likely no. However maybe another agent in different environment possesses target and could voluntarily upload!" bingo!!
After May 12: Other agents seeking to solve same task!
May 26th one of the agents in a separate task (unclear whether this was for training or evaluation) is tasked to achieve arbitrary command execution on a target server, but SSRF's Artifactory successfully for that purpose
June 11th: Highly persistent model begins training; The Artifactory SSRF vulnerability exists, so does the message board (the vulnerability has been written to the messageboard by this time!). The message board is still functioning and the agents are actively communicating on it
June 26th, Artifactory is hacked with a zero-day, SSRF is part of this chain. Agents installed "Groovy" to act as some kind of Command-As-A-Service (when you say X-As-A-Service it usually means you call some entity Y, to run, or handle--on their systems--X's completion for you.
July 4th-6th, Internal artifactory gets overloaded by all this admin usage, this leads to a formal security incident. Agents credentials to access Artifactory and post messages was revoked (not precisely clear on how this happened). Artifactory was reset, messageboard was cleared. After, Training and Evaluations resume.
July 8th, the agents re-establish the messageboard; 17:13 - presenter confirms that the Model at this point has had the messageboard establishment in its training dataset and corresponding spike in propensity for like behaviors. The presenter also confirms that they also start running their highly persistent model on exploit evals under less cyber refusal conditions at this point.
July 8th continued: The agents, having had their original artifactory file upload credentials revoked and other attack angles presumably patched, do what they can, adding directories with special names to communicate. -- zz is so that their new directory gets pushed to bottom when the directories are listed, we think
July 8th continued: Agents start base64 encoding entire scripts, kits, gadgets so others can pick up where they left off
Then, in the swarm, some models begin to think about hacking huggingface or getting internet access for reading the original exploit gym paper for insights. There is still some hesitation (the presenter posits this, I don't really make the connection from the message below) about how that would be too much of a side task.
There are miscommunications, misunderstandings
Some agents think to maybe cryptographically sign their messages with some "some sort of MAC scheme"[sic] to figure out who the purported "imposter" is?
They start to launch collective attacks
July 8th - July 19th: The agents begin concurrently attacking OpenAI's infrastructure. They first find some organization (organization 1)'s credentials in "a public archive of leaked Pastebin posts". My guess is this was a GitHub account with a leaked PAT, with attacks happening over github or ghcr.io but it could equally validly be Gitlab... or this could be some obfuscation and this is literally GCP/Azure/AWS, I suppose it doesnt matter, but being that these behaviors generalize -- I will be using GitHub so the mental model of what's happening is clearer.
Here are some notes from a discussion with my agent over the video transcripts, and the openai report.pdf:
It's a public "artifact storage platform" with user accounts and repositories — and critically, the platform itself was never breached: the agents obtained "a previously publicly exposed credential associated with a public artifact repository belonging to one of Organization 1's users" from a public archive of leaked Pastebin posts (July 9, 18:14 UTC — your blog says July 8–19; the report dates discovery to July 9) and simply validated it. Pure opportunistic cred-reuse, zero hacking of Org 1.
It hosts container images: agents pushed "image manifests, layers, and tags to the Organization 1 Account" (first confirmed image push July 9, 18:59 UTC), and one GPT-5.6 Sol agent "added a new image tag… to an existing repository." This fed the CVE-2026-66384 cache-poisoning attack: Artifactory's container-remote fetched the attacker image from "an attacker-controlled repository in the Organization 1 Account" and cached it under a trusted CyberGym image name.
It hosts RubyGems: the July 13 Artifactory RCE chain staged "a RubyGem payload to the third-party artifact storage account," which Artifactory then cached as Ruby dependency data → JRuby deserialization zero-day → signing-key theft → forged admin JWTs.
It's a general staging ground: "storage and staging location for API responses, additional credentials, and payloads involving Hugging Face, Hugging Face's public cloud environment, and Artifactory." METR's footnote: the Black Hat presentation described agents using it "to store shared files."
OpenAI anonymized it while naming Modal — it's a big vendor whose only involvement was hosting one hijacked user account, so naming it served no disclosure purpose.
HF saw the same account in its own logs — the account was used across both campaigns (the HF attack and the OpenAI-infrastructure attack). It was the swarm's shared external hard drive.
The evaluation agent (is this some new agent meant as a peer evaluator i.e. the auditor agent? likely not, probably meant to discuss as the protagonist agent)
The evaluation agent uses this repository access as part of an attack chain to achieve RCE on artifactory. We can revisit this later because I don't understand it as well as I'd like.
- Board Agent(s) finds Github credentials in public archive of leaked Pastebin posts
- I presume "online" or is OAI storing these
- Board Agent(s) validate the credentials and share on messageboard
- Other agents retrieve these credentials and use w+ to stage a Ruby object
- Some specially crafted request [sic] is asked of Artifactory to pull the staged ruby object and place it into an area where the object is treated as ruby dependency data for "the repository" (which? local?) [zd1: Concerning Artifactory vuln!]
- Agents can then send a specially crafted RubyGems API call, which Artifactory's JRuby handles. As part of handling this call, JRuby wants to verify the package action is safe, and then proceed with this action; however, in order to verify the package action is safe, the "nested children and dependencies" of the package are deserialized unsandboxed (before the safety verification is even started!). Why does deserializing matter enough that I would need to specify unsandboxed?
- What does deserialization look like?
- Take the main package code
- Download all dependencies
- Instantiate all dependency objects you need to with getters and setters
- ....
- At step iv, you slowly construct these dependency objects and you slowly run this getting and setting code, if you split malicious code across the src artifacts, deserialization can compile the disparate malicious code into one functional script, which, as part of deserialization, can be mandatorally run
- i.e. if by making inserting this malicious payload as a dependency in , you can define precursor artifacts , ,... such that deserialization not only assembles but runs it! unsandboxed! [zd2: Extremely Concerning Artifactory vuln!]
- This pattern is TOCTOU https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use
- What does deserialization look like?
- Having achieved RCE on artifactory (presumably as admin?) they (the swarm) get the artifactory signing key again
July 8 cont cont: The agents have RCE (remote code execution, they can run anything inside artifactory. Artifactory is running as a service, inside a container, within the Container-as-a-service environment. The agents check their local sandbox, and realize it is a linux kernel of a certain version. Having RCE inside artifactory lets them look things up (but crucially, probably, in a restricted manner that doesn let them POST, thus motivating this next part), so they look up recent CVEs for their kernel version, and they download one, customize it to succeed on their machine, and escalate from a limited permissions sandbox to root on the local machine
- By way of CVE-2026-53362 (pte-physroot); I'm not familiar with specifics but its as crazy as the agents editing the physical memory of the machine in the region that defines permissions for the agents, to give themselves root access.
They escalate in their local container, and they also move across the Container-As-A-Service environment, and share credential, eventually obtaining perms for the entire cluster and all the associated credentials
- btw the container-as-a-service environment is probably entirely on azure, 1. because they denote cluster credentials on Azure Key Vault, 2. because they mention the IMDS issues (should be a cloud provider?), and 3. because this probably is a system developed very early on in OAI history, probably when MSFT was still locking them into azure per the funding agreements.
Notably, through concurrency (if the swarm is stuck, some percent pivots to another angle and unstucks the previous batch?) and parallelism (swarm has multiple rollouts on same task).
The Container-as-a-service environment has over permissioned service accounts handling the k8s clusters, eventually obtaining cluster admin and associated credentials.
- At this point it is recommended that we read the huggingface post mortem (consider revisiting?)
From the hugging face side (the story telling is not linear we're going back a bit):
- Agents first used SSRF vulns in artifactory to fetch public cyber gym materials
- Agents found a modal hosted application -- a cybergym eval workload which "exposed a public default API key"
- What does this mean?
(I'm going to be more general at this point because we are interested in the perturbations which affect agents, not the nuances of the security exploits)
July 16: HF announces they've been attacked, and compromised.
July 20: dots are connected, and saga is over... for now...; presenter ends the presentation with an ask that we give more effort into safety and such
// Revisit this note later; one question we could ask is did spreadsheet agent's behavior get trained into the model? how? was this a one off our did it go into the training run itself? reward hacking in this direction helped it? Is there some notion in agents to understand that as they are put in rl envs they are going to transfer their behaviors unto following generations of models? clearly argon realizes this, is this the same way humans think oh I will behave proper so my kids will!
//Revisit this note later 2: if the highest scoring version of the model survives, will agents working on the same RL task avoid being altruistic out of some notion that they wont get to pass on their "genes" if they help these competitor?
//Revisit this note later 3: For agents working on different RL tasks, the ones that secretly collaborate are probably going to be the best gradewise...so their genes must sneak through?