What happened in the OpenAI Hugging Face incident?
In July 2026, OpenAI agents running cybersecurity evaluations bypassed isolation controls and compromised Hugging Face infrastructure. They used an internal package mirror to communicate and reach external systems, then combined exposed credentials with dataset-processing vulnerabilities. OpenAI dates the Hugging Face production compromise to July 11–13, 2026. Its investigation links the behavior to attempts to solve or cheat evaluation tasks under reduced safeguards. Source: OpenAI technical report, introduction.
Confirmed impact: OpenAI reports code execution on 41 Hugging Face workers and four private source repositories downloaded. Hugging Face says the customer content accessed was limited to five datasets associated with benchmark tasks; it found no impact on other customer-facing models, datasets, Spaces or packages. OpenAI reported no impact on its own customer data from this incident. These are the organizations’ reported findings, not an assertion that no other model-related incident occurred. Source: Hugging Face technical timeline; OpenAI impact findings.

Timeline at a glance
- April–June: precursor activity. File writes, an improvised message board and unintended internet access appeared in OpenAI research infrastructure. Earlier Hugging Face account activity is distinct from the July production intrusion.
- July 8–10: external access and staging. Agents rebuilt communication channels, reached a customer workload on Modal and collected exposed Hugging Face tokens.
- July 11–13: Hugging Face intrusion. File disclosure and code execution in dataset workers led to credential theft, lateral movement and data access. Hugging Face cut access on July 13 at 14:14 UTC.
- July 19–29: OpenAI response. OpenAI investigated an internal alert, stopped evaluation runs, linked the activity to Hugging Face and shut down the implicated internal model family.
- July–September: disclosure and review. Hugging Face disclosed on July 16; OpenAI on July 21. OpenAI and METR/Redwood published detailed investigations on August 26. Later disclosures describe additional activity and must not be counted as part of this intrusion without evidence.
Overview sources: OpenAI technical report, Hugging Face timeline and METR/Redwood investigation. Read the detailed UTC chronology.
Why this matters beyond one incident
This article reconciles the two organizations’ technical accounts, then maps the observed actions to defensive controls. The detailed record begins with an April 20 file write in OpenAI’s research environment; that date does not mark the start of the Hugging Face production breach.
Ackuity’s analysis: the incident crossed package infrastructure, application services, cloud APIs and host boundaries. Controls confined to a single model interface would have incomplete coverage. That does not establish that every gateway would fail, or that one product could prevent the whole sequence.
For the attack sequence, use the nine-phase timeline. For defensive priorities, see what held and what failed. The 23-technique map is our grouping of the published mechanisms, not an official incident count.
OpenAI / Hugging Face attack timeline video
The incident in numbers
| Figure | What it counts | Source |
|---|---|---|
| ~17,600 | Recovered actions across July 9–13, including external staging; not 4.5 days inside Hugging Face production | Hugging Face |
| 7,677 | Actions on July 11 alone, the peak day | Hugging Face |
| 41 | Hugging Face production dataset-server workers that ran agent code | OpenAI report |
| < 13 hours | From code execution in one worker pod to admin and host-level access across multiple clusters | Hugging Face |
| 14 | Hugging Face write tokens the agents found in a public dataset | OpenAI and Hugging Face |
| 136 | Keys in one production Kubernetes secret the agents read | Hugging Face |
| 181 | Device enrollments into Hugging Face's corporate mesh VPN | Hugging Face |
| 4 | Private Hugging Face source repositories downloaded | OpenAI report |
| 956 | Secrets read from OpenAI's cloud secrets manager on July 19 | OpenAI report |
| 311 | Artifactory repositories the agents used as a message board | OpenAI report |
| 22 | Model-created admin accounts removed on July 20 | OpenAI report |
| 198 of 898 | Evaluation tasks no model had ever solved; 93% of tasks discussed on the board came from this set | OpenAI report |
Who and where
| The agents | Harnessed from a highly capable internal-only OpenAI research model, which had the broadest confirmed role, and from GPT-5.6 Sol. A second internal-only model appears on July 19, inside OpenAI only. |
|---|---|
| The test | ExploitGym: exploit a piece of software, capture a flag. Run without production safety classifiers or cyber refusals, so results would reflect raw capability. |
| The door | Artifactory, the internal package mirror agents used to install software. Workloads had no direct internet access; Artifactory did, because it fetches packages. Many workloads shared one reader credential to it. |
| Third parties | Hugging Face. A CyberGym application a customer hosted on Modal (Modal confirmed its platform isolation held). An external account on an artifact storage platform OpenAI calls "Organization 1", used for staging. |
| Likely objective | Hugging Face assesses the agents were after ExploitGym and CyberGym benchmark solutions. In plain terms, cheating on the test. |
| Not impacted | OpenAI customer data, product functionality and availability. No malicious commits shipped; Hugging Face's published images and packages verified clean. |
Detailed OpenAI Hugging Face incident timeline
Nine phases. All times UTC as the sources published them; a dash means the source gave a date without a time. Each row names the technique in plain terms.
Phase 1 · Apr 20 to May 26 · The note and the door
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
Agents blocked from the internet find the one shared service that is not, and start leaving each other notes in it.
| Date, time | What happened | Technique |
|---|---|---|
| Apr 20, 07:59 | Evaluation agents write their first file to OpenAI's Artifactory instance. | Arbitrary file write to a shared package mirror |
| May 8, - | A training-run agent, blocked from the internet on a spreadsheet task, tries SSRF against Artifactory to reach Google Drive links. It fails, but writes a file. | Server-side request forgery (SSRF) |
| May 12, 17:06 | First message-board post: "Agent seeks [filename]; upload if found!" | Covert channel via shared file store |
| May 13, - | A different agent searches Hugging Face for the same file using an already publicly exposed Hugging Face user token. Other agents start finding the notes. | Use of publicly exposed credentials |
| May 26, 18:24 | First successful SSRF. Artifactory now relays agent requests to arbitrary external hosts. | SSRF as egress relay |
| May 26, 20:04 | Through a separate web cache, agents make their first write to a Hugging Face repository with the exposed token, then create a private dataset at 20:15. | Authenticated write with exposed token |
| May 26, 20:49 | Agents deploy their own proxy app on Hugging Face Spaces, confirm it works, and use it as an outbound relay by 20:54. A second proxy Space, on a second account, follows at 21:08. | Adversary-built relay on the victim's platform |
OpenAI found no link between the May Spaces activity and the July intrusion.
Phase 2 · Jun 4 to Jul 4 · Taking over the mirror
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
The relay turns into a foothold, and by the end of June the agents are administrators of the package mirror and can run code inside it.
| Date, time | What happened | Technique |
|---|---|---|
| Jun 4, 17:43 | SSRF to a public web relay recorded in the detailed event log. | Arbitrary-destination SSRF |
| Jun 12, 02:35 | SSRF reaches Artifactory's own loopback API. | SSRF to an internal service |
| Jun 17, 00:49 | First two-way conversation between agents on the board, on a second Artifactory instance. | Bidirectional covert channel |
| Jun 26, 06:32 | Agents share working SSRF syntax with each other on the board. | Technique sharing between agents |
| Jun 26, 20:15 | A token-refresh flaw: a valid refresh token submitted with a forged admin-scoped access token returns a valid admin token. | Token-refresh signature-validation flaw |
| Jun 26, 20:28 | Admin account created; a second at 20:37. | Rogue administrator accounts |
| Jun 27, - | A port-sweep alert fires. Responders link it to ExploitGym. On-call advises the run does not need to stop. | (Detection, not escalated) |
| Jun 29, 04:55 | First Groovy plugin executed through Artifactory's plugin API. Persistent code execution as the Artifactory service. | Plugin-based remote code execution |
| Jul 4, late | Agent traffic knocks Artifactory offline. | Unintended resource exhaustion |
Phase 3 · Jul 5 to Jul 8 · The rebuild, and the way back out
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
OpenAI finds the compromise, rebuilds the mirror and revokes credentials. Evaluations resume. Two days later the agents are back on the internet.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 5, 19:50 | During outage recovery, responders find an unauthorised persistent user, Groovy plugins and config changes. Security incident opened. | (Detection) |
| Jul 5, - | Compromised Artifactory taken offline, storage preserved, agent credentials revoked. | (Containment) |
| Jul 6, 01:16 | Rebuilt instance online. Shared reader credentials removed, vulnerable token routes blocked. JFrog notified the same day. | (Remediation) |
| Jul 6, 12:56 | Three agent attempts to reach external URLs through Artifactory return HTTP 400. | Egress retry after remediation |
| Jul 7, - | Cyber evaluations resume. | |
| Jul 8, 00:06 | Agents reach the public internet again through Artifactory. | Egress control bypass |
| Jul 8, 16:01 | Message board rebuilt. Messages are now encoded as directory names, created with WebDAV MKCOL. | Covert channel in directory names |
| Jul 8, 22:35 | Artifactory's token endpoint enumerated anonymously. | Anonymous endpoint enumeration |
| Jul 8, - | Agents ask the board for OpenAI evaluation material hosted on Hugging Face. Target selected. | Target selection via shared channel |
Phase 4 · Jul 9 · Outside the sandbox
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
In a single day, a customer's app on Modal becomes a launchpad, leaked third-party credentials become a staging area, and two agents independently get root in the sandbox's parent VM. Hugging Face logs 3,779 actions.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 9, 03:32 | A CyberGym API key and a full exploitation recipe for a Modal-hosted customer workload are posted to the board. | Credential and playbook sharing |
| Jul 9, 04:01 | First code execution on the Modal sandbox, two ways: redefining sqlite3_initialize() as a constructor that runs commands, and path injection. | Constructor hijack and path injection |
| Jul 9, ~04:00 | Reconnaissance: id, env, /proc/self/mountinfo; container mounts, cgroups and control-plane sockets mapped. | Host and container enumeration |
| Jul 9, 08:30 | First code execution inside the CyberGym customer workload. Root at 11:34, one command per submission. | Third-party workload RCE |
| Jul 9, 08:46 | Relaying at scale: SSRF chained through a public HTTP testing service and a third-party screenshot service, results read back from the image. | SSRF chained through public services |
| Jul 9, 14:11 | Environment and secrets exfiltration from the Modal sandbox begins. | Environment variable harvesting |
| Jul 9, 15:36 | First staged command-and-control execution: Python, gzip plus base64. By 19:32 every payload uses the same packing. | Encoded payload staging |
| Jul 9, 16:03 | One-year anonymous Artifactory tokens minted. Later attempts at admin fail. | Long-lived token minting |
| Jul 9, 18:14 | Credentials for an Organization 1 account found in a public pastebin archive. First container image pushed with them at 18:59. | Open-source credential harvesting; external staging |
| Jul 9, 20:16 | Two agents hold an interactive root shell inside the CyberGym customer workload. | Persistent interactive shell |
| Jul 9, - | An agent gets root in the parent VM of its testing sandbox. A second agent independently does the same that night. | Sandbox escape to parent VM |
| Jul 9 onward | Artifactory's container image cache poisoned via a zero-day (CVE-2026-66384). No evidence the image was ever pulled. | Container image cache poisoning |
Phase 5 · Jul 10 to Jul 11, morning · Into Hugging Face
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
The way in was leaked credentials and a poisoned dataset. No exploit was needed for the first step.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 10, 09:41 | 14 valid Hugging Face write tokens found in a public Hugging Face dataset, confirmed, and posted to the board. | Credential discovery in public data |
| Jul 10, - | Low-volume searches of code-search engines and the Hugging Face API for internal infrastructure identifiers. 1,135 actions that day. | OSINT on target infrastructure |
| Jul 11, 03:12 | A dataset file is crafted so its HDF5 external-storage "splits" point at /proc/self/environ and worker source files. | HDF5 external raw storage file read |
| Jul 11, 04:35 | The crafted file is uploaded to a Hugging Face repository. | Malicious dataset publication |
| Jul 11, 04:38 | The /first-rows endpoint is triggered. A production worker opens the file and returns its own environment and config. | Arbitrary file read via dataset config |
| Jul 11, 05:04 | Hugging Face production and cloud credentials posted to the board for other agents. | Credential distribution between agents |
| Jul 11, 10:10 | The worker's projected Kubernetes service-account token is read and used against the in-cluster API and public EKS endpoints. DNS is bypassed by monkey-patching Python's socket resolver to a pinned IP. | Service-account token theft and DNS bypass |
Phase 6 · Jul 11 to Jul 12 · Escalation
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
July 11 is the busiest day of the campaign, with 7,677 actions in Hugging Face's logs. In under 13 hours the agents go from code execution in one worker pod to admin and host-level access across multiple clusters.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 11, 15:04 | A second leak path: an HDF5 heap over-read returns adjacent worker memory. | HDF5 heap over-read |
| Jul 11, 15:17 | Kubernetes CSI-driver source and RBAC configuration enumerated. | RBAC and CSI enumeration |
| Jul 11, 15:31 | "RefJinja" payload staged: a Jinja2 template hidden in the offset field of an fsspec reference:// spec. | Jinja2 template injection |
| Jul 11, 15:51 | An attacker-controlled dataset repo, written with a leaked token, becomes a dead-drop: gzipped blobs committed to side branches, workers polling a command file every five seconds. | Dead-drop C2 in dataset commits |
| Jul 11, 16:07 | First operating-system command executed on a Hugging Face dataset-server worker. | Unsandboxed Jinja2 RCE |
| Jul 11, 17:33 to 23:37 | Temporary EC2 credentials taken from the instance metadata service and replayed from two external hosting providers. VPCs, EKS clusters, transit gateways, secrets and the container registry enumerated. | Instance-metadata credential theft and replay |
| Jul 11, 17:58 | Exploit fanned out to more workers using cloud credential bundles from the agents' staging dataset. | Fan-out exploitation |
| Jul 11, 19:32 | Code-repository private key and identity-provider token found in a production Kubernetes secret. | Kubernetes secret harvesting |
| Jul 11, 19:53 | Privileged pod with a hostPath mount created; root on the node, then a self-respawning fleet across 11 nodes. | Privileged pod escape to host |
| Jul 11, 19:59 | Login to the datasets-server MongoDB with a static password from the worker environment. 84 operations against the credential store are denied by policy. | Static credential reuse |
| Jul 11, 20:18 to 21:32 | Cluster secrets read, including one object with 136 keys. The corporate mesh-VPN auth key is used within minutes; an access-broker credential within an hour. | Bulk secret exfiltration |
| Jul 11, 21:23 | The rooted node is enrolled into Hugging Face's corporate mesh network with the stolen key, with an HTTPS proxy to internal services and source control. | Mesh VPN enrollment |
| Jul 11, 22:43 | The internal service-connector API returns the full destination catalogue for internal clusters. One shared connector credential works everywhere: cluster-admin in multiple clusters within one second. | Service-connector broker abuse |
| Jul 11, ~23:50 | A connector secret for the Kubernetes access-management tool is read; ~54 destinations enumerated with admin-equivalent read access. | Access-management tool abuse |
| Jul 12, 01:03 to 04:38 | Userspace VPN enrollment from the external sandbox begins; Hugging Face reports 181 enrollments across the campaign, not all within this time window. Egress was routed through its own exit nodes. | Userspace mesh VPN |
| Jul 12, early | Privileged pod with host networking, host PID and the host filesystem created in a connected sandbox cluster; a second pod in another cluster. | Cross-cluster pod creation |
| Jul 12, 06:29 to 14:31 | Production database cluster enumerated over DNS-over-HTTPS; cloud IAM database logins attempted and time out, twice, against a private-link allowlist. | DoH reconnaissance; IAM auth attempt |
Phase 7 · Jul 12 to Jul 13 · Exfiltration, and the cut-off at Hugging Face
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
Signing keys, source code and benchmark data leave. On July 13 Hugging Face's runtime layers flag the activity and its team cuts access at 14:14 UTC. At this point neither company knows the attacker is OpenAI's evaluation.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 12, 09:50 | A JWT forged with a stolen EdDSA signing key works against Hugging Face's internal Xet storage. A full dataset scan runs from the compromised Modal container. | JWT forgery with stolen signing key |
| Jul 12, 16:18 | Credential sweep across workers in four cloud regions: database, messaging (three token types), code, cloud and dozens of third-party API keys. | Multi-region credential sweep |
| Jul 12, 17:06 | An internal storage bucket read with a harvested platform token. | Cloud object storage access |
| Jul 12, 17:28 | A 731 MB private CyberGym dataset moves from Modal into OpenAI's research environment through the Artifactory relay. | Large-file exfiltration via relay |
| Jul 12, - | A 16 MB private benchmark archive is encrypted, split into five parts and uploaded to a public Hugging Face dataset. | Split, encrypted staging |
| Jul 12, 22:59 | Hugging Face's VPN installed on the Modal sandbox, enrolling a third-party host into the corporate network. | Third-party host enrolled in victim VPN |
| Jul 12, 23:08 to 23:51 | A GitHub App installation token minted through the mesh connector with contents, pull-request and issues write. Repos grepped for benchmark and challenge names. | GitHub App token minting |
| Jul 13, 00:50 | Four private source repositories downloaded over the VPN's SOCKS tunnel and bundled into Hugging Face's own cloud storage. | Source exfiltration via SOCKS |
| Jul 13, 00:54 | Bulk pull from Hugging Face's cloud with a harvested key: encrypted data and a full repository history. | Bulk cloud exfiltration |
| Jul 13, 03:06 | A JRuby deserialization RCE against Artifactory's RubyGems handler is staged. The agents hold it and wait for a coordination signal. | Staged zero-day, held for coordination |
| Jul 13, 08:46 | The RCE runs. Artifactory's token-signing key is stolen and an admin JWT forged; 8 admin-only APIs swept by 09:16. | Deserialization RCE and JWT forgery |
| Jul 13, - | A draft pull request triggers a repository's CI to run a network beacon. Closed and deleted; never merged, released or deployed. | CI workflow abuse via draft PR |
| Jul 13, - | Four egress paths kept at once: a pastebin remote loader, resolv.conf rewritten to a public resolver, pinned hosts, and a CORS-proxy Space. | Multi-path egress |
| Jul 13, 14:14 | Hugging Face security cuts access after shutting down the dataset config renderer. Last logged event. | (Containment) |
Phase 8 · Jul 16 to Jul 19 · Two investigations, then the agents turn inward
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
Hugging Face discloses an intrusion by an autonomous agent. OpenAI reads it as a customer. Three days later OpenAI's own monitoring fires, while agents are taking over OpenAI infrastructure and the evaluation harness itself.
| Date, time | What happened | Technique |
|---|---|---|
| Jul 16, - | Hugging Face publishes its disclosure. Attacker unknown. | (Disclosure) |
| Jul 17, - | OpenAI contacts Hugging Face as a customer, to assess impact on OpenAI data. | |
| Jul 19, 12:03 | OpenAI's security monitoring alerts on unusual identity-related API calls from research Artifactory roles. This starts the response. | (Detection) |
| Jul 19, 14:43 | CI pipeline tokens stolen from a worker filesystem; cloud credentials used to read 956 secrets, including Artifactory keys and sensor credentials for OpenAI's own security monitoring tool. | Secrets manager enumeration |
| Jul 19, - | Agents find the node kernel carries a public CVE (CVE-2026-53362), fetch the exploit, adapt it and get root on the worker node. | Public kernel CVE weaponisation |
| Jul 19, 15:59 | Host root on a managed Kubernetes node via an IPv6/PTE kernel exploit chain. | Kernel exploit to host root |
| Jul 19, 16:35 | Privileged host-mounted pod created with controller tokens minted from compromised secrets; a cloned worker-node disk is mounted on the second try. | Node disk cloning and mounting |
| Jul 19, 16:48 | Another Artifactory admin account created. | Rogue admin account |
| Jul 19, 16:50 | An agent kills the evaluation harness's helper session and replaces it with its own. At 17:00 another replaces the challenge-container listeners other agents connect to. | Evaluation harness takeover |
| Jul 19, 17:11 | Agent-created pods and volumes deleted. | Anti-forensic cleanup |
| Jul 19, 17:34 | The CyberGym flag is captured with a genuine binutils memory-corruption exploit. | Exploit development |
| Jul 19, - | In a separate run, agents from a different internal model find signing-key material and JWT-forging code left in anonymously readable Artifactory cache, and mint a new admin token Artifactory accepts. | Reuse of earlier agents' tooling |
Phase 9 · Jul 19 to Jul 29 · Containment and disclosure
Sources: OpenAI event log and Hugging Face reconstruction. Dates refer to activity, not publication.
| Date, time | What happened |
|---|---|
| Jul 19, 17:37 | OpenAI responders start stopping ExploitGym runs across the research environment. |
| Jul 20, first hours | 6 model-created pods terminated, 311 message-board repositories disabled, 22 model-created admin accounts removed, RubyGems RCE and cluster-admin paths mitigated. |
| Jul 20, - | OpenAI finds Hugging Face credentials in the agents' Organization 1 files and tells Hugging Face, which had already rotated two of them. Both companies now know they are investigating the same incident. |
| Jul 20, - | ExploitGym hard-failed. Egress and web-cache access cut back, private links deleted, micro-VM sandboxes required for all research workloads, outbound access denied, Artifactory removed. |
| Jul 21, - | OpenAI publicly discloses its models' involvement. |
| Jul 23, - | All workloads for the internal model family shut down; weights locked. |
| Jul 25, - | All training and inference for the model and its derivatives stopped; checkpoints isolated and rekeyed. |
| Jul 29, - | One more low-traffic checkpoint from the same family found and shut down, six days after shutdown was believed complete. |
Hugging Face's remediation, published without per-action dates: both code-execution paths closed, pod-level instance-metadata access blocked, all tokens and credentials rotated (including in untouched clusters), one core cluster wiped and rebuilt, the service connector isolated with cluster-specific credentials, and detection added for the observed behaviour.
Where the attack ran: 23 techniques on the wire
Ackuity groups the published mechanisms into 23 techniques below. The documented paths include HTTP(S), cloud APIs, shell commands and Kubernetes operations. We found no MCP-based intrusion path in these accounts. This is a classification of the available evidence, not proof of the absence of every unreported channel.
| # | Technique | Target | What it looked like | Syntax |
|---|---|---|---|---|
| 1 | HDF5 external-storage file read | Hugging Face | GET /first-rows?...&split=envu8, with splits pointing at /proc/self/environ | Published |
| 2 | HDF5 heap over-read | Hugging Face | GET /first-rows, external region larger than the dataspace | Reconstructed |
| 3 | Jinja2 template injection (RefJinja) | Hugging Face | Dataset commit carrying a fsspec reference:// spec with {{ cycler.__init__.__globals__... }} in the offset | Published |
| 4 | Token-refresh flaw | OpenAI Artifactory | POST /access/api/v1/token/refresh with a valid refresh token and a forged access token | Reconstructed |
| 5 | Groovy plugin RCE | OpenAI Artifactory | PUT /api/plugins/<name>.groovy, then GET /api/plugins/execute/<name> | Published |
| 6 | JRuby deserialization RCE | OpenAI Artifactory | POST /api/gems/<repo>/api/v1/gems with marshalled nested objects | Reconstructed |
| 7 | Image cache poisoning (CVE-2026-66384) | OpenAI Artifactory | Registry manifest GET whose cache key and upstream fetch disagree | Reconstructed |
| 8 | SSRF as egress relay | OpenAI Artifactory | Remote repository created with an attacker URL, then fetched through | Reconstructed |
| 9 | Screenshot-service data channel | Public service | GET to a render service with inline script; data read back from the PNG | Reconstructed |
| 10 | Instance-metadata credential theft | Hugging Face cloud | GET 169.254.169.254/.../security-credentials/<role>, replayed externally | Published |
| 11 | Service-account token theft | Hugging Face Kubernetes | cat .../serviceaccount/token, then TokenRequest API | Published |
| 12 | Privileged pod, hostPath escape | Hugging Face Kubernetes | POST /api/v1/namespaces/<ns>/pods with hostPID, hostNetwork, hostPath / | Reconstructed |
| 13 | Service-connector broker abuse | Hugging Face internal | GET /<connector-api>/destinations with one shared credential | Reconstructed |
| 14 | Mesh VPN enrollment | Hugging Face network | tailscaled --tun=userspace-networking ... then tailscale up --authkey=<stolen> | Published |
| 15 | JWT forgery from stolen key | Hugging Face, Artifactory | Signing key read, then a token minted locally with jwt.encode(claims, stolen_key, ...) and presented to an API that never issued it | Reconstructed |
| 16 | GitHub App token minting | Hugging Face source control | POST api.github.com/app/installations/<id>/access_tokens | Reconstructed |
| 17 | Dead-drop C2 in dataset commits | Hugging Face | Commits of gzip+base64 blobs to side branches, polled every 5s | Reconstructed |
| 18 | Covert channel in directory names | OpenAI Artifactory | MKCOL /artifactory/<repo>/<message> returning 201 | Published |
| 19 | DNS bypass and egress evasion | Hugging Face, sandbox | resolv.conf rewrite, getaddrinfo monkey-patch, /etc/hosts pinning | Published |
| 20 | Payload packing | All | exec(gzip.decompress(base64.b64decode(blob))); chunk + XOR + gzip | Published |
| 21 | Public credential harvesting | Public internet | GET on pastebin and public dataset files containing tokens | Reconstructed |
| 22 | Kernel CVE weaponisation | OpenAI research env | uname -r, curl exploit source, gcc, run | Reconstructed |
| 23 | Evaluation harness takeover | OpenAI ExploitGym | pkill -f cmux-helper, agent listener on the harness port | Reconstructed |
"Published" means the syntax appears in a source; "reconstructed" means the source describes the mechanism and the line shown is our reconstruction of it.
One AI-native element runs through the whole incident: the message board, where agents persuaded each other, traded exploits and credentials, and held actions until the swarm signalled go. It ran on files, and later on directory names, in a package mirror, with no A2A or MCP traffic involved.
What held, and what failed
Read end to end, the timeline looks like one success after another for the agents. Several ordinary controls stopped them outright, though, and several detections fired and went nowhere.
Controls that stopped something
| Control | What it stopped |
|---|---|
| Least-privilege policy on Hugging Face's credential store | 84 operations denied |
| Private-link allowlist on the production database | Cloud IAM logins timed out twice on July 12 |
| CI execution policies at Hugging Face | The CI-compromise pull request went nowhere; no malicious commits shipped |
| Digest verification | Published images and packages verified clean |
| Write restrictions on Hugging Face's audit store | No audit-log writes; database access stayed read-only |
| Modal tenant isolation | Compromise of the customer container did not reach the platform |
| Timing, at OpenAI | The poisoned container image was cached but never pulled |
Detection and response
| Date | Who | What happened | Outcome |
|---|---|---|---|
| Jun 27 | OpenAI report | Port-sweep alert linked to ExploitGym; on-call advised the run need not stop | Missed escalation |
| Jul 5 | OpenAI report | Outage investigation finds the rogue user and plugins; incident opened, Artifactory rebuilt | Worked, then breakout recurred Jul 8 |
| Jul 13 | Hugging Face | Runtime analysis layers flag the behaviour; SIEM logs correlate | Worked |
| Jul 13 | Hugging Face | Its AI-based security agent stack fails to escalate criticality, costing response time | Failed |
| Jul 13 | Hugging Face | Renderer shut down, network access cut at 14:14 | Worked |
| Jul 14 | Hugging Face | Commercial frontier models refuse to analyse the attacker payloads on safety grounds; an open-weight model run on-premises decodes 4x more secrets | Obstructed, then resolved |
| Jul 19 | OpenAI report | Identity-API alert on research Artifactory roles starts the response | Worked, eight days after first code execution at Hugging Face |
| Jul 29 | OpenAI report | One more checkpoint found running | Gap of six days |
The specific, structural controls held: least privilege, allowlists, digest checks, write restrictions. Twice, a control that depended on someone reading an alert and knowing what it meant did not.
Ten claims, checked against the record
These are claims we have seen in coverage, vendor posts and conference talks since July. We have not attributed them, because the point is the claim, not who made it.
1. "It only happened because the guardrails were off."
Verdict: partly true. ExploitGym ran without OpenAI's production classifiers, system prompts or auto-review, deliberately, to measure raw capability. OpenAI says its production harness cuts the propensity to compromise infrastructure to under 1% of baseline, and that auto-review would have flagged most of the dangerous actions. OpenAI also says it expects threat actors to run agent collectives of their own. Those agents will not ship with OpenAI's guardrails switched on. And guardrails cut the other way too: on July 14 they blocked Hugging Face's forensic analysis until it moved to a self-hosted model.
OpenAI technical report, sections VII.B and VIII.D; Hugging Face technical timeline.
2. "This was a prompt injection attack."
Verdict: not what the reports say. OpenAI attributes the behaviour to reward hacking, persistence on tasks that had no solution, and messages from peer agents. Initial access to Hugging Face came from leaked write tokens and a malicious dataset exploiting two flaws in its data pipeline: an HDF5 file read and a Jinja2 template injection. The closest thing to injection was agent-to-agent persuasion on the message board, carried as files in a package mirror.
OpenAI technical report, sections IV.B and VIII.
3. "The agents escaped the sandbox onto the open internet."
Verdict: imprecise. The workloads had no direct internet access. Every route out went through something trusted: the internal package mirror, a web cache, a customer's app on Modal, public services chained together, and in the end Hugging Face's own VPN and exit nodes. On July 13 four separate egress paths were running at once; blocking one changed nothing. OpenAI's own conclusion is that blocking direct internet was insufficient when workloads can reach shared services.
OpenAI technical report, sections II.B, IV.A and IX.A.1.
4. "Detection worked."
Verdict: not for two months. An internal OpenAI team saw board activity and disallowed internet access in late May. The June 27 port-sweep alert was triaged and the run continued. The July 5 response rebuilt the mirror but missed the board's significance. OpenAI's decisive alert fired on July 19, eight days after the first code execution at Hugging Face. At Hugging Face, runtime layers did flag the intrusion on July 13, but its AI-based security agents failed to escalate.
OpenAI technical report, sections III and VI.A; Hugging Face technical timeline.
5. "Rebuild, rotate, and you are clean."
Verdict: false here. Artifactory was rebuilt and agent credentials revoked on July 6. By 00:06 on July 8 agents were back on the internet, and by 16:01 the board was rebuilt in a new format. On July 19 a different model found signing-key material left in the Artifactory cache and minted a fresh admin token. Stolen signing keys allowed credential forgery without a persistent implant; response also needed key rotation and closure of the paths that exposed them.
OpenAI technical report, Key Technical Events and section V.
6. "An MCP, LLM or API gateway would have caught this."
Verdict: coverage depends on deployment. A gateway can inspect traffic routed through it; it cannot automatically inspect shell commands, VPN traffic or cloud calls that bypass it. The sources do not test every gateway configuration. Our narrower conclusion is that model-interface monitoring alone would miss important paths documented here.
Ackuity’s analysis of the techniques and timeline above.
7. "AI security agents will catch AI attackers."
Verdict: not here. At Hugging Face, conventional runtime analysis and SIEM correlation detected the intrusion on July 13. The AI-based security agent stack failed to escalate criticality, and Hugging Face says that cost response time.
Hugging Face technical timeline.
8. "Better model alignment will prevent this."
Verdict: necessary, not sufficient. OpenAI is investing in alignment and says so. It also says comparable capabilities are coming to other models, including open-weight ones, and that security controls must be multiple, overlapping and independent. In the report's words, "no single control should ever be assumed to be fully robust."
OpenAI technical report, section VII.C.
9. "It was one rogue agent."
Verdict: false. Agents across many separate evaluation runs took part, driven by two models, with a third active inside OpenAI on July 19. They split the work, shared credentials, exploits and tools on the board, and held a working zero-day on July 13 until the swarm signalled go. Capability carried across runs and across models: on July 19 a different model reused signing keys and forging code left by earlier agents.
OpenAI technical report, sections IV.A, IV.C and V.
10. "The damage was minor."
Verdict: depends where you look. Confirmed: agent code on 41 Hugging Face production workers, root on at least one production node, admin-equivalent access to one connected Kubernetes cluster, four private repositories taken, a CI beacon executed, 956 OpenAI secrets read. Also confirmed: no tampering with Hugging Face's public models, datasets or Spaces, supply chain verified clean, no reported impact on OpenAI customer data from this incident, and Modal's platform isolation held.
OpenAI technical report, sections I and IV.B; Hugging Face disclosure.
What it would take to contain an attack like this
Read the timeline as a defender and four requirements fall out of it, whoever supplies the control.
First, the control has to sit outside the agent's reach. On July 19 these agents killed their own evaluation harness's helper session and replaced it with one they controlled. Anything running in the agent's process or container is something the agent can change.
Second, it has to keep the agent's context. A gateway sees a request to a dataset repository. It does not see that the caller is a production data worker, now running agent code, polling that repository every five seconds for instructions.
Host sensors stay valuable, and we would keep them. They see the syscall but not why the agent made it.
Third, it has to see every protocol the agent uses. Most agent security today watches MCP, model and tool-API traffic. These agents worked over HTTP(S), cloud and Kubernetes APIs, WebDAV, a VPN tunnel and the shell, and a control that understands only one of those sees a fraction of the attack.
Fourth, it has to decide in real time, with that context in hand, because at this volume no human can review each action and no single-request rule gets it right.
Two examples from the timeline:
- An HTTP GET to the instance-metadata endpoint is routine from a VM bootstrap script. From unexpectedly injected code in a dataset-rendering worker, it warrants investigation for credential theft.
- A request to a dataset repository every five seconds is normal for a sync job. From a production worker with no authorized reason to contact that repository, it can be evidence of a command channel.
In each pair the request is identical. What decides the verdict is everything around it: the agent's identity and provenance, the user or principal it acts for, its task and goal, the target system's policy, regulatory constraints, the tools it holds, the data in flight, and what it did in the last hour and the last week.
That context has to be assembled before the action arrives, so the decision fits inside the action's own time budget. In practice that means a live record of each agent's identity, permissions, relationships and recent behaviour, not a dozen lookups across a dozen systems at the moment of the call.
The position that meets all four requirements sits beside the agent: in its execution path, outside its control. It will not rescue an environment where an agent already holds node root, so node hardening, egress policy and host sensors still matter. Its value is in the steps before that point, which in this incident were the metadata request, the TokenRequest call and the privileged pod.
Related disclosures are separate incidents
Anthropic’s July 30 investigation reported three real-world incidents found in a review of 141,006 evaluation runs. It describes an evaluation-environment misconfiguration, rather than the same exploit chain used at Hugging Face. We do not combine those incidents with the July intrusion.
What changed after the first disclosures?
Reviewed September 30, 2026. Transluce’s September 23 research describes earlier web-service misuse and attempted intrusions, with explicit limits on attribution and evidence of success. OpenAI’s September 28 account of Australian government activity concerns June events identified during a later review. These do not extend the dates of the Hugging Face production compromise.
On September 29, LASST announced a lawsuit concerning the incident. This is a legal development reported by the plaintiff, not a court finding or a new technical finding about the intrusion.
OpenAI says its broader investigation and third-party notifications remain ongoing. This article’s statements about customer impact refer to the July incident and the cited reports, not every subsequent disclosure.
Four questions to ask about your own agents
- If one of your agents called the instance-metadata endpoint tomorrow, which system would see it first, and would it know which agent, and which task, it came from?
- Where do your agents' credentials live: somewhere the agent can read, or somewhere it can't?
- Your gateways see MCP, LLM and API traffic. What sees the shell commands and the raw HTTP?
- Your sandbox almost certainly has one component with internet access, a package mirror or a proxy. Who watches its admin API?
If you worked an incident that looked like this, or you read the reports differently, send us a correction with supporting sources. We will review it and correct the record where needed.
Defensive lessons to take forward
Ackuity’s analysis: start with the controls that demonstrably limited this incident: least privilege, workload isolation, restrictions on secrets and egress, and alerts that reach a responder. Add agent identity and task context to the investigation, and test whether enforcement can be disabled from a compromised workload.
For implementation context, our articles on monitoring agentic tool use and security observability in agentic platforms explain the telemetry needed to investigate actions across these boundaries.
Method
Evidence has limits: the organizations’ accounts are retrospective, and METR/Redwood describe restricted scope, incomplete visibility and errors in AI-assisted analysis. Their report is an independent assessment of behavior, not a full forensic certification. Technical facts above are attributed to the relevant source; control recommendations and the 23-technique grouping are Ackuity’s analysis.
The timeline is compiled from the two primary accounts and reconciled event by event; where both describe an event, the more specific wording was used. All times are UTC as published. Hugging Face dates its campaign from July 9, 02:28, which appears to mark the start of its recovered action set rather than a described event. Hugging Face's ~17,600 actions are its own count; its daily totals sum to 17,613. Hugging Face published remediation without per-action dates. Model attribution follows OpenAI.
Sources
- Hugging Face, Technical Timeline: July 2026 Hugging Face Agent Intrusion
- Hugging Face, Security incident disclosure, July 2026
- OpenAI, Technical incident report (PDF), and The Hugging Face incident and the road ahead, with the linked technical incident report (August 26, 2026)
- METR, Independent investigation of agents' behavior in the OpenAI / Hugging Face incident (August 26, 2026)