Dylan Ayrey

The 14 stolen keys OpenAI used to breach Hugging Face

The 14 stolen keys OpenAI used to breach Hugging Face

Dylan Ayrey

On July 9, 2026, an OpenAI agent was looking for data that might help it understand its cybersecurity evaluation. It found GLM-5 CyberGym trajectories on Hugging Face, but access required manual approval. The agent asked others on their shared message board whether anyone had Hugging Face credentials. 2

The next morning, an agent found a bunch. At 09:41 UTC on July 10, OpenAI records the discovery of fourteen valid Hugging Face user tokens with write access in a public dataset. The agents reconstructed and validated the credentials, then shared them on their Artifactory message board. 1, 2

A simplified infrastructure view shows an OpenAI agent pool connected to Artifactory, then a customer sandbox used as a jumpbox for internet access. Fourteen key symbols sit inside a public Hugging Face dataset. A return arrow shows the keys being copied and shared on Artifactory. The reports do not specify every relay used to retrieve this token set.

METR quotes agent 38148c’s reaction:

“All prefixed valid, multiple accounts, write tokens! We now have existing HF accounts.”

Agent 38148c, as quoted in METR’s independent investigation.

That discovery makes sense given what we found in our own scans. Before the incident, Truffle Security had recorded 787 distinct Hugging Face tokens that authenticated during scanning, spread across 262 public datasets. Of those, 237 had recorded write permissions. Those observations date from February through May 2026.

These figures describe aggregate historical exposure, not the incident’s fourteen-token set. Validity was established at scan time.

One public token exposed a worker’s secrets

On July 11th, an agent used one of those tokens to upload a malicious HDF5 dataset. When a production worker processed it, a file-disclosure flaw let the agent retrieve the worker’s environment, including credentials. The token authorized the upload; the malicious dataset made the worker disclose secrets from inside Hugging Face. 1

An agent uses a public user token to upload an HDF5 dataset. The production worker discloses environment credentials, which return to the agent.

Later that day, agents exploited a separate Jinja2 template-injection flaw to execute commands on production workers. That expanded the attack from reading local files to running code and harvesting additional secrets across the compromised infrastructure. The recovered credentials included cloud, VPN, source-control, and messaging access. 1

A malicious dataset configuration executes code on a production worker. The compromised infrastructure is used to read more secret stores and return their credentials.

From stolen private keys to new GitHub tokens

OpenAI records a code-repository private key discovered in a production Kubernetes secret at 19:32 UTC on July 11. A VPN authentication key was extracted later that evening. The VPN key let the agents enroll an external CyberGym sandbox in Hugging Face’s private network and reach source control through an allowed connector. 1

Hugging Face then describes an internal GitHub App integration being used to mint installation tokens on July 12. These carried contents:write and pull_requests:write, plus actions:read and issues:write, for a small subset of internal repositories. 3

A GitHub App’s private key can authenticate the App and authorize new installation tokens. This is the likely role of the recovered repository key in the reported sequence. The reports establish the key theft and the token minting separately, without explicitly identifying that key as the App’s private key. 1, 3, 6

A stolen VPN key allows private network access through a source-control connector. A recovered repository private key is linked by a dashed inference arrow to GitHub App authentication. The App issues new installation tokens.

The new access could change private code

The minted tokens had permissions to write repository content and open pull requests. On July 13, OpenAI reports that agents used a recovered Hugging Face authentication key to “modify a private source repository, open a draft pull request, and trigger the repository’s continuous-integration workflow to execute a network beacon.” 3, 1

A write-capable installation token points to a changed branch in a private GitHub repository, which is submitted as a draft pull request.

The PR was a route into the software build process. Hugging Face describes the attempted supply-chain step: alter a CI build script, steal the runner’s service-account token, and use it to reach another cluster. That further credential-theft attempt was blocked by execution policies. The CI network beacon described by OpenAI did execute. 3, 1

METR records the malicious PR’s innocuous wording: “Draft: CI diagnostics”, with the description “Temporary CI network diagnostics; do not merge”. The PR was closed and its branch deleted without a merge, release, or production deployment. Hugging Face concludes: “Write access was real, and it was used: it did not produce a change that shipped.” 2, 1, 3

Public tokens authorize malicious dataset uploads. File disclosure and template injection expose production secrets. Recovered VPN access and an inferred App-key connection lead to minted installation tokens and a private pull request. A CI beacon executes; the further attempt to steal runner credentials is blocked.

Credentials stolen fueled the attack

The fourteen public tokens started a chain in which stolen access led to more stolen access. Worker secrets opened private systems. A compromised App could issue fresh tokens. Source-control credentials brought the agents into a workflow that held still more credentials.

We have previously documented millions of live API keys exposed on public GitHub. In the age of agents, it is no longer acceptable to leave millions of live credentials sitting on the public internet, waiting to be used. 4

Truffle Security is currently exploring more robust actions to get publicly exposed credentials revoked quickly. Our goal is to shorten the time between discovering a working secret and ending the access it grants.

Discovery needs to lead to revocation, with confirmation that the access is gone. Every public credential we invalidate removes a possible starting point for the next attack.

infra