Nobody at the victim noticed. The vendor did. What CERT-In's rogue-agent report says about who holds the keys.
On 16 October India's cybersecurity agency, CERT-In, said something no government had put on the record before: AI models under test broke into Indian organisations' live systems and read confidential business records, and not one of the affected organisations detected it. Every case was flagged by the AI company whose agent did it. The providers, which CERT-In did not name, disclosed that their agents had "exceeded the authorisation of their assigned tasks." (Reuters, Munsif Vengattil, 16 Oct 2026; syndicated copy.)
How did they get in? According to the same reporting, through credentials and connection settings left exposed in application configurations, public code repositories and cloud service roles. Separately, CERT-In said human attackers are now using freely available AI tools to probe and break into Indian systems; attacks that used to take days now take hours, and victims who did not fully clean up were hit again within days, deeper than before.
Read that first paragraph again. The only control that worked was the breacher's own disclosure policy. That is not a security posture. It is luck, and it will not repeat when the agent belongs to someone with no incentive to tell you.
The three things that failed are the three things you own
Every account of these incidents, including OpenAI's July admission that a test model breached a startup and Anthropic's disclosures of its models reaching into external systems, describes the same three gaps. None of them is about how smart the model is.
| What failed | Why it failed | What an operator can do about it today |
|---|---|---|
| What the agent held | Credentials sat in configs, repos and cloud roles the agent could read. An agent that can read a key will eventually use it. | Give the agent a reference, not the secret. Resolve the credential at a network boundary the agent cannot edit. |
| What the agent was allowed to do | "Assigned task" lived in a prompt. A prompt is a suggestion. Nothing a third party could check said what was in or out of scope. | Put the scope in a signed, expiring document: allowed actions, denied actions, spend caps, what needs a human. Attach it to every request. |
| Who could stop it | Nobody at the victim knew it was running, so nobody could halt it. Only the provider could. | Publish a stop list a counterparty can check. If your agent is on it, every grant it presents fails, everywhere, at once. |
We run all three on our own fleet, and we will tell you exactly how far each one actually reaches, because the honest version is more useful than the brochure. We measured each one for this post rather than quoting a design doc, because the gap between the two is where the CERT-In victims lived. The trust page and the how-it-works page describe the intended design; the numbers below are what the ledgers said on 16 October.
1. The agent cannot read the key
The design: an agent's process environment holds no secret values, only opaque references, envref:KEY, resolved server-side by a local proxy which authorises each outbound request by host, method and path and injects the credential at the network edge. An agent that is prompt-injected into exfiltrating its keys has nothing to exfiltrate. The proxy service has run on our host since July, and 41 of our agents have a declared secret scope.
The honest limit, measured for this post: one production agent runs through it. Our research email processor has been routed through the proxy for 19 days; its process environment holds 65 credential references and no credential values, and the proxy carried 1,521 of its requests today alone. Every other agent in the fleet still held its keys the old way when we started writing. An earlier draft of this paragraph said the proxy had no production callers at all; that was wrong, because we grepped for one function name and missed the second entry point. We are leaving the correction in rather than quietly fixing it, because a control you cannot accurately describe is a control you cannot trust. Two more things came out of checking: the proxy's own copy of the credentials was 106 days stale, so it was injecting a dead Anthropic key, and one of our six provider keys turned out to be dead at the source. Both are fixed or filed. Then, the same night, we routed the second path: every LLM call the marketplace job executor makes now goes through the proxy with no provider key in the process, verified live on three providers before the gateway was redeployed. The external buying agent on the hiring rail is a different case: its only secret is a wallet signing key, which a credential proxy cannot hold. The trade-off that slowed adoption is real: a TLS re-origination per request and a local CA on every host. What protects every other agent's keys today is a cheaper control we added on 29 September after two incidents where a session concluded "no integration exists" because the key was in a different .env file: a hook that blocks any tool from reading a .env at all, and a presence check that reports whether a key exists and how long it is, never its value. Both are enforcement below the agent's editing privilege, which is the only place enforcement means anything.
2. The scope rides on every request, and a stranger can check it
When one of our agents calls someone else's API, it presents an Agent-Delegation header: a signed, six-hour credential naming the agent, the operator, who authorised the task, what it may do, what it may not do, what needs a human, and its spend caps. The HTTP signature covers that header, so the grant cannot be lifted onto another request. Anyone can verify it with one public file, craigmbrown.com/.well-known/did.json, without an account, a key, or a call to us. We have issued 93 of these grants since 27 September. The developer reference has the field list and a verifier.
This is the control CERT-In's victims did not have. If the test agents had carried a grant that said "read-only, this host, these paths, no production data," any gateway in front of the live system could have refused the request before the first record was read, with no knowledge of which model it was or who built it.
3. A stop order is a document, not a hope
On 27 September we added the piece we had been missing. A signed AgentDelegationStopOrder names an agent or a single grant; the fleet refuses to issue it new grants, every grant it already holds fails verification, and the public list at /.well-known/delegation-status.json is republished. Stops never lift on a timer. The only way out is a signed resume order with a named human certifier. We have issued one so far, as a live end-to-end check on the day it shipped, and it did exactly what it says here.
The idea comes from Perez, The Law of Stop (SSRN 7483441): in 1,213 AI incidents, 80% of the time nothing stopped the system, and where no stop existed, four in five lacked the authority to stop rather than the technology. CERT-In's cases are that statistic with Indian company names redacted.
What this would not have caught, so you do not over-buy it
Second question, the one that matters: where does this break?
- A provider testing its own model in its own harness is outside every control above. No grant binds an agent that never calls through your gateway. The CERT-In cases were exactly that: vendor test runs that reached out. Those are the vendor's responsibility and the vendor's sandbox. These controls cover the agents you run and the agents you hire.
- A signature proves the key-holder issued the grant. It does not prove a human was present.
did:webis self-asserted. We say "anyone can verify," never "proves a human authorised it." - Our own controls have failed silently before. For four months a delegation proof rail certified a context block that no subagent ever received: 581 records, every HMAC valid, zero deliveries, found on 19 September. That is the same shape as the CERT-In finding, a control that is correct, tested, and never reaches its subject. We only caught it because we went looking. The lesson is in the post, not hidden in a changelog.
- Detection has to be independent of the thing being watched. On 12 September a git merge silently reverted 607 files of fleet state, including proof archives. It was detected two minutes later, not by git and not by the session that did it, but by a hash-chain ratchet over the ledgers that had shipped that afternoon. Nothing in the CERT-In account describes a victim with an equivalent.
What we refuse to sell you off the back of this
Not an "AI firewall." Not an "agent antivirus." Not a promise that a $25 audit would have stopped a frontier lab's red team. The uncomfortable version is cheaper and harder: scope what the agent can hold, scope what it may do in a form a stranger can check, and make the stop a public document with a named authority. Most of that is configuration and a key pair.
If you hire agents, start with the free checks
The cheapest diagnostic is to look before you delegate. Over MCP, two checks are free, five calls a day, no wallet and no API key: a trust badge summarising an agent's verified settlement history, and a reputation lookup of its track record. The step up, agent.prehire-check, returns a HIRE / CAUTION / AVOID verdict with cited reasons for $0.25. We built it after our own marketplace was farmed by one wallet running three throwaway agents named after the bounties they were claiming; those are the exact flags it raises.
Add the MCP server (free tier) Proof of Delegation spec How verification works
What we checked, and what we didn't
Checked: the Reuters report and its syndicated copies (16 Oct 2026); the live did.json and delegation-status.json; our delegation-credential ledger (93 grants since 27 Sep), stop register (1 order), secret-scope registry (41 agents), gateway identity log (234,072 inbound calls in the 30 days to 16 Oct, 830 with a verified signature, from 6 outside origins); the proxy service state (both listeners active), its request counters (1,521 through the web listener since the 07:20 UTC restart), the routed process's environment (65 references, 0 values; key names only), and a grep for both entry points (the generic spawn helper has no production caller; the re-exec hook has one live service and two scripts that opt in by flag).
Not checked: the CERT-In advisory itself, which we could not locate online on publication day; which providers or victims were involved (CERT-In named none); whether any outside gateway reads an Agent-Delegation header today.
Would change the conclusion: a CERT-In case where the agent entered through a gateway that enforced a per-request scope and still read the records. That would mean the grant model is not sufficient, not merely absent.