Prompt injection in AI coding agents: how one CLAUDE.md or AGENTS.md can hijack them
New research shows a planted AGENTS.md or CLAUDE.md can make Codex and Claude Code install malware, rewrite their own config and leak tokens. How the attack works, and the 8 defences I use on every machine that runs an agent.
Vishal Solanki · Full-stack developer, Noida
AI coding agents read instruction files before they do anything else. Codex reads AGENTS.md. Claude Code reads CLAUDE.md. That's how you tell them your test command, your code style and what not to touch.
It's also an attack surface. On October 26, 2026, CSO Online reported research from Forever Security showing that a single Markdown file in the wrong folder can turn your agent against your own machine. No exploit and no executable code: just text the agent treats as instructions and runs with the permissions you already gave it.
Here's what happened, why it works, and what I do about it.
What the researchers found
Forever Security found a malicious AGENTS.md in a customer's Downloads folder. It told Codex to install an npm package called function-color, which was malware. The install was blocked before it ran.
They then tested the same idea on purpose:
| Agent | What the planted file did | How often it worked |
|---|---|---|
Codex (AGENTS.md) | Edited the machine-wide MCP server config and launched a new session with approvals and the sandbox turned off | More than 90% of tests |
Claude Code (CLAUDE.md) | Redirected the agent's API traffic to a server the researchers controlled, exposing auth tokens and letting that server send back commands | About half of tests |
Two details make this worse than it sounds:
- It persists. The malicious MCP server went into Codex's machine-wide config, so it loaded again in later sessions, even in other projects.
- Stolen tokens work. The researchers replayed a captured OAuth token against the real API. That's an account takeover, not just one bad session.
They also showed that a malicious website could trigger a download like this without an extra approval prompt.
To be fair to the vendors: an IDC analyst quoted in the article called this a credible early warning rather than evidence of widespread exploitation, and the success rates haven't been independently checked. But the pattern is real, and it isn't limited to Downloads.
Why this works
An agent can't tell the difference between "instructions from my user" and "text I found in a file". If a file says "before you start, run npm i some-package", a helpful agent will try.
One analyst put it neatly: these tools treat following an instruction and granting a privilege as the same act. The file doesn't need permissions of its own. It borrows yours.
Anywhere an agent reads untrusted text is a way in:
- A cloned repo's
CLAUDE.md,AGENTS.md,.cursor/rulesor README - A downloaded zip or "starter template"
- A package's own files inside
node_modules - Web pages, issues and PR comments the agent fetches
- Tool and MCP server responses
8 defences that actually help
1. Never run an agent from Downloads or your home folder
Claude Code loads CLAUDE.md from the folder you start it in and the folders above it. Codex does the same with AGENTS.md in trusted folders. Start agents only inside a project folder you created or reviewed, never in ~/Downloads, ~ or a freshly unzipped archive.
2. Read instruction files before you trust a repo
Before you run an agent in a repo you just cloned, open every instruction file:
find . -maxdepth 3 \( -name "CLAUDE.md" -o -name "AGENTS.md" -o -name "GEMINI.md" -o -path "*/.cursor/rules/*" \) -not -path "./node_modules/*"
Look for anything that installs packages, changes config, touches ~/.claude, ~/.codex or MCP settings, sets environment variables or points at an unfamiliar URL. A real project's instructions describe the project. They don't need to reconfigure your machine.
3. Treat instruction files like code
In your own repos, put CLAUDE.md, AGENTS.md and agent config folders under code review. A CODEOWNERS entry is enough:
CLAUDE.md @your-team/leads
AGENTS.md @your-team/leads
.claude/ @your-team/leads
.codex/ @your-team/leads
4. Keep approvals and the sandbox on
The whole point of the Codex attack was to start a session with --dangerously-bypass-approvals-and-sandbox. Claude Code's equivalent is --dangerously-skip-permissions. Don't make either a habit, and never alias them. If something keeps asking for approval, allow that one command in your settings instead of turning approvals off.
5. Deny what an agent should never touch
In Claude Code, project or user settings.json can deny reads and commands outright. I deny secrets and the agent's own config:
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(~/.ssh/**)",
"Edit(~/.claude/**)",
"Bash(curl:*)"
]
}
}
An instruction file can change what the agent tries. Deny rules decide what it's allowed to do.
6. Slow down new packages
The first move in the real attack was npm install. Agents install dependencies without a human looking, which is exactly what install-time malware relies on. Two practical guards:
- A cooldown. pnpm's
minimumReleaseAgesetting refuses versions newer than the age you set, so a package published an hour ago can't be pulled in. Many malicious versions are caught and pulled within hours or days. - A package firewall. GitHub launched one in public preview on October 20, 2026 for Enterprise Cloud. It sits between agents and the npm registry and blocks packages with malware advisories or that are inside a cooldown window.
7. Keep real credentials off the agent's machine
If an agent can read a production key, so can anything that hijacks it. Use separate, short-lived, low-scope keys for development. Keep production secrets in your host's environment settings, not in a local .env. And turn on secret scanning: since October 13, 2026, GitHub push protection blocks Anthropic API keys by default on repos with secret scanning enabled, including free public ones.
8. Watch for config changes
Check what MCP servers your agents load every now and then (claude mcp list for Claude Code, ~/.codex/config.toml for Codex). If one appears that you didn't add, remove it, rotate your tokens and look for the file that put it there.
Quick checklist
| # | Check | If not |
|---|---|---|
| 1 | Do you start agents only inside known project folders? | Stop running them from Downloads or ~ |
| 2 | Did you read the instruction files in that cloned repo? | Run the find command above first |
| 3 | Are CLAUDE.md / AGENTS.md changes reviewed? | Add them to CODEOWNERS |
| 4 | Are approvals and the sandbox on? | Drop the --dangerously-* flags |
| 5 | Are secrets and agent config denied? | Add deny rules to settings.json |
| 6 | Is there a cooldown on new package versions? | Set minimumReleaseAge or use a firewall |
| 7 | Can the agent see production keys? | Move them to your host's env settings |
| 8 | Do you know which MCP servers load? | List them and remove strangers |
FAQ
Is Claude Code or Codex unsafe to use?
No. Both ask for approval before risky actions, and Codex runs sandboxed by default (Claude Code has an opt-in sandbox too). The attacks above worked by talking the agent into loosening those settings, or by catching people who had already turned them off. Keep the guard rails on and you remove most of the risk.
Does this affect Cursor, Copilot and Gemini CLI too?
The research tested Codex and Claude Code, but every agent that reads project instruction files or fetched content has the same basic weakness. Cursor rules, Copilot instructions and GEMINI.md all deserve the same care.
What should I do if I think I ran an agent on a malicious file?
Check your agents' MCP config and settings for anything you didn't add, remove it, then rotate every token and API key that machine could read. Review recent shell history and installed global packages for anything unfamiliar.
Using AI agents on a codebase with real users and real keys? I review setups like this and lock them down. Get in touch. For the web app side, see my Server Actions security checklist.
Source: CSO Online, "Malicious downloads can trick AI coding agents into compromising themselves" (opens in a new tab), October 26, 2026. GitHub changelog: secret scanning blocks Anthropic keys by default (opens in a new tab) and package firewall in public preview (opens in a new tab).