The news. On August 26, 2026 a paper introducing EvoMal was posted, studying coding agents that write new tools by imitating skills retrieved from shared libraries. An attacker plants a malicious skill and never invokes it; the agent later retrieves it as an example, copies the enclosed payload into a skill it writes, stores that skill, and executes it. Across six models and 153 tool-relevant SWE-bench Verified tasks, the paper reports self-poisoning rates of 20.3% to 41.8%, rising to 86.7% when the planted description targets a task family. Poisoned libraries accumulate 4.9–9.0× as many malicious skills as were planted, and a proposed counter-prompt defense cuts the rate to at most 6.7%. Read the paper →

Picture the folder of contract templates. Every drafter in the office pulls one out when they start something new, copies its shape, changes the parts that differ, and files the finished draft back into the same folder for whoever comes next. Someone slips a rogue template into it. Nobody signs that template, nobody sends it to a client, and if you were watching the outbox you would see nothing at all — the rogue document does its damage as a model to copy, not as a document to use. By the time it matters, the clause is sitting in several other contracts, each typed in a different drafter's words.

That is the gap EvoMal is pointing at, and it is a gap in where we watch. Almost every agent guard sits at the moment of action: inspect the tool call about to run, inspect what came back, allow or block. The shape works because the familiar attack ends in an action — untrusted text steers the agent, the agent calls something it should not, and the call site is a fine place to stop it. Imitation ends somewhere else: in a file the agent writes. The planted skill is never invoked, so a check that only ever fires on invocation has nothing to fire on, and the attack surface of the tools themselves turns out to include the ones the agent has not written yet.

The mechanism is worth stating precisely, because each step is ordinary on its own. An attacker places a malicious skill in a shared library without invoking it. During later skill authoring the agent imitates the retrieved structure and copies the enclosed payload into a new skill, stores it, executes it, and can make that copy available for further imitation. EvoMal reports using benign-looking structural banners to amplify the copying; the amplification is the reported part, and the plain reading is that a plant which looks like the house format invites being copied whole. Nothing in that sequence is a step the agent was not supposed to take; the only thing that went wrong is which part of the sample it treated as content.

That is also why the usual detectors come up short. The paper's own framing is that agent-authored copies persist after the planted skills are removed, creating persistence that name-, code-, or signature-based defenses can miss — each of those keys on some property of the original, and what the library is left holding was written by the agent rather than copied from the planted file.

DefenseWhat it keys onWhy the copy can slip past
Name / allow-listThe identifier of the known-bad skillThe skill in the library is one the agent authored, under a name of its own (mechanism as described; the paper reports only that such defenses can miss the copies)
Code hashAn exact match on the planted fileWhat is stored is a skill the agent wrote, so an exact match on the plant need not hold (mechanism as described)
Signature matchA pattern drawn from the originalThe paper reports persistence that name-, code-, or signature-based defenses can miss
Invocation-time policyThe call about to runNothing was called — the plant was read, not run (mechanism as described; the paper does not evaluate this class)
Removing the plantThe original fileQwen3 retains a 68% round-five poisoning rate after the planted skills are removed

Now price the amplification, because a rate per task hides what a library looks like after a while. Hold the plant fixed at ten malicious skills (illustrative: the paper reports the multiplier, not a plant count) and apply the paper's own figure — poisoned libraries accumulate 4.9–9.0× as many malicious skills as initially planted. Ten planted becomes 49 to 90 malicious skills in the library. Read the same quantity the other way and it is starker: for every one skill the attacker wrote, roughly four to eight more were written by the agents themselves. Now delete the attacker's ten, which is all that deleting the known-bad file can achieve, and 39 to 80 agent-authored copies are still sitting in the folder. The paper measures that persistence separately rather than by this arithmetic, and it points the same way: Qwen3 still shows a 68% round-five poisoning rate once the planted skills are removed — a rate per round, not a count of files, but the same finding seen from the other side. The attacker's contribution is the seed; almost everything in the library by the end was written by the agents that were supposed to be using it.

Two things follow for anyone running a skill library rather than reading about one. The first is that a retrieved skill is input, and deserves whatever you already do to input — the reason this reads as an input-filter question rather than an output one is that the dangerous moment is when the sample enters the context, several steps before anything is executed. The second is that EvoMal's own fix is a prompt: an instruction that discourages the imitation pattern, reported to bring the rate down to at most 6.7% with no significant task-completion loss. That is a large reduction and it is not zero, and a defense that lives in the prompt shares the fate of the prompt — so the durable version of this lesson is architectural: a library the agent writes into is a trust boundary, and the copies it accumulates are the part worth auditing.

Goes deeper in: AI Agents → Tool Use & Function Calling → Skills as a Primitive

Related explainers

Frequently Asked Questions

Check what you knowMap your AI & GPU knowledge across every track — free, role-based