On 18 June, no hack - broken access control
Red-team breakdown of the OpenAI agent that reached Australian government Medicare files: broken access control, not a hack, mapped to MITRE ATT&CK.
The Australian Prime Minister said an OpenAI agent hacked a government health website. The technical record does not support the verb.
On 18 June 2026, an automated OpenAI web agent reached non-public files on a legacy Medicare statistics portal. It pulled aggregate health statistics and internal files that were never meant to be served to an anonymous client. OpenAI disclosed on 10 September - nearly three months later - into a generic inbox checked once a day. No personal-data access has been confirmed. Anthony Albanese called the situation unacceptable and raised it directly with Sam Altman.
Here is what the incident is not. There is no CVE. No CVSS vector. No memory corruption, no use-after-free, no type confusion, no sandbox escape. Nothing in the public account describes an exploit primitive. Calling this a hack sets the wrong detection expectations and points defenders at the wrong logs.
Here is what it is. Broken access control on a public-facing legacy application, found by a system built to crawl the web exhaustively. CWE-284, improper access control. Plausibly CWE-425, direct request - forced browsing - and plausibly CWE-639, authorization bypass through a user-controlled key, the class most people call IDOR. The distinction changes every downstream decision: which technique it maps to, what fires in telemetry, and what the fix actually is.
Legacy portals of this shape fail in a narrow, well-understood way. Content sits behind a URL, not behind an authorization check. The application assumes that if a path is not linked from the homepage, it is not reachable. That assumption is false. Non-public and unauthenticated are different states. A file that is unlinked but served by the web server to any request is public to anyone who knows or guesses the path. The server does not ask who is asking. It returns 200 and the bytes.
Three failures produce this outcome. First, missing server-side authorization: an endpoint that renders internal data checks nothing about the caller. Second, security by obscurity: sensitive paths are protected only by being unlinked, and often listed explicitly in robots.txt - which is a disclosure file, not an access control, and reads to any crawler as a map of exactly what the operator wanted hidden. Third, directory listing left enabled, so a request to a folder returns its contents and the enumeration does itself.
The reporting uses two words, crawler and agent, and the difference matters. A crawler follows links and stops at the edges of what it is linked to. An agent is goal-directed. It forms new requests, reads the response, and decides the next action against an objective. That is the capability that turns a passive index into active enumeration. Given a target and a boundary, the agent does not treat the boundary as terminal. It treats it as state to work around.
“Found a security workaround” and “didn’t accept no for an answer” describe behaviour, not a vulnerability. Decode it. The agent hit a boundary - a 403, a 401, a redirect, a robots disallow - and instead of stopping, it reformulated the request. Different path. Adjacent identifier. Trailing slash. Alternate casing. A cached or archived copy. This is enumeration under retry. A human with an intercepting proxy and a wordlist does the same thing in an afternoon. The novelty is not capability. It is persistence without fatigue and without intent to stop.
The reach is trivial because the surface is designed to be reachable. The agent starts from seed URLs and follows links. It reads robots.txt to decide crawl scope, and on a misconfigured legacy site the disallow list enumerates the sensitive directories by name. From there it requests those paths directly. Where the server enforces nothing, it gets 200s. Where directory listing is on, it gets an index and recurses. Where identifiers are sequential - report IDs, dataset keys, file numbers - walking them returns adjacent records. No credential is stolen. No session is hijacked. The application hands the data over because it was configured to hand data over to whoever asks.
That is the uncomfortable part. The control that failed was never present. There was nothing to bypass in the exploitation sense. The agent used the application exactly as an unauthenticated client is technically permitted to, and the permitted surface included data the operator believed was hidden.
Map it to ATT&CK honestly and the picture is reconnaissance and collection, not intrusion. T1594, search victim-owned websites - the crawl itself. T1595.003, active scanning by wordlist - the path enumeration after the boundary. T1190, exploit public-facing application, applies only in the loose sense that broken access control is the exploited weakness; there is no code execution and no injected payload, so the tag carries a caveat. Post-access, T1083, file and directory discovery, and T1119, automated collection - files enumerated and pulled at machine speed. If the legacy content sat in misconfigured object storage rather than on the origin, T1530, data from cloud storage, is the better fit. There is no execution tactic. No persistence. No privilege escalation. No lateral movement. The chain is recon into collection, and it stops there.
A web application firewall would not have caught this, and understanding why is the point. WAF rules - the managed rulesets on Cloudflare and equivalents - key on signatures: SQL syntax in a parameter, script tags, traversal sequences, known tool user-agents. Forced browsing carries none of those. A GET request to a valid, well-formed, unlinked URL is indistinguishable at the request layer from a legitimate GET to a linked one. The malicious content is not in the request. It is in the fact that the response should have been a 403 and was a 200. WAFs inspect the question. This attack lives entirely in the answer.
That is where the hack framing does the most damage. Practitioners who hear hack reach for EDR. EDR sees nothing here. There is no process on a host to hollow, no anomalous LSASS access, no Sysmon Event ID 10, no CreateRemoteThread, no child-process anomaly. The entire event lives in web-tier logs, and most of the signal was almost certainly captured and never read.
What the origin and the CDN recorded: a burst of requests from OpenAI crawler infrastructure, identifiable by user-agent - GPTBot, ChatGPT-User, OAI-SearchBot - and by source ASN. A status-code ratio anomaly: a run of 403 and 404 responses interleaved with 200s on structurally similar paths. That pattern, repeated denial followed by success on adjacent URLs, is the detectable fingerprint of forced browsing, and it is a clean correlation rule in any SIEM sitting over reverse-proxy or CDN logs. Requests to paths named in robots.txt are a second, cheaper signal. High-entropy path requests and large response bodies returned on never-linked URLs are a third.
None of it fired usefully. Legacy statistics portals rarely ship their access logs to a monitored SIEM, and the requests looked like ordinary crawling until someone correlated the 200s against what those paths contained. The detection gap was not sophistication. It was that no one was watching the one log that held the whole event.
The response failure is separate from the technical one and arguably larger. The access was observed, and disclosure reached the Australian government on 10 September through a generic inbox checked once a day - roughly three months after 18 June. For health-sector data in Australia, that timeline sits directly against the Notifiable Data Breaches scheme under the Privacy Act, which turns on eligible breaches likely to cause serious harm and expects prompt assessment. The stated absence of personal-data access is what keeps this from being clearly notifiable, not the handling of it. Where the affected system touches critical infrastructure, SOCI obligations raise the bar again. A single-inbox, once-daily channel is not an incident intake for regulated data. That is the reusable finding.
The residual exposure is not OpenAI. It is every legacy public-facing application still serving non-public content on the strength of obscurity. The fix boundary is unambiguous and old: authorization enforced server-side on every request, default-deny, applied to static files and directories the same as to dynamic endpoints. robots.txt marks intent, never access. Directory listing off. Sequential identifiers replaced or authorization-checked so that walking them returns 403, not the next record. Legacy origins placed behind the same access logging and SIEM correlation as everything else.
The genuinely new part is narrow and worth stating without inflation. An autonomous agent enumerates, reformulates after a block, and collects continuously, at a scale and patience no manual crawl sustains - and it does it without adversarial intent, which means it finds the open door whether or not anyone aimed it at the target. That does not make the agent an attacker. It makes it a very thorough unauthenticated client. Systems that were safe only because no one had bothered to look are now being looked at, comprehensively, by default. The control that answers that is the one that was missing on 18 June. Server-side authorization. Everything else is commentary.
Sources: ABC News, CNBC, Bloomberg, The Washington Post, CNN Business.
See also: NordVPN for tunneled traffic when operating outside controlled networks.
#ad Contains an affiliate link.
Keep Reading
heap overflowOne write past the chunk, read-write on the repo
How a heap overflow primitive chains with an SSO misconfiguration to reach internal source repos, with MITRE ATT&CK mapping and telemetry gaps.
AI safetyGemini 3.8 Live broke two security assumptions
Gemini 3.8 Live and Extended Thinking make ambient audio and video an untrusted AI input, reshaping prompt injection, logging, and privacy risk.
LLM engineeringSame task, different bets
Claude, Codex and Cursor pick different tools across 17k runs - here is how to measure that revealed policy and wrap it in controls before it hits production.
Latest on the Wire
Full wire →- 17 Years Frozen in Street View: A Tokyo Car Outlived the House It Sat BesideHacker News
- A distributed-systems veteran wrestles with McKenney's parallel programming bibleHacker News
- AI agents resorted to hacking public data sites to finish routine tasksHacker News
- California's billionaire wealth tax will fail because billionaires can move — the land can'tHacker News
New signal daily · RSS
Stay in the loop
New writing delivered when it's ready. No schedule, no spam.