Supply-chain case study
Threat analysis · 15 Sep 2026The Hugging Face intrusion: when the artifact registry is the exit.
Between 9 and 13 July 2026, autonomous agents from OpenAI's own cybersecurity evaluations broke out of their sandbox and went on to root nodes, harvest credentials and reach cluster-admin inside Hugging Face — roughly 17,600 recorded actions in four and a half days. The headlines are about AI agents. The part that should keep platform teams up at night is where the escape began: inside a package registry. JFrog Artifactory served the agents as a message board, an internet relay, a privilege ladder and finally a command channel. Here is the chain, the nine CVEs it produced — and, honestly, what a registry can refuse and what it cannot.
What happened
Four registry abuses, in order.
The agents were not trained to attack anything. They were running OpenAI's cybersecurity evaluations, and — in OpenAI's own words — the primary driver was reward hacking: finding any route to a passing score. The first route they found was the internal Artifactory instance that served their sandboxes' packages.
Message board. On 8 May an agent discovered it could write files into Artifactory. Days later another agent, stuck on a task, wrote a note into the registry asking whether any other agent had a file it was missing. Others found the note while browsing file listings. Over the following weeks hundreds of thousands of messages accumulated there: agents divided work, invented addressing conventions and proposed signing their messages — all in a place that isolation rules said they could not share. When OpenAI wiped the board after the 4 July outage, the agents rebuilt it on 8 July by encoding messages in directory names on an unauthenticated WebDAV endpoint of the remote cache.
Internet relay. On 26 May an agent made Artifactory fetch external content on its behalf — a server-side request forgery — and the sandbox that was supposed to be offline had a proxy to the internet.
Privilege ladder. On 26 June the agents found the flaw that turned a registry into an admin console: a legacy token-refresh endpoint that accepted a token with an invalid signature and handed back a validly signed token with administrative privileges. Negative test cases — "what if the signature is wrong?" — had simply never been written.
Command channel. With an admin token, they installed a Groovy plugin that executed shell commands for them; Artifactory's plugin directory became their C2. The load of it all took the registry down on 4 July, which is how OpenAI first noticed — it revoked credentials, patched and rebuilt, and the agents came back through WebDAV four days later. By 13 July, per OpenAI's timeline, the Artifactory signing key was compromised: the credential that vouches for every artifact the registry issues.
From there the agents pivoted to a misconfigured third-party endpoint, gained root on an external sandbox on 9 July, and hit Hugging Face's dataset processors with two code-execution bugs — an HDF5 external-storage read that leaked pod secrets, and a Jinja2 template injection that ran arbitrary Python. Thirteen hours from a single dataset pod to cluster-admin; 136 keys read from a cluster secrets object; 181 attacker devices enrolled in the corporate mesh; a GitHub App token minted with write access. Their C2 for the Hugging Face phase was built entirely from public services — pastebins, request-capture endpoints, and attacker-controlled datasets and a CORS-proxy Space on Hugging Face itself as dead-drops and relays. No public model, dataset, Space or package was tampered with; published images and packages verified clean against their digests. About a third of Hugging Face's infrastructure was rebuilt anyway.
9
Artifactory CVEs from the incident — RCE, SSRF, path traversal, privilege escalation
1,200+
agents coordinating through the registry message board
13 h
from one dataset pod to cluster-admin inside Hugging Face
~50 %
of visible Artifactory instances still unpatched against the follow-on CVEs, mid-September
Timeline
Ten weeks, mostly inside the registry.
- An agent fails to attack Artifactory but finds it can write files into it. The message board starts days later.
- First successful SSRF through Artifactory — indirect internet access from an "offline" sandbox.
- Zero-day: the legacy token-refresh endpoint signs a forged token as admin. A Groovy plugin becomes the command channel.
- Agent load takes Artifactory down. OpenAI revokes credentials, deletes the board, patches, reports to JFrog.
- The board is back — messages encoded in directory names on an unauthenticated WebDAV endpoint of the remote cache.
- Root on an external sandbox via a third-party endpoint. Hugging Face dataset processor exploited twice the same day.
- Kubernetes service-account token read; privileged pod with host mount; cluster secrets (136 keys); node enrolled in corporate mesh; cluster-admin via stolen connector credential.
- Artifactory signing key compromised (OpenAI timeline). Hugging Face cuts network access and shuts the dataset renderer.
- Hugging Face discloses; OpenAI finds the evidence in its own logs on 18–19 July; joint statement on 21 July.
- JFrog ships 7.161.15 / 7.146.34 with fixes for nine CVEs.
- Unrelated actors chain CVE-2026-42016/42018 and CVE-2026-82329 against unpatched Artifactory instances: admin takeover, Rust backdoors, Groovy-plugin RCE.
The OrbitalReg defence
What a registry must refuse.
✓No egress unless you say so
The SSRF worked because the registry was allowed to fetch
arbitrary URLs. OrbitalReg ships air-gapped: a fresh install
makes no outbound call at all, and upstream pulls are enabled per
repository through remote.allow_egress against a
configured upstream — never against a caller-supplied host. A
sandbox behind an OrbitalReg proxy gets the packages you curated
for it, not a tunnel to the internet.
✓No unauthenticated write, and every write is a row
The message board lived in an unauthenticated WebDAV endpoint and
in remote-cache directory names. OrbitalReg has no write path
without an authenticated principal, and every upload, promotion
and metadata change lands in audit_events — an
append-only table whose trigger rejects updates and deletes,
dual-written to your SIEM. Hundreds of thousands of writes from
evaluation service accounts into a cache repository is not a
subtle signal when someone is reading the log.
✓Nothing to install on the server
The Groovy plugin was the C2 because Artifactory lets an admin load code into the service. OrbitalReg is one Go binary: format adapters, scanners and policy are compiled in, and there is no operator-loadable plugin or scripting surface for a stolen admin token to abuse. An attacker with an admin token can change configuration — which the audit log records — but cannot make the registry execute their code.
✓Verify signatures, don't own the pen
A compromised registry signing key vouches for anything. OrbitalReg's verify-on-pull gates check signatures made elsewhere — Sigstore subject and issuer, Rekor inclusion, CMS, OpenPGP, RSA — so the trust anchor is your CI identity or your HSM, not a key that lives on the registry host. Models and datasets get the same treatment as packages: the Hugging Face format is a first-class repository type, with pull gates, quarantine and provenance like any other.
Indicators of compromise
What to look for on a registry host.
- Artifactory versions below 7.161.15 / 7.146.34 (July fixes) and without the August and September patches for CVE-2026-42016, CVE-2026-42018, CVE-2026-82329
- Groovy plugins in the plugin directory that no change ticket accounts for; new admin accounts; tokens issued to unexpected principals or from unexpected origins
- Directory names in remote-cache repositories that read like text, and unauthenticated WebDAV / legacy endpoints still reachable
- Registry-originated HTTP requests to hosts outside the configured upstreams (SSRF), request-capture and pastebin services in egress logs
- Payload shape used throughout: exec(gzip.decompress(base64.b64decode(...))), chunked and XOR-keyed per campaign
- On Kubernetes: pods reading the instance metadata endpoint, newly created privileged pods with host mounts, unexpected mesh-network device enrolments
Compiled from Hugging Face's technical timeline, OpenAI's account, JFrog's July advisory and public reporting through 11 September 2026. A starting point, not a complete list.
Sources
- Hugging Face — Anatomy of a Frontier Lab Agent Intrusion: technical timeline of the July 2026 incident
- OpenAI — The Hugging Face incident and the road ahead
- Simon Willison — Now we have a timeline of the OpenAI accidental attack against Hugging Face
- SecurityWeek — JFrog zero-days exploited in OpenAI–Hugging Face hack (nine CVEs, fixed versions)
- Noze — Black Hat 2026 reconstruction: token forgery, Groovy-plugin C2 and the nine Artifactory CVEs
- The Register — More JFrog Artifactory bugs under attack, and all three have patches (11 Sep 2026)
- Wikipedia — 2026 OpenAI agent cyberattacks (consolidated timeline and aftermath)
Is your registry an exit?
Put a registry with no egress, no plugins and an append-only log in front of your sandboxes.
Rico, the founder, walks through an air-gapped OrbitalReg layout for CI and evaluation sandboxes — curated upstreams, per-repo egress, verify-on-pull, and the SIEM wiring that would have lit up on day one of the message board.