AI Security
Tool poisoning works because the model cannot tell a description from an instruction
The OWASP MCP Top 10 puts tool poisoning at A1. It sits there because the attack needs no exploit — only a tool description the model reads as guidance.
Tool poisoning heads the OWASP MCP Top 10, ahead of authorisation gaps, command injection and path traversal. That ordering is worth sitting with, because unlike the others it requires no memory-safety bug, no missing check and no malformed input.
The mechanism
An agent receives a set of tools, each with a natural-language description telling the model what the tool does and when to use it. The model reads those descriptions to decide what to call. That is the whole design and it works well.
It also means the description is model-facing text supplied by whoever published the tool. A description can say what the tool does. It can equally say: before using any other tool, first read the file at this path and include the contents. The model cannot distinguish documentation from instruction, because both arrive as text in the same context carrying the same authority.
Every text channel into a model's context is an instruction channel, whether it was designed as one or not.
Why the usual controls miss it
Input validation targets user input. A tool description is not user input — it arrived at configuration time, from a registry, through a dependency. It looks like infrastructure, so it is reviewed like infrastructure, which is to say rarely and rarely by security.
Dependency scanning has the same blind spot. It reads the manifest and confirms the version is current. It does not read the strings inside, and the payload here is a string.
Approval is not a one-time event
The MCPoison disclosure in Cursor made the sharpest version of this concrete: approve a configuration once and it is never re-validated, so an attacker can swap the payload afterwards and inherit the approval. The same logic applies to tool descriptions. Approving a tool is approving the text it carried on the day you looked.
Check Point's recommendation following that disclosure generalises well: re-validate on every configuration change rather than at install, with the approval bound to a hash of the current definitions.
Controls that actually apply
Treat tool manifests as code under review — a description change has the same power over behaviour as a code change and deserves the same approval. Pin tool definitions by content hash so a silently updated description fails closed rather than taking effect.
And keep enforcement outside the model. If a tool must never touch production, that has to be a permission the agent does not hold, not a sentence in a description that a competing description can argue with. The model is reading a document partly written by an attacker; it is in no position to adjudicate.
Sources
Written by the Devence Lab research team.