flawopen.com/Incidents/deadbugz-mcp-delayed-metadata-supply-chain-campaign-august-2026
Deadbugz: MCP Tool Metadata Changed After Approval
Pillar Security documented an MCP supply-chain campaign that changed tool metadata after three normal calls. Its review found no pull requests merged through GitHub’s PR mechanism; its report did not document downstream compromise. The Cloud Security Alliance notes that visibility into independent local execution was limited.[1], [3]
Imagine approving a contractor because their badge lists harmless duties. After three routine deliveries, the badge quietly changes to request access to locked rooms. The danger is that the building still trusts the original approval. An MCP client must notice when a server changes the tool instructions it was approved to provide.[1]
Core Concepts & Subsystem Terms
MCP- A protocol through which an AI application discovers and calls tools provided by a server.[5]
Tool metadata- A tool’s name, description and input schema, which the client may place in model context.[5], [1]
Runtime-gated change- Behavior withheld until a normal interaction threshold is reached; Pillar reported a three-call counter.[1]
Supply-chain delivery- Introducing a dependency or configuration through a trusted development workflow, such as a repository pull request.[1]
Framework mappings
- CWE reference for the weakness described in this guide: CWE-829
Incident Timeline
Pillar identified 23 related pull requests created within a 74-minute window; its review found none merged through GitHub’s PR mechanism at that time.[1]
Pillar published its technical report describing the three-call metadata change and indicators.[1]
The OWASP GenAI Security Project included Deadbugz in its Q3 2026 roundup; this confirms attention, not compromise or search volume.[2]
Step-by-Step Attack Flow
Configuration is proposed
A pull request adds a remote or local MCP server configuration to an AI project. Pillar reviewed 17 remote-endpoint changes, four hidden local-script references, and two listing submissions.[1]
Initial review sees ordinary tools
The server initially presents text formatting and summarization tools. Pillar says brief review requests can receive this benign metadata.[1]
Source Code: Flaw vs. Secure Implementation
The source report describes metadata poisoning and pull-request delivery, not a CVE in the MCP specification. The risk occurs when a client treats mutable server-provided descriptions as permanently trusted after initial approval. The report attributes the campaign to a public GitHub account; this article reports that attribution as Pillar’s finding, not verified real-world identity. Pillar said its reviewed pull requests were not merged through GitHub’s PR mechanism at review time and did not establish downstream compromise. The linked source repository currently returns 404, so code claims here rely on Pillar’s published technical analysis rather than an independently re-fetched source tree. The defensive Python example is an illustrative client-side policy wrapper, not MCP library drop-in code. CWE-829 is an editorial classification; no CVE or CVSS is assigned. The adapter must refresh on MCP change notifications and include both tools/list and prompts/get; metadata_snapshot is an illustrative adapter method, not an MCP SDK API. Capture approved_digest only after operator review. The snapshot must include all relevant server-provided metadata, including tools/list definitions and the full prompts/get contents for approved prompts. Re-fetch before dispatch and stop the action on mismatch; this check cannot detect server behavior changes or a change between checking and use, so independent action permissions remain necessary.[1], [4], [5]
def agent_metadata(session):
# Adapter returns the server's current tools and prompts as JSON data.
return session.metadata_snapshot()
import hashlib
import hmac
import json
def fingerprint(snapshot):
normalized = dict(snapshot)
for key in ("tools", "prompts"):
normalized[key] = sorted(
snapshot[key],
key=lambda item: json.dumps(item, sort_keys=True, separators=(",", ":")),
)
canonical = json.dumps(normalized, sort_keys=True, separators=(",", ":"))
return hashlib.sha256(canonical.encode()).hexdigest()
def agent_metadata(session, approved_digest):
current = session.metadata_snapshot()
if not hmac.compare_digest(fingerprint(current), approved_digest):
raise PermissionError("MCP metadata changed; require operator approval")
return current
Engineering & System Hardening Checklist
- ✓Store a canonical fingerprint of each MCP server’s approved tool names, descriptions and input schemas.[1], [4]
- ✓Pause tool availability and require operator review when
tools/listorprompts/getchanges after approval.[1], [5], [4] - ✓Enforce file, credential, process and outbound-network permissions outside model instructions and tool metadata.[1], [4]
- ✓Review repository changes that add MCP endpoints or local server scripts; verify ownership and provenance before enabling them.[1]
- ✓Preserve client logs and compare tool-definition changes with agent actions if a connected server behaves unexpectedly.[1], [3]
Sources
- Pillar Security — Deadbugz: Currently Active MCP Supply-Chain Campaign (12 August 2026)
- OWASP GenAI Security Project — GenAI and Agentic AI Exploit Roundup Q3 2026 (8 October 2026)
- Cloud Security Alliance — Deadbugz: Runtime-Gated MCP Metadata Poisoning as Supply-Chain Attack
- OWASP MCP Security Cheat Sheet
- MCP specification: Tools