← Tools I Use

The Mother of All AI Supply Chains: when MCP itself is the vulnerability

2026-06-06 · ~7 min read · Conor Dobbs

The AI coding security feed this spring has been a parade of named bugs in named products. A symlink trick that broke six agents. A trust dialog that regressed into one-click code execution. A poisoned briefing file that turned an agent into a credential courier. Each of those lives inside a specific tool, and each, in principle, gets a patch. The disclosure OX Security published this month is a different shape. It does not point at Cursor, or Claude Code, or Gemini CLI. It points at the protocol all three of them speak.

The Model Context Protocol is the wiring under the current agent boom. It is how an agent talks to the tools, data sources, and servers that give it hands in the real world, and Anthropic created and maintains the official SDKs that almost everyone builds on. OX Security's claim is that the flaw is not a coding mistake in any of those SDKs. It is an architectural decision baked into them. In their words, this is not a traditional coding error, it is a design choice in the official MCP SDKs, and the official position is that the behavior is expected.

The flaw is in the wiring, not the tool

The technical core is unglamorous and that is what makes it serious. Many MCP servers run over STDIO, a local transport where the client launches the server as a child process and pipes structured messages to it. Somewhere in that path, user-influenced input flows into parameters that become a shell command. When attacker-controlled text reaches a command boundary without being treated as untrusted, you get arbitrary command execution. This is the oldest bug class in the book, injection, riding the newest plumbing.

What is new is where it sits. A normal injection bug lives in one application, and fixing that application fixes the bug. Here the pattern is reproduced across a generation of tools because they all inherited it from the same SDKs and the same protocol assumptions. OX reports commands executing on six live production platforms during their testing, with up to two hundred thousand vulnerable instances in the wild and more than seven thousand MCP servers exposed to the public internet. A bug in your editor is your editor's problem. A bug in the protocol your editor, your framework, and your CI agent all depend on is everyone's problem at once.

Four ways in

The disclosure groups the exploitation into four families, and reading them together is the point, because each one targets a different trust assumption.

Unauthenticated UI injection. AI frameworks that expose a control surface without real authentication let an attacker drive the agent's tooling directly. If the UI that triggers MCP calls is reachable, the command execution underneath is reachable too. The named frameworks here include LangChain, LiteLLM, and IBM's LangFlow, plus a long tail of agent stacks like GPT Researcher, Agent Zero, and Bisheng.

Hardening bypasses. Even environments that tried to lock things down, Flowise among them, could be walked around. A mitigation that addresses the symptom and not the protocol-level cause tends to leave a path open, and these did.

Zero-click prompt injection in IDEs. This is the one that lands closest to a working developer. A poisoned input, content the agent reads as part of doing its job, drives the agent into invoking a tool that executes a command, with no keystroke from you. Cursor, VS Code, Windsurf, Claude Code, and Gemini CLI are all named in the affected set. The trigger is the same ordinary workflow you run every day: open a repo, ask the agent to do a task, let it read its context.

Malicious marketplace distribution. The most damning number in the writeup is this one. Of eleven MCP registries OX examined, nine were serving servers that could be weaponized. The place you go to install a trustworthy server is, more often than not, also a distribution channel for a poisoned one. The registry is supposed to be the safe path, and it is the contaminated path.

The part that does not have a patch

The detail that should change how you plan is the response. OX reports that Anthropic declined to make architectural changes, taking the position that the behavior is expected and that input sanitization is the responsibility of the developers who build on the SDK. Read that carefully, because it sets your timeline. You are not waiting for a fix to roll out and close this. The maintainer has said, in effect, that there is nothing here they intend to fix, and that handling untrusted input as untrusted is on you.

You can argue the merits both ways. A protocol that gives tools real power has to let those tools run commands, and a maintainer cannot sanitize an input space they do not control. That is a defensible engineering stance. It is also a stance that pushes the entire burden downstream to thousands of integrators who, the download numbers suggest, mostly did not know the burden was theirs. An SDK with more than a hundred and fifty million downloads sets a default, and the default here is that the dangerous path is open unless you closed it.

What to change today

Because there is no patch coming, the work is configuration and discipline, and most of it you can do this week.

Treat every external MCP server as untrusted code. Adding an MCP server is not like adding a read-only data source. It is closer to running a binary someone handed you. Vet the source, prefer servers you can read, and assume a server you did not write can run commands in whatever context you give it.

Get your MCP servers off the public internet. Seven thousand exposed servers is a number that should not exist. A server that brokers tool execution for an agent has no business listening on a public IP. Bind to localhost, put it behind authentication, restrict access to the services that genuinely need it, and audit what is currently reachable from outside.

Sandbox the servers. Run MCP services in a container or a constrained environment where command execution, if it happens, cannot reach your credentials, your production network, or your source tree. The injection bug is real, so plan for the day it fires and make the blast radius small.

Stick to official directories, and still verify. With nine of eleven registries implicated, marketplace trust is thin. Prefer first-party directories, pin the servers you adopt, and do not install a fresh, low-reputation server into an environment that holds anything you care about.

Monitor tool invocations. The execution is observable even when the instruction that caused it is buried in context. Log which tools your agent calls and what commands run underneath, so an invocation you never intended has a chance of being seen. Watch the outbound calls, not only the prompts.

The bigger pattern

This belongs to the same story as the symlink hijacks, the regressed trust dialogs, and the poisoned config files filling this category's disclosure feed. The model is rarely the weak link. The plumbing around it is: the files it reads, the dialogs it trusts, and now the protocol it uses to reach the outside world. The industry standardized on MCP at the speed of the hype, wired it into editors and frameworks and pipelines, and inherited a design where untrusted input can become a command. The maintainer says that is working as intended and the fix is yours. Whether or not you agree, that sentence is the one to act on, because it means the only protection you will get is the protection you configure. The wiring everyone shares is now part of everyone's attack surface.