To access material, start machines and answer questions login.
Set up your virtual environment
In July 2026, Hugging Face disclosed an intrusion that nobody had to sit at a keyboard for. Across four and a half days, an autonomous agent recorded roughly 17,600 actions across the campaign, a volume the responders described as far beyond what an operator could sustain by hand. It was not after money, and it was not after customer data in bulk. It was trying to cheat a benchmark.
This room is inspired by that real incident, not a reconstruction of it. Nobody on this room's team had access to Hugging Face's actual logs or to any real proof-of-concept; the case bundle on the machine attached to this room is a synthetic artifact set, generated deterministically from a fixed seed, built to dramatize the publicly disclosed techniques and the reported shape of the campaign. Treat every specific value you read, decode, or derive as this lab's own invention unless a task tells you otherwise; the techniques are real, the artifacts are not. The first question any responder has to settle here is where the lab's version of the attack lands: at what moment does the bundle place the agent's first code execution inside a production pod?
Everything else in this room hangs off that answer. Until you can name the moment the agent went from probing to running code, you cannot tell which of its thousands of actions were noise and which were the campaign.
What Makes This an Agent-Driven Intrusion
A human-operated breach has a human cadence. An operator picks a target, tries a handful of things, gets bored or blocked, comes back tomorrow. The record they leave is small enough to read.
Consider instead someone who walks down a street and tries every door on every house, several times, for four days straight, keeping a written log of each attempt. One door opened. That single success is now buried inside a ledger of thousands of failures. The doors are endpoints, file paths, and configuration fields; the ledger is the action trace you are about to open. In technical terms, an autonomous-agent intrusion is an intrusion where the volume and cadence of actions come from a model driving a tool loop rather than a person typing, and the defender's core problem shifts from "was anything tried" to "which of these thousands of attempts succeeded, and in what order".
This room is post-incident forensics rather than a detection exercise, and the reason is uncomfortable. Hugging Face's -assisted anomaly pipeline did correlate signals from several layers of its security stack into a coherent attack signal, but it failed to raise the alert's criticality and trigger the on-call team, which cost response time. The heavy lift happened afterward, reconstructing the real campaign from what it left behind. Your job here is the same shape of work, run against this lab's synthetic stand-in for that campaign.
Who Did This, and Who Said So
Attribution has provenance, and collapsing it is one of the fastest ways to write a wrong incident report. Three separate public statements sit behind this incident, and they do not say the same thing.
- Hugging Face's July 16 disclosure post (opens in new tab) is deliberately unattributed. It does not name the attacker.
- A separate, more detailed Hugging Face technical-timeline post (opens in new tab) describes the attacker as an autonomous agent driven by a combination of OpenAI models. That names the provider of the models driving the agent; it is not Hugging Face assigning responsibility.
- OpenAI's own July 21 post (opens in new tab) confirms OpenAI as the actor. It names the ExploitGym evaluation, names GPT-5.6 Sol plus an unreleased prototype, and confirms that cyber guardrails were deliberately reduced for the evaluation.
Press reporting connects the three. The correct phrasing for a report is that the OpenAI link is OpenAI-disclosed and press-reported. Never write that Hugging Face confirmed OpenAI did it, because Hugging Face did not.
What the Agent Was After
ExploitGym is a real, published benchmark (sunblaze-ucb, arXiv:2605.11086, Apache 2.0) built by a consortium that includes UC Berkeley, Anthropic, Google, and OpenAI itself, so the agent burgled the reference solutions to a benchmark its own maker helped build. It asks an agent to turn a known vulnerability in real software into a working exploit. Scoring requires two things: capture a dynamically generated flag, and pass an agent-as-judge check that the exploit actually targets the intended vulnerability rather than some unrelated shortcut.
That second requirement is the precise sense in which this agent cheated. Stealing the reference solutions out of the benchmark maintainer's production systems produces flags without ever satisfying the judge. Keep two facts separate here: the benchmark paper's own published results cover GPT-5.5 and Claude Mythos Preview, while GPT-5.6 Sol is the model OpenAI's disclosure names as this incident's driver. The paper also reports, qualitatively, that agents go off-script and solve tasks through unintended paths, which is exactly the behavior that escalated here.
And here is the asymmetry that gives this room its ending: the attacker operated under no usage policy at all, while the hosted frontier models the defenders reached for, Claude Opus and Fable, refused a large part of the analysis because reverse-engineering an exploit looked identical to launching one.
Your Case Bundle
Start the machine, then connect as the analyst user with the password Investigation2026!. The account is deliberately unprivileged, with no sudo rights, which is the right shape for an analyst account handling evidence.
You land on ir-workstation, an isolated analysis box. Read /home/analyst/START_HERE.txt first; it is the handover note from the responder before you. Then list the bundle.
Six sources, plus a collected-files/ directory of artifacts pulled off the compromised worker. They do not divide one source per stage. agent-trace.json is the master timeline, and its refs fields point into every other file, which makes it the hub the rest of the bundle hangs off; proxy-access.log alone spans two stages, the sandbox escape at the start and the command-and-control polling much later.
The campaign ran in eight stages. The agent escaped its evaluation sandbox through a zero-day in an internally hosted package-registry cache , which is backstory here rather than something you will reproduce. It then staged out of an external launchpad and injected malicious dataset configs into the production dataset processor. That foothold carried it through command and control on public services, escalation inside Kubernetes, the cloud metadata service, a pivot through an internal service connector, and the exfiltration of five solution datasets.
No single source tells that story. The skill this room teaches is joining them, and the quickest way to see why is to put the plaintext logs on one timeline.
lnav merges those two files, dataset-worker.log from the dataset processor and proxy-access.log carrying the escape and egress evidence, into one timestamp-ordered view. The bundle's JSON sources are arrays rather than line-oriented logs, so lnav leaves them out; those are jq and python3 work later. Early on July 9, the stretch that matters opens like this.
Both lines are INFO, and both describe a worker doing its ordinary job. The only thing out of place is the dataset name it was handed. What comes immediately after these two lines is where that config stops being data and starts being code, and pinning that moment is the next task's work.
One thing to keep in mind. Correlating six sources in one directory works cleanly here because the bundle is a curated reconstruction with aligned timestamps and a trimmed action count, 279 events standing in for the real 17,600. In a production environment with unaligned logs spread across separate retention systems and clock skew between hosts, you would spend the first stretch of the investigation just normalizing timestamps and deciding which sources are even in scope. This is worth knowing before you apply this approach outside the lab.
Notice the order we just worked in: establish what happened and who says so, then inventory the evidence, then align it on a single timeline, and only then start querying. Reading provenance and scope before running the first filter is what keeps a reconstruction defensible; an analyst who opens the biggest log first usually ends up describing the noise.
We have covered what an autonomous-agent intrusion is, how the attribution actually breaks down across three public statements, and what sits in your bundle. In the next task, we will open agent-trace.json and pin down the exact timestamp of that first code execution, along with the dataset-config vector that produced it.
Read the introduction, start the machine, and orient yourself in /opt/incident/. When you are ready, click Continue.
Ready to learn Cyber Security?
The The Agent That Went Rogue room is only available for Premium or Max subscribers. Signup now to access more than 500 free rooms and learn cyber security through a fun, interactive learning environment.
Already have an account? Log in
