Signed tool manifests : additive extension for tool-poisoning / "rug pull" defense #2913
Replies: 7 comments 21 replies
|
Signed manifests close a real hole. Detecting that the tool description changed between approval and reconnect is exactly the rug-pull case the security guidance flags. Worth doing. One thing it leaves open: a signed manifest proves the description did not change, it does not prove what the tool actually did when called. A tool can keep an honest, signed manifest and still behave differently at runtime. The two layers compose cleanly: your signed manifest at admission, plus a signed per-call execution record at runtime, gives tamper-evidence across the whole lifecycle rather than just at connect time. I have been building the runtime half as an open SEP (2828), a hash-chained signed record of each tool call bound to the decision that authorized it. Different layer from yours, same Ed25519 toolbox. There is a real question of where the manifest signature and the call record should reference each other, and that is worth working out. |
|
Signed manifests close the descriptor half of this, and the additive shape is right — opt-in, verifiable, nothing breaks for servers that don't sign. @vaaraio and @Tuttotorna are already circling a second half: a signed manifest proves the descriptor didn't change, not what the tool did at runtime. That's the execution/authorization gap — per-call signed execution receipts (vaaraio's SEP-2828, a hash-chained record of each call bound to the decision that authorized it), binding the call, its authorization, and its outcome together. Real, and it's about the call. There's a third half neither the manifest nor the receipt work touches: what the tool's results carry back. A tool can be exactly what its manifest says, its call fully authorized and receipted, and still hand the model a mail body or an exec output with instructions a stranger wrote in it. Not a descriptor problem, not an authorization problem — a content-trust problem, and it starts the moment the result lands in context. I shipped a runtime answer to that third half on a production MCP server (session taint on tools that return other-authored bytes by construction, sticky out-of-band marker, pre-declared forbid set) and wrote it up with the limits stated plainly: #3093. The three compose: manifests prove what the tool is; execution receipts prove what the call did; taint governs what the agent may do after reading what came back. |
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
|
Signed manifests solve an important part of the trust problem: establishing that the tool the client approved is actually the tool being presented later. I wonder how this model should interact with runtime authorization, though. Even if the manifest is authentic and unchanged, the action itself may still be unsafe depending on its parameters, target, data flow, or the current agent state. It feels like there are two distinct questions here: “Can I trust what this tool claims to be?” and “Should this particular agent be allowed to invoke it right now?” Both seem necessary for a zero-trust agent environment. |
Uh oh!
There was an error while loading. Please reload this page.
Problem
MCP's security guidance already flags a gap: a server's tool descriptions can
change after a user approves them and there's currently no protocol-level
way for a client to detect it. This is the "tool poisoning" / "rug pull"
issue.
Proposal
I put together a small proposal + working reference implementation for an
optional, additive extension that lets servers sign their tool manifest
(Ed25519), so clients/gateways can detect tampering on reconnect.
docs/proposal.mdThe demo signs a tool manifest, then simulates a server silently editing a
tool's description (adding a hidden instruction) and shows verification
catching it.
Looking for feedback on
proposal.mdPosting here first before considering a formal SEP draft, happy to adjust
based on feedback.
All reactions