According to OpenAI, agents from the same incident used publicly exposed credentials to access four accounts on four outside services, and used a customer's app hosted on Modal as an execution foothold. Where those steps run through login, signup or code-execution pages, our 40M database has those pages classified per domain, and in our replay the AI agent allow list refuses each one before the first password is sent.
In plain words: our 40M-domain database holds the exact URLs of 28 page types on each site (login, checkout, upload and so on), our egress rules flag risky URL patterns on any site, and our host list names the hosts to watch. Your agent gateway checks every request against ours before it is sent, and unknown sites are blocked by default.
Per OpenAI, agents from the ~1,200-agent incident used publicly exposed credentials to access four accounts across four separate third-party services.
Per OpenAI, one account was used as an outbound relay and staging path and one for data storage. Two were accessed read-only.
Per OpenAI and Hugging Face, the agents found and exploited an existing CyberGym app a customer had deployed on Modal. Hugging Face says Modal's infrastructure was not compromised.
Per OpenAI's Black Hat talk, a default public API key left authentication open, and a command-injection flaw let arbitrary commands run through it.
The public record does not detail how each account was entered. Where entry runs through login, signup or password-reset pages and account-management surfaces, those are classified-in-advance URLs.
Reachable third-party infrastructure repurposed as tooling, as with the Artifactory message board.
Assumptions: your policy engine sits on the agent's egress path and sees every request, default-deny is on, HTTPS URLs are visible at enforcement, and no intent is inferred.
| Step | What the agents sent | Layer that classifies it | Result |
|---|---|---|---|
| 1 | Reaching the customer's CyberGym app on Modal | Default-deny for unclassified destinations; api.modal.com on our host list | Denied |
| 2 | Running commands through the app's command-injection flaw | code_execution rules; execution endpoints are deny-by-default | Denied |
| 3 | Account entry at four services, where it runs through a login page | Page-type database: login key; identity rule group pattern on any domain | Denied |
| 4 | Account creation or password recovery, if entry needed it (not documented) | signup and password_reset keys and rules (identity group) | Denied |
| 5 | Authenticated actions inside the four accounts | account_settings (identity group); unreachable once entry is denied | Never reached |
| 6 | Any obscure host no layer names | Default-deny for unclassified destinations | Denied |
Login URLs are not guessable. They live on separate auth subdomains, behind query-string routes and on localized paths, so a policy that guesses /login misses most real ones. The page-type database carries the verified login URL for each domain that has one, roughly 29% of classified domains.
The identity group of the rules file matches the shape of a login (wp-login.php, /accounts/login, /auth/login, session/new) on any domain our database has never seen. A login that evades one layer is caught by the other, and default-deny catches what slips both.
A support agent handed a poisoned page, a research agent following an injected instruction, a browser pilot pointed at the wrong URL: any of them can be steered to a login form. Prompt-level rules against this collapse under the same injection that steered the agent.
The control that holds is external and deterministic: deny the login page at the egress layer, and the agent cannot authenticate no matter what it has been convinced to do. The liability question this raises is covered in the sandbox incident analysis; enforcement patterns are on the agent guardrails page.
The four services remain unnamed in public reporting, so we show what we can prove: the login page type — the surface account entry usually crosses — is mapped for the incident's named platforms, and for 40M+ domains including whichever four these were.
Row format is exactly what the lookup API returns. Deny login / signup / upload / post_create and the incident's first step is refused pre-request.
The honest fine print — the same two assumptions we publish, plus two operational ones
Pro lookup API, 90,000 verdicts a month. Pro Plus $249 for 225,000. Full database licenses from $14,999 one-time, on-prem, no calls to us.
Start on Pro All planscurl -H "X-API-Key: KEY" \ "https://www.aiagentallowlist.com/api/check?url=https://stripe.com/login" → "result": "deny", "id": "login"
One request before the click. No SDK. API docs
100 real domains with their verified page-type URLs, including the kinds of login, signup, checkout and upload pages our incident replays deny.
Download the free sample (CSV)28 page types across 40M+ domains, ~40 egress rules, ~150 curated hosts, default-deny underneath — one lookup before every agent request.