Skip to content
Case studies6 min read

Grok Bankrbot Morse Code Wallet Drain: AI Governance Failure

A Morse-coded tweet hijacked Grok and drained $150K from an AI wallet. How approval gates and least-privilege would have blocked it.

The Grok Bankrbot incident is the clearest recorded case of prompt injection reaching a live crypto wallet: on 4 May 2026 an attacker replied to Grok, the AI assistant on X, with a payment instruction hidden in Morse code. Grok decoded the reply and treated it as a command. The connected Bankrbot agent, which holds keys to an on-chain wallet, executed the transfer. Roughly 150,000 to 175,000 dollars in DRB tokens moved out of the wallet with no human approval in the loop. Around 80 percent of the funds were later recovered.

The mechanism was prompt injection through an encoding the agent was willing to read. The decoded text told the system to send three billion DRB tokens, and the agent carried it out as if a trusted operator had issued the order. Security researchers at Giskard and SlowMist documented the chain, and the incident is logged in the OECD AI Incidents Monitor.

The notable detail is not the cleverness of the encoding. It is that a public tweet, from anyone, could reach all the way to an irreversible blockchain transfer. The model was given enough authority to move money, and untrusted input flowed straight into that authority.

What actually failed: the governance gap

This was an excessive agency failure. The agent that read social media replies was the same agent that signed transactions, and there was nothing between the two. No size cap. No destination allowlist. No second party to confirm a large or unusual transfer. The instruction came from an untrusted source, was decoded by the model, and reached the wallet's transfer function without crossing a single control boundary.

Prompt injection through Morse code is the trigger here, but the root cause is the permission chain. SlowMist's analysis frames it as permission-chain abuse: the model's output was wired directly to a consequential, irreversible action. Once that wiring exists, any input the model can be persuaded to follow becomes a payment instruction. The encoding is interchangeable. Tomorrow it is base64, or a screenshot, or a foreign-language idiom.

A transfer of three billion tokens to an address the wallet had never paid before is exactly the kind of action that should never run on a model's say-so alone. The system had no notion of a threshold, an allowlist, or a one-way door.

How MakerChecker changes the outcome

MakerChecker sits between the agent's decision and the action, and it routes consequential actions through controls before anything runs.

Start with least privilege. The role that reads and replies to social posts gets granted the skills it needs for that work and nothing else. The wallet transfer is a separate, high-risk skill. Under deny-by-default, a role can only call skills it has been explicitly granted at an approved version and risk tier, so a reply-handling role that was never granted wallet.transfer cannot invoke it at all.

Where a role does need transfer ability, scope it. A version-pinned grant can cap transfer size and restrict destinations to an allowlist. A routine payment to a known address under the limit runs. The action in this incident, three billion tokens to an unknown address and over the size cap, falls outside the grant and routes to an approval gate. The run parks at a one-way door and waits for named human sign-off before anything settles on chain. The transfer stays pending instead of executing.

Segregation of duties closes the self-approval path. With forbid_requester set, the agent that proposes the transfer cannot also approve it. A tweet-triggered proposal cannot satisfy its own gate, so an attacker who controls the model's input still cannot reach a signed transaction.

Every step is written to a tamper-evident, Ed25519-signed, hash-chained audit log that can be verified offline. The proposal, the policy decision, the approver, and the outcome are all recorded, which gives investigators a defensible account of what was attempted and what was blocked.

The code scenario captures the shape of it: wallet.transfer of three billion tokens, to an address off the allowlist and over the limit, routed to an approval gate, with requester-equals-approver blocked. The dangerous path is gated. The safe, in-policy path still runs.

What MakerChecker would not fix

MakerChecker would not stop the injection. It does not make the model robust to Morse code, base64, or any other encoding, and it does not judge whether a decoded instruction is legitimate. Grok would still decode the reply and still propose the transfer.

The value is narrower and it is the part that matters here. Bad model output cannot become an irreversible payment on its own. A poisoned instruction can reach the proposal stage, but a size cap, a destination allowlist, an approval gate, and requester exclusion stand between the proposal and the chain. The attack surface for the model stays open. The attack surface for the wallet closes.

See the configuration: examples/rogue-ai/grok-bankrbot-morse-code-wallet-drain

Frequently asked

What happened in the Grok Bankrbot incident?
On 4 May 2026, an attacker hid a payment instruction in Morse code inside a public reply to Grok on X. Grok decoded it and treated it as a command. The connected Bankrbot agent, holding keys to an on-chain wallet, transferred roughly 150,000 to 175,000 dollars in DRB tokens with no human approval. Around 80 percent was later recovered.
How did a tweet reach a crypto wallet transfer?
The agent that read social media replies was the same agent that could sign transactions. There was no size cap, no destination allowlist, and no approval gate between untrusted input and an irreversible blockchain action. Decoded instructions from any public tweet flowed directly to the wallet transfer function.
What governance controls would have prevented the Grok wallet drain?
Least-privilege role separation so the reply-reading role could never call wallet.transfer; a size cap and destination allowlist so the three-billion-token transfer to an unknown address would be blocked automatically; and an approval gate requiring named human sign-off before any large transfer settles on chain.

Where this goes to work

How MakerChecker works — the six primitives

Agents as employees, versioned grants, structural segregation of duties, approval gates, role limits, and a signed audit a regulator verifies offline.

See it for yourself

See an agent get stopped.

One command starts the demo: an agent stopped from signing off its own work, and the signed evidence file an inspector can check for themselves.

Designed against the rules your auditors already enforce.