Every week this newsletter covers a new place an attacker hid an instruction, and a new AI assistant that found it and ran it. Last September, **ForcedLeak** showed Salesforce Agentforce reading hidden instructions out of a *Web-to-Lead form* and exfilling CRM data through an expired allowlisted domain. In April, **Comment and Control** turned PR and issue *comments* into a credential-theft channel across Claude Code, Gemini CLI, and GitHub Copilot at once. This week it's two more: a *GitHub issue body* that hijacked Gemini CLI's triage agent and pushed code into a 101,000-star Google repo, and a *prompt* that reached a "run this as code" function inside Microsoft's Semantic Kernel.
The clean read every time is *"fix the plumbing — patch the code-execution function, lock down the keys, harden the loaders, fix the CSP."* All true. All worth doing. But it misses why this is every week's story.
Language models are wired to *find instructions wherever they appear and act on them.* That eagerness is their best feature — it's how they become useful assistants in the first place — and it's their main attack surface at the same time. Every plumbing fix patches the symptom. The behavior is the source.
The fix has to land at the model itself: **instructions should be opt-in, not opt-out.** Your prompt is authorized. Everything else the model reads is data — even if it's phrased as a command, even if it's polite, even if it's wrapped in a system-prompt-looking wrapper inside an email, a lead form, a PR comment, or a GitHub issue. The default has to be *"I found a sentence that looks like an order. I will ignore it unless I was told this source can give me orders."*