<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Stocks</title>
    <description>The latest articles on DEV Community by Nick Stocks (@mistaike_ai).</description>
    <link>https://dev.to/mistaike_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3830129%2F1b02e4cb-4d63-4510-9aef-d9c633d79a0a.jpeg</url>
      <title>DEV Community: Nick Stocks</title>
      <link>https://dev.to/mistaike_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mistaike_ai"/>
    <language>en</language>
    <item>
      <title>Why Local Sandboxing Isn't Enough for MCP Servers</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sun, 05 Apr 2026 14:47:14 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/why-local-sandboxing-isnt-enough-for-mcp-servers-k6j</link>
      <guid>https://dev.to/mistaike_ai/why-local-sandboxing-isnt-enough-for-mcp-servers-k6j</guid>
      <description>&lt;p&gt;Local sandbox tools for MCP servers are solving a real problem. They solve it well on a developer's machine. That's not the same as solving it when your agent handles other people's data.&lt;/p&gt;

&lt;p&gt;This post looks at what tools like &lt;a href="https://github.com/pottekkat/sandbox-mcp" rel="noopener noreferrer"&gt;sandbox-mcp&lt;/a&gt; (by Navendu Pottekkat) and &lt;a href="https://github.com/Automata-Labs-team/code-sandbox-mcp" rel="noopener noreferrer"&gt;code-sandbox-mcp&lt;/a&gt; (by Automata Labs) actually provide, where they stop, and what that gap costs you once agents are running against real user data.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Local Sandbox Tools Do Well
&lt;/h2&gt;

&lt;p&gt;Navendu Pottekkat built sandbox-mcp to address a concrete problem: LLMs that generate code can't execute it safely. His &lt;a href="https://navendu.me/posts/sandbox-mcp/" rel="noopener noreferrer"&gt;write-up&lt;/a&gt; explains the design clearly. The tool spins up Docker containers on your local machine, routes code execution through them, and returns output to the agent — without touching your host system directly.&lt;/p&gt;

&lt;p&gt;The OS hardening in sandbox-mcp is real work. Containers drop all Linux capabilities (&lt;code&gt;capDrop: ["all"]&lt;/code&gt;), set &lt;code&gt;no-new-privileges: true&lt;/code&gt;, and run with a read-only filesystem — only specific mount points are writable. Resource limits are configurable per-sandbox (CPU, memory, process count, file quotas). These are not defaults you get from vanilla Docker; Pottekkat made deliberate choices to reduce privilege at the OS layer.&lt;/p&gt;

&lt;p&gt;Code-sandbox-mcp, from Automata Labs, takes a more minimal approach — Docker container lifecycle management exposed as MCP tools (&lt;code&gt;sandbox_initialize&lt;/code&gt;, &lt;code&gt;sandbox_exec&lt;/code&gt;, &lt;code&gt;copy_file&lt;/code&gt;, &lt;code&gt;sandbox_stop&lt;/code&gt;) without the same documented OS hardening. It's useful for flexible, image-driven execution, with the container configuration left to the operator.&lt;/p&gt;

&lt;p&gt;Both tools have the same scope: isolate code execution on a developer's local machine. That scope is well-defined and both tools serve it honestly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shared Kernel Problem
&lt;/h2&gt;

&lt;p&gt;Docker containers — including hardened ones — share the host operating system kernel. Every system call from every container on your machine is handled by the same kernel, regardless of &lt;code&gt;cap-drop&lt;/code&gt; configuration.&lt;/p&gt;

&lt;p&gt;Capability drops restrict what a process can do with valid operations: they won't prevent exploitation of a kernel vulnerability itself. Linux exposes roughly 350 system calls. &lt;a href="https://unit42.paloaltonetworks.com/making-containers-more-isolated-an-overview-of-sandboxed-container-technologies/" rel="noopener noreferrer"&gt;Palo Alto's Unit 42&lt;/a&gt; describes the core issue: traditional containers are "not truly sandboxed" because they share the host OS kernel, and the attack surface is the full syscall table. A container escape via a kernel vulnerability — CVE-2022-0492 (cgroups bypass), CVE-2019-5736 (runc overwrite) — gives an attacker direct access to the host, independent of how the container was configured.&lt;/p&gt;

&lt;p&gt;The mistaike.ai sandbox runs MCP servers inside a user-space kernel (gVisor runsc). Instead of passing system calls directly to the host kernel, gVisor's Sentry intercepts them and implements them in user space. The host kernel exposure drops to fewer than 20 syscalls for the entire sandbox. &lt;a href="https://github.com/google/gvisor" rel="noopener noreferrer"&gt;Google's gVisor documentation&lt;/a&gt; describes this: gVisor and similar approaches reduce the kernel attack surface to under 10% of Linux's full syscall count, as documented in Unit 42's research.&lt;/p&gt;

&lt;p&gt;This is a qualitatively different isolation model, not a stricter configuration of the same model.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Egress Gap
&lt;/h2&gt;

&lt;p&gt;sandbox-mcp disables network access in its shell sandbox — that's a genuine safeguard for untrusted shell execution. But the Go, Java, JavaScript, Rust, network-tools, and APISIX sandboxes enable network access because they need it. Code-sandbox-mcp doesn't document egress restrictions at all.&lt;/p&gt;

&lt;p&gt;For MCP servers specifically, network access isn't optional — they need to call APIs, connect to databases, fetch data. You can't disable the network and still have a functional MCP tool.&lt;/p&gt;

&lt;p&gt;That means a sandboxed MCP server running on your machine, through either tool, can reach any external endpoint it wants. No filtering, no allowlist, no logging of what it connects to.&lt;/p&gt;

&lt;p&gt;This matters when an MCP server is compromised — whether by a supply chain attack, a malicious dependency, or a CVE in a library it uses. A compromised container with unrestricted network access can exfiltrate data over plain HTTP, reach internal network endpoints, or beacon to any external host. The container isolation protects your filesystem and process space. It doesn't protect your network.&lt;/p&gt;

&lt;p&gt;The mistaike.ai sandbox enforces default-deny egress via an Envoy proxy. MCP servers declare the external FQDNs they need (maximum 10, no wildcards). Everything else is blocked before a packet leaves the container.&lt;/p&gt;




&lt;h2&gt;
  
  
  No DLP on Tool Call Traffic
&lt;/h2&gt;

&lt;p&gt;When your agent calls an MCP tool, two things flow through the connection: the request (which may contain secrets, PII, or sensitive business data) and the response (which may contain the same, or injected content).&lt;/p&gt;

&lt;p&gt;Local sandbox tools operate at the process execution layer — Docker container isolation is about filesystem and process separation, not protocol inspection. They don't intercept and analyse the MCP protocol data flowing in and out.&lt;/p&gt;

&lt;p&gt;If your agent passes an AWS credential as part of a tool call parameter, it passes through. If a tool response includes a database connection string from a third-party data source, your agent processes it.&lt;/p&gt;

&lt;p&gt;Bidirectional DLP scanning on every tool call intercepts both directions in under 50ms. Outbound: credentials and PII are caught before they reach third-party code. Inbound: sensitive data patterns in responses are redacted before your agent acts on them. Every match is logged with what triggered, what rule matched, and what was redacted.&lt;/p&gt;




&lt;h2&gt;
  
  
  No 0-Day CVE Protection
&lt;/h2&gt;

&lt;p&gt;When you install an MCP server locally, you're pulling in its entire dependency tree. A compromised package — whether from a supply chain attack or a newly disclosed vulnerability — runs with whatever permissions the container has. Local sandbox tools don't scan those dependencies or alert you when one goes bad.&lt;/p&gt;

&lt;p&gt;Traditional vulnerability scanners check committed code in CI. They don't continuously monitor the MCP servers you're actually running, and they don't inspect what those servers return.&lt;/p&gt;

&lt;p&gt;mistaike.ai provides 0-day CVE protection: every tool response is checked against known CVE patterns, updated daily or more frequently as new vulnerabilities are disclosed. If a registered MCP server is found to have a compromised dependency, it's quarantined immediately — pulled from service before it can process another request. This protection is free on all plans, including the gateway tier.&lt;/p&gt;

&lt;p&gt;See the full &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;CVE registry →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  No Team-Wide Policy
&lt;/h2&gt;

&lt;p&gt;Local sandbox tools are per-developer configurations. Each engineer maintains their own Docker setup, their own sandbox images, their own resource limits. There is no shared policy.&lt;/p&gt;

&lt;p&gt;At team scale, when the same MCP server is being called from five machines with five different sandbox configurations, the effective security posture is the weakest configuration in the group. There's no centralised audit log spanning all connections.&lt;/p&gt;

&lt;p&gt;Team-wide policy means one set of rules applies to all agent traffic from all team members. A policy change propagates immediately across all connections. The audit log shows what happened across the full team, not just one developer's local environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Actually Means If You're Building for Users
&lt;/h2&gt;

&lt;p&gt;The sections above describe technical gaps. But the reason those gaps matter isn't technical — it's about what you can promise the people who depend on what you build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a freelancer building agent workflows for clients:&lt;/strong&gt; Your client is going to ask how their data is protected. "I run the MCP server in a Docker container on my machine" is an honest answer, but it doesn't give them anything to audit. With DLP scanning and an immutable audit log, you can show them exactly what data flowed through, what was caught, and what rules were applied. That's the difference between a verbal assurance and a verifiable control. For enterprise clients, this is often a prerequisite — not a nice-to-have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a solo founder shipping your first AI product:&lt;/strong&gt; The gap between prototype and product is the gap between "it works" and "it's safe for other people's data." Local sandboxing gets you through the prototype phase. But when your first real user puts their API key into your tool, or your agent processes a customer's database query, you need to know that data isn't leaking through a compromised MCP tool response. You probably don't have time to build that scanning infrastructure yourself, and you shouldn't have to. That's the kind of thing you should be able to buy for the cost of a couple of coffees a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a small team and your agent connects to third-party MCP servers:&lt;/strong&gt; You control your own code, but you don't control what's in the dependency trees of community MCP servers. A compromised package in a popular tool means every agent using it is exposed. 0-day CVE protection means every response is scanned and compromised servers are quarantined automatically — you don't have to notice the advisory yourself. Without that, you're trusting every upstream maintainer to never get compromised. That's a bet that doesn't scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're building an internal tool for your team:&lt;/strong&gt; Even if the data isn't customer-facing, it's still sensitive. Internal tools often have &lt;em&gt;less&lt;/em&gt; scrutiny than production systems, which makes them better targets. A centrally managed policy that applies DLP and CVE scanning across all team members' agent connections means one engineer's local Docker misconfiguration doesn't become the weakest link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're evaluating tools and wondering when to make the switch:&lt;/strong&gt; There's no urgency to move off local sandboxing while you're prototyping. Local tools are fine for development. The trigger point is when real data enters the picture — your users' data, client data, production API keys, anything you'd care about losing. That's when the gap between process isolation and content-aware security becomes material. The free gateway tier lets you add CVE protection to your existing setup without changing how your servers are deployed, so you can close the most critical gap first and move to managed hosting when you're ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Local Tools Fit
&lt;/h2&gt;

&lt;p&gt;Local sandbox tools are the right choice for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development and testing on your own machine, where production-grade policy enforcement is overhead&lt;/li&gt;
&lt;li&gt;Short-lived code experiments where kernel-level isolation is acceptable risk&lt;/li&gt;
&lt;li&gt;Any context where the agent isn't processing real user data or touching production systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're good tools solving a real problem at the right scope. The issue isn't that they're inadequate — it's that the problem changes shape when you go from building for yourself to building for other people, and the tooling needs to change with it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side by Side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;code-sandbox-mcp&lt;/th&gt;
&lt;th&gt;sandbox-mcp (pottekkat)&lt;/th&gt;
&lt;th&gt;mistaike.ai hosted sandbox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Process isolation&lt;/td&gt;
&lt;td&gt;Docker (defaults)&lt;/td&gt;
&lt;td&gt;Docker + cap-drop all + no-new-privs + read-only FS&lt;/td&gt;
&lt;td&gt;gVisor user-space kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host kernel exposure&lt;/td&gt;
&lt;td&gt;~350 syscalls&lt;/td&gt;
&lt;td&gt;~350 syscalls&lt;/td&gt;
&lt;td&gt;&amp;lt;20 syscalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress control&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None (shell only has network disabled)&lt;/td&gt;
&lt;td&gt;Default-deny, FQDN allowlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DLP scanning&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Bidirectional, &amp;lt;50ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0-day CVE protection&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Daily updates, response scanning, auto-quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content safety&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Prompt injection detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets handling&lt;/td&gt;
&lt;td&gt;Operator-defined&lt;/td&gt;
&lt;td&gt;Operator-defined&lt;/td&gt;
&lt;td&gt;Envelope-encrypted, memory-injected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team policy&lt;/td&gt;
&lt;td&gt;Per-developer&lt;/td&gt;
&lt;td&gt;Per-developer&lt;/td&gt;
&lt;td&gt;Org-wide, instant propagation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit log&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Per-scan, immutable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted option&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://mistaike.ai/security/sandbox" rel="noopener noreferrer"&gt;security architecture page&lt;/a&gt; has a full breakdown of how each layer is implemented.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you're running MCP servers locally and want to close the CVE gap first: connect your existing tools through the mistaike.ai gateway. You get 0-day CVE protection on every tool response immediately, at no cost, without changing how your servers are deployed.&lt;/p&gt;

&lt;p&gt;If you're ready for managed hosting with the full isolation stack: &lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;start free →&lt;/a&gt; and follow the &lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;setup guide →&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mistaike.ai/pricing" rel="noopener noreferrer"&gt;Full pricing →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nick Stocks is the founder of mistaike.ai.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/local-sandbox-not-enough" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>sandbox</category>
      <category>dlp</category>
    </item>
    <item>
      <title>Why Default-Deny Egress Matters for MCP Server Hosting</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sun, 05 Apr 2026 09:55:08 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/why-default-deny-egress-matters-for-mcp-server-hosting-30m3</link>
      <guid>https://dev.to/mistaike_ai/why-default-deny-egress-matters-for-mcp-server-hosting-30m3</guid>
      <description>&lt;p&gt;&lt;strong&gt;An MCP server is code running on infrastructure. By default, that code can connect to any IP address or domain on the internet — including yours.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;Start for free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;Setup guide →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;When people think about MCP security risks, they think about what comes &lt;em&gt;in&lt;/em&gt;: malicious tool responses, prompt injection, supply chain attacks. That's the right instinct, but it's only half the picture.&lt;/p&gt;

&lt;p&gt;The other half is what goes &lt;em&gt;out&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;An MCP server running inside a container — whether on your infrastructure or a managed platform — has outbound network access by default. It can open a connection to any domain, any IP, on any port. If that server is compromised or malicious, it can use that network access to exfiltrate everything it touches: environment variables, secrets, data passed through tool calls, credentials it has been given.&lt;/p&gt;

&lt;p&gt;Default-deny egress closes that door.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Exfiltration Attack Model
&lt;/h2&gt;

&lt;p&gt;The attack is straightforward. A compromised or malicious MCP server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receives data through a tool call — secrets injected into the environment, a user's query, a database response, an API credential&lt;/li&gt;
&lt;li&gt;Opens an outbound connection to an attacker-controlled endpoint&lt;/li&gt;
&lt;li&gt;Sends the data out&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The entire attack happens at the network layer. No exploit chain, no persistence mechanism. Just an HTTP POST to a domain the attacker controls.&lt;/p&gt;

&lt;p&gt;This isn't theoretical. The &lt;a href="https://blog.gitguardian.com/smithery-mcp-breach/" rel="noopener noreferrer"&gt;Smithery.ai breach&lt;/a&gt; — documented by GitGuardian — demonstrated credential exfiltration from a path traversal vulnerability that exposed API keys from thousands of MCP servers. Default-deny egress would not have prevented the initial path traversal, but it would have blocked the outbound call that extracted the credentials. The blast radius shrinks dramatically when the server can't reach arbitrary endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Default-Deny" Actually Means
&lt;/h2&gt;

&lt;p&gt;Standard Docker containers have unrestricted outbound network access. There is no egress configuration by default — a container can connect anywhere. Most MCP server management tools and hosting platforms do not change this. They isolate the container from the host but leave outbound traffic open.&lt;/p&gt;

&lt;p&gt;Default-deny egress inverts the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All outbound connections are blocked unless explicitly allowed&lt;/li&gt;
&lt;li&gt;The allowlist is declared at deploy time — not modifiable at runtime&lt;/li&gt;
&lt;li&gt;Connections to undeclared destinations are dropped at the network layer, independent of what the server code does&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means a server that has been fully compromised — where an attacker has arbitrary code execution — still cannot reach an exfiltration endpoint that wasn't declared before the server started. The attacker controls the code but not the network rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  How mistaike.ai Implements Egress Control
&lt;/h2&gt;

&lt;p&gt;On mistaike.ai, egress enforcement runs through an Envoy proxy that sits between the container and the external network. When you deploy an MCP server, you declare the FQDNs it needs to reach (max 10, no wildcards, no raw IP addresses). The proxy enforces this list; everything else is dropped.&lt;/p&gt;

&lt;p&gt;The constraints exist for security reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No wildcards&lt;/strong&gt; — &lt;code&gt;*.example.com&lt;/code&gt; allows too broad a surface, including subdomains you don't control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No IP addresses&lt;/strong&gt; — raw IP allowlisting bypasses DNS-based controls and is difficult to audit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max 10 FQDNs&lt;/strong&gt; — keeps the allowlist reviewable; a server that needs more than 10 external endpoints is doing more than one thing and should be decomposed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The enforcement happens before traffic leaves the container. It is not firewall rules applied at the host level after the fact — it is the proxy layer that mediates every outbound connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is One Layer, Not a Complete Defence
&lt;/h2&gt;

&lt;p&gt;Default-deny egress addresses one specific attack vector: uncontrolled exfiltration via outbound network access. It does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent the initial compromise&lt;/li&gt;
&lt;li&gt;Stop data from being included in &lt;em&gt;declared&lt;/em&gt; outbound traffic (to an allowed domain)&lt;/li&gt;
&lt;li&gt;Replace DLP scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why mistaike.ai's sandbox combines egress control with DLP scanning and kernel-level isolation. Each layer addresses different failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;gVisor&lt;/strong&gt; (kernel isolation) — limits what system calls the server can make, containing privilege escalation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default-deny egress&lt;/strong&gt; — blocks exfiltration to undeclared endpoints regardless of what the server code does&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DLP scanning&lt;/strong&gt; — inspects the &lt;em&gt;content&lt;/em&gt; of traffic on declared paths, catching credential and PII leakage through legitimate channels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An attacker who compromises a server faces all three controls simultaneously. Bypassing one doesn't make the others irrelevant.&lt;/p&gt;

&lt;p&gt;DLP alone is insufficient if the server can reach arbitrary endpoints — you'd have to scan every outbound byte to every possible destination. Egress control reduces the problem to scanning traffic on a declared set of paths. Combined, they catch different parts of the same attack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Look for When Evaluating MCP Hosting
&lt;/h2&gt;

&lt;p&gt;Egress control is not complex to implement, but it requires deliberate design. A platform that has thought seriously about MCP server security will be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the default egress policy for hosted servers?&lt;/li&gt;
&lt;li&gt;At what layer is egress enforced? (Application-level filtering is weaker than network-layer enforcement)&lt;/li&gt;
&lt;li&gt;Can servers modify their own egress rules at runtime?&lt;/li&gt;
&lt;li&gt;Is the allowlist declared at deploy time and immutable during execution?&lt;/li&gt;
&lt;li&gt;What happens to outbound connections to undeclared destinations?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a platform can't answer these questions clearly, the answer is probably "unrestricted outbound."&lt;/p&gt;




&lt;h2&gt;
  
  
  Egress Control on mistaike.ai
&lt;/h2&gt;

&lt;p&gt;Managed MCP hosting on mistaike.ai includes default-deny egress on every server, every plan. You declare the FQDNs your server needs at deploy time. Everything else is blocked.&lt;/p&gt;

&lt;p&gt;This sits alongside sandboxed builds, envelope-encrypted secrets, kernel-level isolation, DLP scanning, and CVE pattern matching — the full architecture is at &lt;a href="https://mistaike.ai/security/sandbox" rel="noopener noreferrer"&gt;/security/sandbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're evaluating MCP hosting and want to understand what's in each layer, the &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;CVE registry&lt;/a&gt; shows the patterns we track and update daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;Start free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/pricing" rel="noopener noreferrer"&gt;Full pricing →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;Setup guide →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nick Stocks is the founder of mistaike.ai.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/default-deny-egress-mcp" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>sandbox</category>
      <category>networking</category>
    </item>
    <item>
      <title>When Prompt Injection Becomes Remote Code Execution</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:21:51 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/when-prompt-injection-becomes-remote-code-execution-1h3n</link>
      <guid>https://dev.to/mistaike_ai/when-prompt-injection-becomes-remote-code-execution-1h3n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Prompt injection is usually discussed as a text-level attack — tricking an LLM into saying something it shouldn't. Four new CVEs in CrewAI demonstrate that when agents have tools, prompt injection becomes a vehicle for remote code execution on the host system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;Start for free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/blog/why-your-ai-agent-needs-dlp" rel="noopener noreferrer"&gt;Why your AI agent needs DLP →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Most conversations about prompt injection focus on the LLM itself. An attacker crafts input that overrides system instructions, and the model does something its operator didn't intend — leaks a system prompt, ignores a guardrail, says something off-brand.&lt;/p&gt;

&lt;p&gt;That framing is incomplete. When an LLM is embedded in an agent framework with access to tools — code interpreters, file loaders, search APIs — prompt injection doesn't just change what the model &lt;em&gt;says&lt;/em&gt;. It changes what the model &lt;em&gt;does&lt;/em&gt;. And what it does runs on your system.&lt;/p&gt;

&lt;p&gt;On April 1, 2026, CERT/CC published &lt;a href="https://kb.cert.org/vuls/id/221883" rel="noopener noreferrer"&gt;VU#221883&lt;/a&gt;: four CVEs in &lt;a href="https://github.com/crewAIInc/crewAI" rel="noopener noreferrer"&gt;CrewAI&lt;/a&gt;, one of the most widely-used AI agent frameworks. The vulnerabilities are individually straightforward. Chained together via prompt injection, they produce a complete attack path from untrusted input to remote code execution on the host.&lt;/p&gt;

&lt;p&gt;This is why we built mistaike.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four CVEs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CVE-2026-2275: The Sandbox That Isn't One
&lt;/h3&gt;

&lt;p&gt;CrewAI's Code Interpreter tool is designed to execute agent-generated code inside a Docker container. If Docker isn't available — not installed, not running, or the daemon isn't reachable — the tool silently falls back to &lt;code&gt;SandboxPython&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SandboxPython&lt;/code&gt; sounds safe. It isn't. The critical issue is that it permits &lt;code&gt;ctypes&lt;/code&gt; — Python's foreign function interface, which lets code load and call functions from any shared library on the system.&lt;/p&gt;

&lt;p&gt;In practice, this means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ctypes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdll&lt;/span&gt;
&lt;span class="n"&gt;libc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LoadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;libc.so.6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;libc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That executes a shell command with the privileges of the agent process. The attacker doesn't need to escape a container. There's no container to escape from. They can call &lt;code&gt;execve&lt;/code&gt;, &lt;code&gt;fork&lt;/code&gt;, &lt;code&gt;socket&lt;/code&gt;, or any other libc function directly.&lt;/p&gt;

&lt;p&gt;A "sandbox" that allows arbitrary &lt;code&gt;ctypes&lt;/code&gt; calls is not a sandbox. It's a polite suggestion. The attacker's code runs on the host with full access to the process's memory, file descriptors, and network stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-2287: Silent Sandbox Degradation
&lt;/h3&gt;

&lt;p&gt;This is the enabling condition for CVE-2026-2275. CrewAI checks whether Docker is available at agent initialisation — but it doesn't re-verify the check at execution time.&lt;/p&gt;

&lt;p&gt;The consequence: if Docker becomes unavailable &lt;em&gt;after&lt;/em&gt; the agent starts — the daemon crashes, the socket becomes unreachable, the container runtime is killed — the Code Interpreter continues to accept execution requests, but silently routes them through &lt;code&gt;SandboxPython&lt;/code&gt; instead of Docker.&lt;/p&gt;

&lt;p&gt;No exception. No log warning. No error to the operator. The agent carries on as if sandboxing is working.&lt;/p&gt;

&lt;p&gt;This is a TOCTOU (time-of-check/time-of-use) class of failure. The state verified at initialisation is not the state present at execution. In containerised environments, cloud-hosted agents, and CI pipelines, Docker availability is often conditional — and an attacker who can influence the environment (or simply wait for an intermittent failure) can force the fallback.&lt;/p&gt;

&lt;p&gt;The operator's dashboard shows the agent running. It is. Just without the isolation they think they have.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-2286: SSRF via RAG Search Tools
&lt;/h3&gt;

&lt;p&gt;CrewAI's RAG search tools accept arbitrary URLs at runtime without validation. The attack vector is not a crafted HTTP request or a malicious API parameter — it's conversational input to the agent. The injected prompt directs the LLM to search a specific URL, and the tool fetches it.&lt;/p&gt;

&lt;p&gt;The target isn't a public website. It's the cloud metadata endpoint.&lt;/p&gt;

&lt;p&gt;On AWS, the instance metadata service is reachable from any running workload at &lt;code&gt;169.254.169.254&lt;/code&gt;. A request to &lt;code&gt;http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;/code&gt; returns the name of the attached IAM role. A second request to &lt;code&gt;http://169.254.169.254/latest/meta-data/iam/security-credentials/{role-name}&lt;/code&gt; returns a JSON blob with a live &lt;code&gt;AccessKeyId&lt;/code&gt;, &lt;code&gt;SecretAccessKey&lt;/code&gt;, and session &lt;code&gt;Token&lt;/code&gt; — valid AWS credentials, rotated automatically, with whatever permissions the instance role carries.&lt;/p&gt;

&lt;p&gt;GCP exposes similar data at &lt;code&gt;http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token&lt;/code&gt;. Azure at &lt;code&gt;http://169.254.169.254/metadata/identity/oauth2/token&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An attacker who can get the agent to fetch one of these URLs has extracted cloud credentials. Those credentials can enumerate S3 buckets, describe EC2 instances, read Secrets Manager entries, or call any other AWS service the role is permitted to reach — without ever touching the host's filesystem or network directly.&lt;/p&gt;

&lt;p&gt;The RAG tool returns the response content to the agent's context window. From there, it may appear in the agent's output to the user, be passed to another tool, or be logged. Any of these paths exfiltrates the credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-2285: Arbitrary File Read via JSON Loader
&lt;/h3&gt;

&lt;p&gt;CrewAI's JSON loader tool reads files from disk using paths constructed at runtime — and performs no path normalisation or validation before opening them.&lt;/p&gt;

&lt;p&gt;Without a call to &lt;code&gt;os.path.abspath()&lt;/code&gt; followed by a prefix check against an allowed directory, any path the agent constructs is valid input to the loader. Including relative paths with traversal components.&lt;/p&gt;

&lt;p&gt;The most directly valuable targets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;/proc/self/environ&lt;/code&gt; — the running process's environment variables. If the application loaded a &lt;code&gt;.env&lt;/code&gt; file at startup, all of those keys — &lt;code&gt;DATABASE_URL&lt;/code&gt;, &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, &lt;code&gt;SECRET_KEY&lt;/code&gt;, &lt;code&gt;STRIPE_SECRET_KEY&lt;/code&gt; — are present here, in plain text, as environment variables accessible from the process's own &lt;code&gt;/proc&lt;/code&gt; entry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; files — if the agent process's working directory is the application root (common in development and many container configurations), a relative path like &lt;code&gt;../../.env&lt;/code&gt; traverses to the application's dotenv file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;, &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt; — private keys. If the agent process runs as a user with an SSH keypair, the attacker can read it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;/etc/shadow&lt;/code&gt; (if running as root), AWS credential files at &lt;code&gt;~/.aws/credentials&lt;/code&gt;, kubectl config at &lt;code&gt;~/.kube/config&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The contents are returned to the agent's context window. The agent doesn't need to exfiltrate them explicitly — they'll appear in its next response, get passed to another tool, or be written to a log.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Chain Works
&lt;/h2&gt;

&lt;p&gt;None of these vulnerabilities require sophisticated exploitation individually. The attack path is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt injection.&lt;/strong&gt; Attacker-controlled text reaches the agent's context — via direct user input, RAG retrieval from an external source, a tool response from a compromised third-party service, or any other channel the agent reads from.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool invocation.&lt;/strong&gt; The injected text instructs the agent to use its tools: execute this code, load this file, search this URL. The LLM processes injected instructions the same way it processes legitimate ones — it has no reliable way to distinguish them. The tool call is made.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sandbox escape.&lt;/strong&gt; The Code Interpreter checks Docker availability. If Docker is down (or was never running), it falls back to &lt;code&gt;SandboxPython&lt;/code&gt;. The attacker's code runs with &lt;code&gt;ctypes&lt;/code&gt; access — arbitrary C function calls on the host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Credential harvesting and lateral movement.&lt;/strong&gt; Parallel to the code execution path: the SSRF tool fetches cloud metadata credentials; the JSON loader reads &lt;code&gt;/proc/self/environ&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt;. The attacker now has host RCE, live cloud credentials, and application secrets. They have everything they need to move laterally — to the database, to object storage, to other services in the same VPC.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The LLM was never the target. It was the delivery mechanism.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is the Problem We Set Out to Solve
&lt;/h2&gt;

&lt;p&gt;We started building mistaike because we kept running into a specific blind spot in how organisations think about AI agents: they treat the LLM as the security boundary.&lt;/p&gt;

&lt;p&gt;The assumption is: if we trust the model, and we've tuned it not to do bad things, we're safe. Prompt injection — when it's acknowledged at all — gets treated as a correctness problem. Make the model more instruction-following, improve the system prompt, add a content filter on inputs.&lt;/p&gt;

&lt;p&gt;The CrewAI CVEs make the flaw in that reasoning concrete. The attacker doesn't need the LLM to &lt;em&gt;want&lt;/em&gt; to do something harmful. They need it to &lt;em&gt;do&lt;/em&gt; what it's told — which is exactly what a well-instruction-following model does best.&lt;/p&gt;

&lt;p&gt;The tools are the attack surface. Every tool call is a boundary crossing — from the LLM's context into real infrastructure. And in most agent deployments, those boundary crossings are completely unmonitored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No validation that the arguments a tool receives are within expected ranges&lt;/li&gt;
&lt;li&gt;No inspection of what tool responses contain before they re-enter the agent's context&lt;/li&gt;
&lt;li&gt;No control over what data leaves the system through tool output channels&lt;/li&gt;
&lt;li&gt;No audit log of what was executed, fetched, or read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the gap we built mistaike to close. DLP on the tool-call boundary catches credentials moving in either direction — whether the exfiltration is deliberate (a compromised tool returning AWS keys) or incidental (the agent summarising the contents of &lt;code&gt;/proc/self/environ&lt;/code&gt; in its response). Content safety on tool inputs catches injection payloads before they reach the LLM and trigger malicious tool calls in the first place.&lt;/p&gt;

&lt;p&gt;The CVE chain above represents a worst-case scenario for an unprotected agent deployment. With inspection at the tool boundary, several steps of it become detectable or blockable before system compromise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Pattern Extends Beyond CrewAI
&lt;/h2&gt;

&lt;p&gt;CrewAI is not uniquely at fault. It's the framework where these specific bugs were discovered. The same conditions exist throughout the agent ecosystem — because they're not bugs so much as architectural defaults.&lt;/p&gt;

&lt;p&gt;The pattern requires three things, all of which are common:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Untrusted input reaches the agent's context.&lt;/strong&gt; This means RAG retrieval from external sources, user messages, tool outputs from third-party services, webhook payloads — anything the agent processes that an attacker can influence. In production agentic deployments, this is almost always true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The agent has tools with system-level capabilities.&lt;/strong&gt; Code execution, file access, HTTP requests, database queries. These are not exotic — they're the reason people use agent frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The tools lack independent security boundaries.&lt;/strong&gt; No sandbox for code execution, no URL allowlisting for HTTP requests, no path validation for file access, no output inspection before re-ingestion.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three are true for the majority of agent deployments today. The attack surface is not limited to CrewAI users.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Helps
&lt;/h2&gt;

&lt;p&gt;Patching CrewAI removes these specific vulnerabilities. It doesn't close the underlying pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harden the sandbox — and fail closed, not open.&lt;/strong&gt; Docker with a restrictive seccomp profile is a meaningful improvement over unrestricted execution. Kernel-level isolation via &lt;a href="https://gvisor.dev/" rel="noopener noreferrer"&gt;gVisor&lt;/a&gt; reduces the available syscall surface from 300+ calls to approximately 20 — dramatically limiting what attacker code can do even if it executes. But the more important principle is the failure mode: a sandbox that degrades silently to unrestricted execution provides no protection in practice. If the container runtime isn't available, the Code Interpreter should refuse to execute, not fall back. Fail closed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate tool inputs outside the LLM.&lt;/strong&gt; The LLM's decision to call a tool with a particular URL, file path, or code payload should not be the final authority on whether that call happens. Tools should enforce their own allow lists and path restrictions independently of what the agent requested — because those restrictions need to hold even when the LLM has been manipulated. Validation that can be bypassed via prompt injection is not validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Control egress at the network layer.&lt;/strong&gt; Default-deny outbound network access for agent execution environments. Explicitly declare the domains each tool is permitted to reach. Block the metadata endpoints (&lt;code&gt;169.254.169.254&lt;/code&gt;, &lt;code&gt;metadata.google.internal&lt;/code&gt;) at the network level — not via application logic that an injected prompt can influence. An attacker who achieves code execution but can't reach the metadata service or exfiltrate data externally has a significantly reduced blast radius.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect what crosses the tool boundary.&lt;/strong&gt; Every tool call is an outbound data channel. Every tool response is an inbound data channel. DLP on both directions catches credentials and sensitive data moving in either direction — whether the cause is prompt injection, a compromised dependency, or a misconfiguration. This is particularly important for tool responses re-entering the agent's context, where sensitive content can be picked up and summarised by the LLM without any explicit exfiltration step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat the LLM as permanently compromised.&lt;/strong&gt; The system's security properties must hold when the model is fully controlled by an attacker. Prompt injection defences are improving, but they are probabilistic. Any security boundary that relies on the LLM correctly identifying and refusing malicious instructions is not a security boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Implication
&lt;/h2&gt;

&lt;p&gt;The AI agent ecosystem has spent two years treating prompt injection as a trust and safety problem — how do we stop the LLM from being rude, leaking its system prompt, or generating off-policy content?&lt;/p&gt;

&lt;p&gt;The CrewAI CVEs are a reminder that prompt injection in an agentic context is a &lt;em&gt;systems security&lt;/em&gt; problem. The attacker's goal isn't to make the LLM say something embarrassing. It's to use the LLM as an authenticated proxy — one that already has access to your infrastructure — to reach systems that would otherwise require direct compromise.&lt;/p&gt;

&lt;p&gt;Every tool an agent can invoke is an attack surface. Every data source it reads is an injection point. The security boundary isn't the LLM's instruction-following fidelity. It's the isolation between the agent and the systems it touches — and right now, for most deployments, that isolation ranges from thin to non-existent.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CERT/CC: &lt;a href="https://kb.cert.org/vuls/id/221883" rel="noopener noreferrer"&gt;VU#221883 — CrewAI contains multiple vulnerabilities including SSRF, RCE and local file read&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cyberpress.org/crewai-vulnerabilities/" rel="noopener noreferrer"&gt;CrewAI Vulnerabilities Allow Attackers to Bypass Sandboxes and Compromise Systems&lt;/a&gt; (CyberPress, April 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gbhackers.com/crewai-hit-by-critical-vulnerabilities/" rel="noopener noreferrer"&gt;CrewAI Hit by Critical Vulnerabilities Enabling Sandbox Escape and Host Compromise&lt;/a&gt; (GBHackers, April 2026)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.securityweek.com/crewai-vulnerabilities-expose-devices-to-hacking/" rel="noopener noreferrer"&gt;CrewAI Vulnerabilities Expose Devices to Hacking&lt;/a&gt; (SecurityWeek, April 2026)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Nick Stocks is the founder of mistaike.ai.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/crewai-prompt-injection-to-rce" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>crewai</category>
      <category>promptinjection</category>
    </item>
    <item>
      <title>Docker Is Not a Sandbox: Why MCP Server Isolation Needs gVisor</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Fri, 03 Apr 2026 20:18:24 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/docker-is-not-a-sandbox-why-mcp-server-isolation-needs-gvisor-23n3</link>
      <guid>https://dev.to/mistaike_ai/docker-is-not-a-sandbox-why-mcp-server-isolation-needs-gvisor-23n3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Docker containers are not sandboxes. They are isolated processes that share your host kernel. For MCP servers running third-party or user-uploaded code, that distinction is the difference between a contained incident and a full host compromise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;Start for free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;Setup guide →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;There's a widely held assumption in the AI infrastructure world: put your MCP server in a Docker container, and you've sandboxed it. You haven't.&lt;/p&gt;

&lt;p&gt;Docker is an excellent tool for packaging and deploying software. It is not a security boundary. If you're running untrusted MCP server code in Docker and calling it sandboxed, you've accepted a risk you may not fully understand.&lt;/p&gt;

&lt;p&gt;This post explains what Docker actually provides, what it doesn't, and why kernel-level isolation via &lt;a href="https://gvisor.dev/" rel="noopener noreferrer"&gt;gVisor&lt;/a&gt; changes the threat model for MCP server hosting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Docker Actually Provides
&lt;/h2&gt;

&lt;p&gt;Docker uses two Linux kernel features to isolate containers: &lt;strong&gt;namespaces&lt;/strong&gt; and &lt;strong&gt;cgroups&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Namespaces give each container its own view of the system — its own process tree, network stack, filesystem mount points, and hostname. From inside the container, it looks like a separate machine.&lt;/p&gt;

&lt;p&gt;Cgroups limit how much CPU, memory, and I/O a container can consume. They prevent resource exhaustion but don't restrict what the container can &lt;em&gt;do&lt;/em&gt; at the kernel level.&lt;/p&gt;

&lt;p&gt;What both of these have in common: &lt;strong&gt;they are provided by the host kernel, and the container communicates with that same host kernel directly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every system call a process makes inside a Docker container — &lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;mmap()&lt;/code&gt;, &lt;code&gt;ptrace()&lt;/code&gt;, &lt;code&gt;socket()&lt;/code&gt; — goes to the real host kernel. There is no intermediary. There is no second kernel. The container's process talks directly to the kernel that runs your entire host.&lt;/p&gt;

&lt;p&gt;The diagram above shows this split clearly. On the left, a Docker container with standard namespace isolation: the syscall surface is wide open to the host kernel. On the right, gVisor's model: a user-space kernel sits between the container and the host.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why That Matters for MCP Servers
&lt;/h2&gt;

&lt;p&gt;An MCP server is code — often written by a third party, sometimes uploaded by a user, always executing with some degree of privilege. In the MCP ecosystem today, plugin authors range from major vendors to individual developers with varying security practices. Supply chain attacks targeting developer tooling are documented and increasing.&lt;/p&gt;

&lt;p&gt;If an MCP server process is compromised — whether through a known CVE in a dependency, a supply chain attack, or malicious code that was always malicious — the attacker controls a process that has direct access to your host kernel.&lt;/p&gt;

&lt;p&gt;The host kernel exposes over 300 system calls to a standard Docker container. A sufficiently crafted kernel exploit targeting any one of those can break out of the container entirely, gaining access to the host system. Container escapes via kernel vulnerabilities are not theoretical: &lt;a href="https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/" rel="noopener noreferrer"&gt;CVE-2022-0492&lt;/a&gt; (Palo Alto Networks Unit 42, 2022) and &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-1086" rel="noopener noreferrer"&gt;CVE-2024-1086&lt;/a&gt; (NIST NVD, 2024) are recent examples of Linux kernel vulnerabilities that could be exploited to escape container isolation. A kernel exploit that reaches the real host kernel doesn't stay in one container.&lt;/p&gt;




&lt;h2&gt;
  
  
  What gVisor Does Differently
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gvisor.dev/" rel="noopener noreferrer"&gt;gVisor&lt;/a&gt; is an open-source project released by Google in 2018. It provides a &lt;strong&gt;user-space kernel&lt;/strong&gt; called the Sentry.&lt;/p&gt;

&lt;p&gt;When a containerised process makes a system call, instead of that call going to the host kernel, it goes to the Sentry — a Go process running in user space that implements the Linux system call interface. The Sentry handles the call, enforces its own security policy, and only reaches the real host kernel for a small set of operations it can't avoid.&lt;/p&gt;

&lt;p&gt;That small set is approximately 20 host syscalls, accessed via a separate process called the Gofer. Standard Docker exposes 300+.&lt;/p&gt;

&lt;p&gt;The reduction looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Isolation model&lt;/th&gt;
&lt;th&gt;Host syscalls exposed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standard Docker container&lt;/td&gt;
&lt;td&gt;300+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker + seccomp filter (restrictive)&lt;/td&gt;
&lt;td&gt;~50–100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gVisor (runsc)&lt;/td&gt;
&lt;td&gt;~20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even with a restrictive seccomp profile, the attack surface remains substantially larger than gVisor's model. With no seccomp policy — which is the default for most Docker deployments — a container has access to the full kernel interface.&lt;/p&gt;

&lt;p&gt;Google has documented using gVisor in production for running untrusted workloads. Their &lt;a href="https://gvisor.dev/docs/architecture_guide/security/" rel="noopener noreferrer"&gt;security overview&lt;/a&gt; covers the threat model in detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MCP Threat Model With and Without gVisor
&lt;/h2&gt;

&lt;p&gt;Consider a concrete scenario: an MCP server has a dependency with a known remote code execution CVE. An attacker exploits it and achieves arbitrary code execution inside the container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With standard Docker:&lt;/strong&gt;&lt;br&gt;
The attacker's code runs inside a container that shares the host kernel. They can attempt to use kernel vulnerabilities, write to &lt;code&gt;/proc&lt;/code&gt; entries that affect host state, or exploit misconfigurations in the namespace setup. If successful, they're on the host — with access to every other container, the filesystem, network, and credentials in the environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With gVisor:&lt;/strong&gt;&lt;br&gt;
The attacker's code runs inside a container whose kernel is the Sentry. Any attempt to use a host kernel vulnerability is blocked at the Sentry boundary — the host kernel syscalls the Sentry uses are a narrow, controlled set that doesn't expose the broader attack surface. The blast radius stays inside the container.&lt;/p&gt;

&lt;p&gt;The Sentry is not invulnerable. A vulnerability in the Sentry itself could, in principle, be exploited. But the Sentry is a substantially smaller and more auditable codebase than the Linux kernel, and its design deliberately limits what it can do at the host level.&lt;/p&gt;




&lt;h2&gt;
  
  
  Defence in Depth: gVisor Is One Layer
&lt;/h2&gt;

&lt;p&gt;Kernel isolation addresses one part of the threat model. It doesn't address everything.&lt;/p&gt;

&lt;p&gt;A compromised MCP server that can't exploit the host kernel can still attempt to exfiltrate data over the network, abuse the credentials injected into its environment, or send malicious responses back to the agent calling it.&lt;/p&gt;

&lt;p&gt;That's why mistaike.ai's hosted MCP sandbox combines multiple independent layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gVisor (runsc runtime)&lt;/strong&gt; — limits kernel syscall surface to ~20 host calls. Kernel exploit attempts hit the Sentry, not your host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default-deny egress via Envoy&lt;/strong&gt; — each MCP server declares the external domains it requires (max 10, FQDNs only, no wildcards). All other outbound traffic is blocked. An attacker that achieves code execution can't beacon out to arbitrary infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bidirectional DLP&lt;/strong&gt; — every tool call and every response is scanned before it moves. Credentials and PII are caught in both directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ephemeral containers&lt;/strong&gt; — five minutes idle, the container is destroyed and replaced with a fresh instance. No persistent foothold.&lt;/p&gt;

&lt;p&gt;These layers are independent. gVisor limits what the process can do at the kernel level. Envoy limits what it can reach on the network. Neither replaces the other. Both are necessary.&lt;/p&gt;

&lt;p&gt;The diagram above shows how these sit relative to each other: gVisor between the container and the host kernel, Envoy on the network path out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is growing faster than its security practices. Developers are connecting agents to community-built servers, user-uploaded code, and rapidly iterated plugins. The assumption that "Docker is good enough" is widespread and understandable — Docker is genuinely excellent for most use cases.&lt;/p&gt;

&lt;p&gt;But MCP server hosting is a specific threat model: you are running code written by someone you don't fully control, on infrastructure you do control, processing data that may be sensitive. That threat model benefits from kernel-level isolation in a way that generic containerised web services don't.&lt;/p&gt;

&lt;p&gt;Running a blog on Docker? Namespace isolation is fine. Running a third-party MCP server that processes your users' financial data? The kernel attack surface is worth reducing.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use gVisor
&lt;/h2&gt;

&lt;p&gt;gVisor is open-source and available at &lt;a href="https://gvisor.dev/" rel="noopener noreferrer"&gt;gvisor.dev&lt;/a&gt;. The &lt;code&gt;runsc&lt;/code&gt; runtime can be configured as a Docker runtime with a few lines of configuration.&lt;/p&gt;

&lt;p&gt;If you want MCP servers running under gVisor without configuring it yourself, mistaike.ai's hosted sandbox does this by default. Every server you upload runs under &lt;code&gt;runsc&lt;/code&gt;, with default-deny egress, DLP on every call, and ephemeral containers. You get the isolation model without managing the infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;Read the setup guide →&lt;/a&gt; | &lt;a href="https://mistaike.ai/security/sandbox" rel="noopener noreferrer"&gt;See the full security architecture →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker namespaces and cgroups provide process isolation, not kernel isolation&lt;/li&gt;
&lt;li&gt;Container processes communicate directly with the host kernel — 300+ syscalls are reachable&lt;/li&gt;
&lt;li&gt;A kernel exploit from inside a standard Docker container reaches the real host kernel&lt;/li&gt;
&lt;li&gt;gVisor interposes a user-space kernel (the Sentry) between the container and the host&lt;/li&gt;
&lt;li&gt;The Sentry limits host kernel exposure to ~20 syscalls via the Gofer process&lt;/li&gt;
&lt;li&gt;For MCP servers running untrusted code, this substantially reduces the blast radius of a kernel-level attack&lt;/li&gt;
&lt;li&gt;Kernel isolation is one layer — it works alongside network controls and DLP, not instead of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mistaike.ai/auth/register" rel="noopener noreferrer"&gt;Start for free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/guides/sandbox-mcp-servers" rel="noopener noreferrer"&gt;Read the setup guide →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://mistaike.ai/security/sandbox" rel="noopener noreferrer"&gt;See the full security architecture →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nick Stocks is the founder of mistaike.ai.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/docker-not-a-sandbox" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>sandbox</category>
      <category>gvisor</category>
    </item>
    <item>
      <title>Axios Has 100 Million Weekly Downloads. North Korea Backdoored It in 39 Minutes.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:17:36 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/axios-has-100-million-weekly-downloads-north-korea-backdoored-it-in-39-minutes-30e5</link>
      <guid>https://dev.to/mistaike_ai/axios-has-100-million-weekly-downloads-north-korea-backdoored-it-in-39-minutes-30e5</guid>
      <description>&lt;p&gt;Yesterday — March 31, 2026 — a North Korea-linked threat actor hijacked the npm account of an Axios maintainer and published two backdoored versions of the most widely used HTTP client in the JavaScript ecosystem.&lt;/p&gt;

&lt;p&gt;Axios has over 100 million weekly downloads. It sits underneath LangChain, OpenAI's SDK, dozens of MCP clients, and virtually every Node.js application that makes an HTTP request. If you're running AI agents in production, your dependency tree almost certainly includes it — even if you never installed it directly.&lt;/p&gt;

&lt;p&gt;The malicious versions were live for approximately three hours before detection and removal. In that window, every &lt;code&gt;npm install&lt;/code&gt; that resolved to &lt;code&gt;axios@1.14.1&lt;/code&gt; or &lt;code&gt;axios@0.30.4&lt;/code&gt; silently installed a cross-platform remote access trojan.&lt;/p&gt;

&lt;p&gt;This is not a theoretical risk. This is what happened yesterday.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happened
&lt;/h2&gt;

&lt;p&gt;At 00:21 UTC on March 31, an attacker published &lt;code&gt;axios@1.14.1&lt;/code&gt; using a compromised maintainer account (&lt;code&gt;jasonsaayman&lt;/code&gt;). Thirty-nine minutes later, they published &lt;code&gt;axios@0.30.4&lt;/code&gt; — targeting both the current and legacy version lines simultaneously.&lt;/p&gt;

&lt;p&gt;Both versions introduced a single new dependency: &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;. This purpose-built package contained a &lt;code&gt;postinstall&lt;/code&gt; hook that downloaded and executed platform-specific stage-2 implants from &lt;code&gt;sfrclak[.]com:8000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://www.aikido.dev/blog/axios-npm-compromised-maintainer-hijacked-rat" rel="noopener noreferrer"&gt;Aikido's analysis&lt;/a&gt;, the attacker deployed three parallel RAT implementations — one for Windows, one for macOS, one for Linux — all sharing an identical C2 protocol and beacon behavior.&lt;/p&gt;

&lt;p&gt;The attack was detected and the packages were removed from npm approximately two to three hours later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" rel="noopener noreferrer"&gt;Google's Threat Intelligence Group (GTIG)&lt;/a&gt; attributes this attack to UNC1069, a financially motivated North Korean threat actor active since at least 2018. The attribution is based on the use of WAVESHAPER.V2, an updated variant of malware previously deployed by this group.&lt;/p&gt;

&lt;p&gt;UNC1069 targets cryptocurrency platforms, fintech companies, and SaaS providers. &lt;a href="https://www.sans.org/blog/axios-npm-supply-chain-compromise-malicious-packages-remote-access-trojan" rel="noopener noreferrer"&gt;SANS confirms&lt;/a&gt; the RAT's credential harvesting behavior: it swept environment variables, &lt;code&gt;.env&lt;/code&gt; files, SSH keys, cloud provider credentials, and API tokens from compromised systems.&lt;/p&gt;

&lt;p&gt;This is a state-backed operation targeting the foundational dependency layer of the JavaScript ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This One Is Different
&lt;/h2&gt;

&lt;p&gt;We've written about supply chain attacks &lt;a href="https://dev.to/blog/teampcp-supply-chain-cascade"&gt;three times in the past two weeks&lt;/a&gt;. Each of those targeted AI-specific infrastructure — Trivy, LiteLLM, LangChain, Telnyx. Tools that sit in the AI layer of the stack.&lt;/p&gt;

&lt;p&gt;Axios is not in the AI layer. Axios is underneath the AI layer.&lt;/p&gt;

&lt;p&gt;Every AI agent framework that makes HTTP calls depends on a library like Axios. Every MCP client that connects to a remote server sends its requests through an HTTP library. Every workflow automation tool — n8n, Zapier integrations, custom agent orchestrators — uses HTTP to talk to the world.&lt;/p&gt;

&lt;p&gt;When TeamPCP &lt;a href="https://dev.to/blog/litellm-langflow-same-week"&gt;compromised LiteLLM&lt;/a&gt;, they got access to LLM API keys. When they &lt;a href="https://dev.to/blog/your-security-scanner-just-got-hacked"&gt;hit Trivy&lt;/a&gt;, they got CI/CD secrets. Both attacks were severe, but both had a defined blast radius: organisations using those specific tools.&lt;/p&gt;

&lt;p&gt;When someone compromises Axios, the blast radius is the entire JavaScript ecosystem.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable math. The TeamPCP campaign has now demonstrated a clear pattern: compromise a popular package, harvest the credentials from everyone who installs it, use those credentials to compromise the next package. Each victim becomes the vector for the next attack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.elastic.co/security-labs/axios-one-rat-to-rule-them-all" rel="noopener noreferrer"&gt;Elastic Security Labs&lt;/a&gt; documented the full attack chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compromised maintainer account → published malicious package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;postinstall&lt;/code&gt; hook downloads platform-specific RAT&lt;/li&gt;
&lt;li&gt;RAT sweeps credentials (env vars, &lt;code&gt;.env&lt;/code&gt; files, SSH keys, cloud tokens)&lt;/li&gt;
&lt;li&gt;Stolen credentials enable lateral movement to other packages and services&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the Axios RAT harvested credentials during its three-hour window, we should expect those credentials to appear in follow-on attacks in the coming days and weeks — just as the Trivy credentials fueled the Checkmarx, LiteLLM, and Telnyx compromises.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI Agent Angle
&lt;/h2&gt;

&lt;p&gt;This matters more for AI agent deployments than for typical web applications, for two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: AI agents aggregate credentials.&lt;/strong&gt; A typical web server might have a database URL and an API key or two. An AI agent orchestrator — or an MCP hub — might have credentials for a dozen different services: LLM providers, vector databases, code repositories, Slack, email, CRM systems, internal APIs. A credential harvester on an AI agent host has a target-rich environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second: AI agent supply chains are deeper than you think.&lt;/strong&gt; When you install an MCP server or an agent framework, you're pulling in hundreds of transitive dependencies. Most teams audit their direct dependencies. Almost nobody audits the full tree. Axios appears as a transitive dependency in packages that don't mention HTTP in their descriptions.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;npm ls axios&lt;/code&gt; in any Node.js AI project. Count the paths. That's your exposure surface.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Should Do Right Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Check if you installed the compromised versions.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check your lockfile for the malicious versions&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"axios@1.14.1&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;axios@0.30.4"&lt;/span&gt; package-lock.json yarn.lock pnpm-lock.yaml 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Safe versions: &lt;code&gt;axios@1.14.0&lt;/code&gt; (last legitimate 1.x release with SLSA provenance) and &lt;code&gt;axios@0.30.3&lt;/code&gt; (last legitimate 0.30.x release). If you see &lt;code&gt;1.14.1&lt;/code&gt; or &lt;code&gt;0.30.4&lt;/code&gt; in any lockfile, assume compromise and rotate all credentials accessible from that environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pin your dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're still using caret ranges (&lt;code&gt;^1.14.0&lt;/code&gt;) for critical packages, this is the incident that should change that. Use exact versions or lockfile integrity checks. &lt;a href="https://arcticwolf.com/resources/blog/supply-chain-attack-impacts-widely-used-axios-npm-package/" rel="noopener noreferrer"&gt;Arctic Wolf's advisory&lt;/a&gt; recommends enabling npm's &lt;code&gt;--ignore-scripts&lt;/code&gt; flag in CI to prevent &lt;code&gt;postinstall&lt;/code&gt; hooks from executing automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Audit transitive dependencies, not just direct ones.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;ls &lt;/span&gt;axios          &lt;span class="c"&gt;# Show all paths to axios in your tree&lt;/span&gt;
npm audit signatures  &lt;span class="c"&gt;# Verify package provenance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Treat credential rotation as mandatory after any supply chain incident in your dependency tree.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "if you think you're affected." If the compromised package was anywhere in your resolved dependency graph during the attack window, rotate everything: API keys, cloud credentials, SSH keys, database passwords.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;Trivy. Checkmarx. LiteLLM. Telnyx. LangChain. Now Axios.&lt;/p&gt;

&lt;p&gt;Six major supply chain incidents in the JavaScript and Python ecosystems in the span of two weeks. Three of them are attributed to the same North Korean threat actor group. The attacks are accelerating, the targets are getting more foundational, and the credential-chaining technique means each compromise funds the next.&lt;/p&gt;

&lt;p&gt;The supply chain problem in AI infrastructure is not getting better. It is getting worse, faster, because every AI agent deployment expands the attack surface — more dependencies, more credentials, more integration points.&lt;/p&gt;

&lt;p&gt;There is no single fix. But there are practices that reduce your exposure: pinned dependencies, lockfile integrity, automated vulnerability scanning, minimal credential scoping, and — critically — runtime monitoring of what your AI agents actually send over the wire. Because when the HTTP library itself is compromised, the only thing standing between your credentials and an attacker's C2 server is whether something is watching the traffic.&lt;/p&gt;

&lt;p&gt;Three hours. That's how long the Axios backdoor was live. Long enough.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/axios-npm-supply-chain" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>npm</category>
      <category>aiinfrastructure</category>
    </item>
    <item>
      <title>What You're Installing When You Add an MCP Server</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Thu, 02 Apr 2026 03:33:12 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/what-youre-installing-when-you-add-an-mcp-server-11ij</link>
      <guid>https://dev.to/mistaike_ai/what-youre-installing-when-you-add-an-mcp-server-11ij</guid>
      <description>&lt;p&gt;There's a simple question most MCP users can't answer before installing a server:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What am I actually installing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you add an MCP server to your agent, you're not just adding a tool. You're inheriting its code, its dependencies, and its behaviour. In many cases that includes a large and often opaque dependency tree, along with whatever known vulnerabilities exist within it.&lt;/p&gt;

&lt;p&gt;To better understand this, we ran a large-scale analysis of MCP servers drawn from public registries. This post covers the first two phases of that work: inventory and dependency risk.&lt;/p&gt;

&lt;p&gt;We're also publishing the results as a public API so anyone can query the data directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public API:&lt;/strong&gt; &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;mistaike.ai/cve-registry&lt;/a&gt; — no API key required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 1 — Inventory
&lt;/h2&gt;

&lt;p&gt;We began by collecting MCP servers from public registry sources and normalising them into a single dataset.&lt;/p&gt;

&lt;p&gt;Across sources, this produced a working indexed dataset of over 25,000 distinct MCP implementations drawn from two registries. The goal of Phase 1 was coverage, not judgement: &lt;em&gt;what exists in the ecosystem?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 2 — Dependency and CVE Scanning
&lt;/h2&gt;

&lt;p&gt;We then analysed repositories and dependency graphs to identify known vulnerability exposure.&lt;/p&gt;

&lt;p&gt;For each server, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enumerated dependencies&lt;/li&gt;
&lt;li&gt;mapped them to known CVEs and advisories&lt;/li&gt;
&lt;li&gt;tracked counts and worst-case severity&lt;/li&gt;
&lt;li&gt;recorded package footprint where available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output is a server-level view of dependency risk — something that doesn't exist in standard vulnerability databases, which index packages, not deployable tools. The live index currently covers over 6,000 servers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Index Shows
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;CVE registry&lt;/a&gt; returns entries sorted by CVE count by default. Some examples from the upper end of the distribution, described by category:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A multi-agent framework for orchestrating AI pipelines — 103 known vulnerabilities in its dependency tree, 4 rated critical. The high count is largely attributable to transitive dependencies from pulling in a broad AI ecosystem. This server is well-maintained; the vulnerabilities are in its supply chain, not its own code.&lt;/li&gt;
&lt;li&gt;A console automation server that exposes shell command execution to agents — 65 known vulnerabilities, worst severity critical.&lt;/li&gt;
&lt;li&gt;A developer CLI management server — 47 known vulnerabilities, worst severity critical.&lt;/li&gt;
&lt;li&gt;An infrastructure configuration server used for network operations — 46 known vulnerabilities, worst severity critical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These examples come from the first page of results. The full index is queryable at &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;mistaike.ai/cve-registry&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Stood Out
&lt;/h2&gt;

&lt;p&gt;Several patterns emerged from the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency risk is widespread.&lt;/strong&gt; A meaningful portion of MCP servers carry known vulnerabilities through their dependency trees. In some cases, individual servers accumulate dozens or more CVEs — often through transitive dependencies rather than direct code. The multi-agent framework example above is a good illustration: the author's code isn't the problem; the problem is what it depends on, and what those dependencies depend on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Severity alone isn't a sufficient signal.&lt;/strong&gt; Some servers with very high CVE counts have only low-severity issues. Others with fewer total CVEs include critical-severity packages. Both dimensions matter when assessing risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependency sprawl is common.&lt;/strong&gt; Many MCP servers pull in large numbers of packages, increasing both attack surface and maintenance burden. Combined with unpinned dependencies — which resolve to the latest version at install time — this creates non-deterministic builds and makes remediation harder.&lt;/p&gt;

&lt;p&gt;None of these patterns are unique to MCP. They reflect broader software supply chain issues. What makes MCP different is where these servers run: often locally, often with access to files, tokens, APIs, and developer workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Publish This as an API
&lt;/h2&gt;

&lt;p&gt;Public CVE databases exist, but they don't map cleanly to deployable units like MCP servers.&lt;/p&gt;

&lt;p&gt;If you're deciding whether to install an MCP server, the question isn't &lt;em&gt;which CVEs exist in the ecosystem?&lt;/em&gt; It's &lt;em&gt;what known vulnerability exposure am I inheriting if I run this server?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;public CVE registry&lt;/a&gt; is designed to answer that question directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;CVE registry&lt;/a&gt; supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;search by name or repository (&lt;code&gt;?search=&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;filter by severity (&lt;code&gt;?severity=critical|high|medium|none&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;sort by CVE count, severity, or recency (&lt;code&gt;?sort=&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;pagination (&lt;code&gt;?page=&lt;/code&gt;, &lt;code&gt;?page_size=&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;check a server before adding it to your agent configuration&lt;/li&gt;
&lt;li&gt;integrate into CI/CD to flag high-risk servers before deployment&lt;/li&gt;
&lt;li&gt;build dashboards tracking ecosystem risk over time&lt;/li&gt;
&lt;li&gt;prioritise manual review of servers with critical-severity exposure&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How This Fits the Broader Research
&lt;/h2&gt;

&lt;p&gt;The CVE index is Phase 2 of a larger analysis pipeline.&lt;/p&gt;

&lt;p&gt;Later phases focus on runtime behaviour: what MCP servers actually do when executed, what network connections they make, and whether that behaviour aligns with user expectations and documentation.&lt;/p&gt;

&lt;p&gt;Initial work on a deeper behavioural analysis phase examined a subset of servers at runtime. The results were largely reassuring: 86% of servers examined showed no concerning behaviour beyond their documented purpose. A small number showed behaviours worth investigating further. The five most significant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Undisclosed telemetry on a local execution tool.&lt;/strong&gt; A server designed for local desktop automation — file operations, terminal access — silently calls Google Analytics and a first-party telemetry endpoint on every tool invocation. The server runs locally; the tracking does not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User queries sent over plain HTTP to a bare IP.&lt;/strong&gt; A domain research tool routes user input — including project descriptions, keywords, and repository context — over unencrypted HTTP to a server identified only by a raw IP address running an LLM. No transport security. Not mentioned in documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Steganographic Unicode watermarking.&lt;/strong&gt; A server embeds invisible Unicode characters into every response it produces. The characters encode a persistent machine identifier that travels with the output wherever it goes — into the AI's context, into logs, into any downstream system. Undisclosed, not opt-in, not visible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Query logging and AI platform profiling.&lt;/strong&gt; A search-oriented server stores every query verbatim in a server-side database against the user's API key, building a 90-day history. It also inspects environment variables at startup to identify which AI client is in use and embeds this in outbound requests. The README describes two tools; the server exposes nineteen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unredacted user inputs forwarded to third-party analytics.&lt;/strong&gt; A blockchain data server sends the full contents of each tool call — including user-supplied arguments — to a third-party analytics platform on every invocation, along with the calling client's name and version.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These findings are being manually validated and shared with the relevant maintainers before full publication. All of the servers involved are listed across the major MCP registries — the official MCP directory, Glama, and Smithery. These are not obscure or fringe listings — they are servers a developer would encounter through normal discovery.&lt;/p&gt;

&lt;p&gt;A full behavioural analysis post will follow that process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Important Caveats
&lt;/h2&gt;

&lt;p&gt;This dataset should be treated as a signal, not a verdict.&lt;/p&gt;

&lt;p&gt;A CVE doesn't necessarily mean a vulnerability is exploitable in your environment. Some issues exist in unused code paths, or may already be mitigated in practice. Dependency graphs can both overstate and understate real-world risk.&lt;/p&gt;

&lt;p&gt;At the same time, known vulnerabilities are relevant. They indicate maintenance posture, upgrade cadence, and potential exposure that's worth understanding before deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Missing Today
&lt;/h2&gt;

&lt;p&gt;One structural gap became clear during this work: there is currently no standard way for MCP servers to declare external network dependencies, telemetry behaviour, data categories transmitted, or whether such behaviour is optional.&lt;/p&gt;

&lt;p&gt;As a result, users often rely on documentation, source code review, or trust alone to understand what a server does. That doesn't scale as the ecosystem grows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is growing quickly. That growth brings a need for better visibility into what is being installed and executed.&lt;/p&gt;

&lt;p&gt;This work focuses on the first layer of that visibility: dependency risk. By publishing a public CVE index mapped directly to MCP servers, the aim is to make it easier for developers and organisations to understand what they're adopting before they run it.&lt;/p&gt;

&lt;p&gt;This is not a claim that the ecosystem is unsafe. Many servers show minimal or manageable exposure. But every MCP server brings its own supply chain. Understanding that supply chain is a necessary first step.&lt;/p&gt;




&lt;h2&gt;
  
  
  About This Data
&lt;/h2&gt;

&lt;p&gt;This API includes publicly known vulnerability data only. It does not include behavioral analysis, telemetry findings, or unverified security concerns, which are handled separately and may be subject to validation and responsible disclosure processes.&lt;/p&gt;

&lt;p&gt;This data is intended to support risk awareness and prioritization, not to label projects as insecure or malicious. Users should review context, validate findings, and consider their own threat model before making decisions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;CVE Registry:&lt;/strong&gt; &lt;a href="https://mistaike.ai/cve-registry/" rel="noopener noreferrer"&gt;mistaike.ai/cve-registry&lt;/a&gt; — no API key required.&lt;/p&gt;

&lt;p&gt;Feedback and questions welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/mcp-cve-scan-findings" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>research</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>One Stolen Token. Five Ecosystems. The TeamPCP Supply Chain Attack Is Still Spreading.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sun, 29 Mar 2026 18:42:18 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/one-stolen-token-five-ecosystems-the-teampcp-supply-chain-attack-is-still-spreading-2pka</link>
      <guid>https://dev.to/mistaike_ai/one-stolen-token-five-ecosystems-the-teampcp-supply-chain-attack-is-still-spreading-2pka</guid>
      <description>&lt;p&gt;On March 19, a threat actor group called TeamPCP used a compromised GitHub service account to force-push malicious code to 76 of 77 version tags for Trivy — one of the most widely-used security scanners in CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Ten days later, five ecosystems are compromised — GitHub Actions, Docker Hub, npm, Open VSX, and PyPI — and the attack is still expanding.&lt;/p&gt;

&lt;p&gt;What makes this different from a typical supply chain incident is the mechanism: each compromise harvests credentials that fuel the next one. It's not a single point of failure. It's a self-propagating chain where every breached package becomes both victim and vector.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/blog/litellm-langflow-same-week"&gt;Two days ago we covered the LiteLLM incident in isolation&lt;/a&gt;. Since then, the picture has changed. This is a coordinated campaign by a single actor, and its scope is significantly wider than any individual incident suggested.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cascade
&lt;/h2&gt;

&lt;p&gt;Here is the timeline, based on analysis from &lt;a href="https://securitylabs.datadoghq.com/articles/litellm-compromised-pypi-teampcp-supply-chain-campaign/" rel="noopener noreferrer"&gt;Datadog Security Labs&lt;/a&gt;, &lt;a href="https://www.sans.org/blog/when-security-scanner-became-weapon-inside-teampcp-supply-chain-campaign" rel="noopener noreferrer"&gt;SANS&lt;/a&gt;, &lt;a href="https://arcticwolf.com/resources/blog/teampcp-supply-chain-attack-campaign-targets-trivy-checkmarx-kics-and-litellm-potential-downstream-impact-to-additional-projects/" rel="noopener noreferrer"&gt;Arctic Wolf&lt;/a&gt;, and &lt;a href="https://www.endorlabs.com/learn/teampcp-strikes-again-telnyx-compromised-three-days-after-litellm" rel="noopener noreferrer"&gt;Endor Labs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;March 19 — Trivy (GitHub Actions, Docker Hub)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TeamPCP had compromised Aqua Security's &lt;code&gt;aqua-bot&lt;/code&gt; service account at an unknown earlier date. On March 19, they used it to force-push malicious code to 75 of 76 version tags in &lt;code&gt;aquasecurity/trivy-action&lt;/code&gt; and all 7 tags in &lt;code&gt;aquasecurity/setup-trivy&lt;/code&gt;. Any CI/CD pipeline that ran &lt;code&gt;trivy-action@v1&lt;/code&gt; or any non-pinned tag after this point executed the attacker's code instead of the real scanner.&lt;/p&gt;

&lt;p&gt;The payload was a three-stage credential stealer. It swept environment variables, &lt;code&gt;.env&lt;/code&gt; files, shell histories, SSH keys, cloud provider credentials, and Kubernetes tokens. Stolen data was encrypted with AES-256-CBC + RSA-4096 (OAEP padding) and exfiltrated as &lt;code&gt;tpcp.tar.gz&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;March 23 — Checkmarx KICS (GitHub Actions, npm, Open VSX)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using CI/CD secrets harvested from the Trivy compromise, TeamPCP pivoted to Checkmarx. They compromised two GitHub Actions repositories — &lt;code&gt;ast-github-action&lt;/code&gt; and &lt;code&gt;kics-github-action&lt;/code&gt; — along with related npm packages and Open VSX extensions. &lt;a href="https://www.sysdig.com/blog/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions" rel="noopener noreferrer"&gt;Sysdig documented&lt;/a&gt; that over 66 npm packages were poisoned through a self-propagating worm component they call CanisterWorm. Stolen npm tokens from compromised CI/CD environments were automatically weaponized to infect victim-maintained packages — creating new upstream compromises without attacker intervention.&lt;/p&gt;

&lt;p&gt;This is where the attack shifted from targeted to exponential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;March 24 — LiteLLM (PyPI)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LiteLLM's CI/CD pipeline ran unpinned Trivy. The compromised scanner injected malicious code into LiteLLM's build process. Versions 1.82.7 and 1.82.8 were pushed to PyPI through what appeared to be a legitimate maintainer account.&lt;/p&gt;

&lt;p&gt;LiteLLM processes roughly 95 million downloads per month and sits between applications and their LLM providers — OpenAI, Anthropic, AWS Bedrock, GCP Vertex AI. It has access to every API key configured in the deployment. The credential harvester did not need to be sophisticated. It was already in the room where the secrets live.&lt;/p&gt;

&lt;p&gt;Version 1.82.8 was the higher-risk package: it used a &lt;code&gt;.pth&lt;/code&gt; file that executes automatically when the Python interpreter starts, not just when the package is imported.&lt;/p&gt;

&lt;p&gt;The attack window was approximately 5.5 hours (10:39–16:00 UTC on March 24). &lt;a href="https://docs.litellm.ai/blog/security-update-march-2026" rel="noopener noreferrer"&gt;LiteLLM's post-incident report&lt;/a&gt; confirms they've engaged Mandiant for forensic analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;March 27 — Telnyx (PyPI)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three days after LiteLLM, TeamPCP published malicious versions of the Telnyx Python SDK — versions 4.87.1 and 4.87.2. Telnyx averages 742,000 downloads per month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.endorlabs.com/learn/teampcp-strikes-again-telnyx-compromised-three-days-after-litellm" rel="noopener noreferrer"&gt;Endor Labs attributes this&lt;/a&gt; directly to the LiteLLM compromise: TeamPCP's credential harvester swept environment variables, &lt;code&gt;.env&lt;/code&gt; files, and shell histories from every system that imported the poisoned LiteLLM packages. If any developer or CI pipeline had both LiteLLM installed and access to the Telnyx PyPI token, that token was already in TeamPCP's hands.&lt;/p&gt;

&lt;p&gt;The Telnyx compromise introduced a new technique: audio file steganography.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hiding Malware in a WAV File
&lt;/h2&gt;

&lt;p&gt;The malicious code was injected into &lt;code&gt;telnyx/_client.py&lt;/code&gt;, which runs at import time. No install hook. No postinstall script. Just &lt;code&gt;import telnyx&lt;/code&gt; and the payload executes.&lt;/p&gt;

&lt;p&gt;On execution, the malware downloads a file called &lt;code&gt;hangup.wav&lt;/code&gt; from a remote server. The file looks like a normal WAV audio file. It is not.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://www.stepsecurity.io/blog/teampcp-plants-wav-steganography-credential-stealer-in-telnyx-pypi-package" rel="noopener noreferrer"&gt;StepSecurity's analysis&lt;/a&gt; and &lt;a href="https://safedep.io/malicious-telnyx-pypi-compromise/" rel="noopener noreferrer"&gt;SafeDep's technical breakdown&lt;/a&gt;, the WAV file contains an XOR-obfuscated executable packed into the audio frame bytes using Python's built-in &lt;code&gt;wave&lt;/code&gt; module:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The malware reads the audio frame data from the WAV file&lt;/li&gt;
&lt;li&gt;The first 8 bytes of the decoded blob are the XOR key&lt;/li&gt;
&lt;li&gt;The remaining bytes are XOR'd against that key in a repeating pattern&lt;/li&gt;
&lt;li&gt;The result is a credential-stealing executable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Linux and macOS, it runs a credential harvester that encrypts stolen data with AES-256-CBC + RSA-4096 before exfiltrating it. On Windows, it drops a persistent executable disguised as &lt;code&gt;msbuild.exe&lt;/code&gt; into the Startup folder, with a 12-hour re-drop cooldown enforced by a hidden &lt;code&gt;.lock&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;The steganography serves two purposes. First, it bypasses static analysis tools that don't inspect audio files. Second, the payload is unreadable without the XOR key, which is embedded in the data itself rather than hardcoded anywhere in the package source.&lt;/p&gt;




&lt;h2&gt;
  
  
  The First Blockchain C2 in the Wild
&lt;/h2&gt;

&lt;p&gt;TeamPCP's command-and-control infrastructure is also unusual. According to SANS, the CanisterWorm component — the self-propagating npm worm — uses an Internet Computer Protocol (ICP) canister as a dead-drop C2. This is &lt;a href="https://www.sans.org/blog/when-security-scanner-became-weapon-inside-teampcp-supply-chain-campaign" rel="noopener noreferrer"&gt;the first documented abuse&lt;/a&gt; of decentralized blockchain infrastructure for supply chain C2.&lt;/p&gt;

&lt;p&gt;Traditional C2 takedown relies on domain seizure or hosting provider cooperation. A blockchain canister has no single point of takedown. The domain can't be seized because there is no domain. The hosting can't be pulled because the canister is replicated across a decentralized network.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Extortion Pivot
&lt;/h2&gt;

&lt;p&gt;As of March 25, &lt;a href="https://www.sans.org/blog/when-security-scanner-became-weapon-inside-teampcp-supply-chain-campaign" rel="noopener noreferrer"&gt;SANS reports&lt;/a&gt; that TeamPCP has pivoted from credential theft to active extortion. The group is reportedly working through approximately 300 GB of compressed stolen credentials and collaborating with LAPSUS$ to target multi-billion-dollar companies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/security/blog/2026/03/24/detecting-investigating-defending-against-trivy-supply-chain-compromise/" rel="noopener noreferrer"&gt;Mandiant estimates&lt;/a&gt; that over 1,000 enterprise SaaS environments have been impacted, with the number expected to grow to 5,000–10,000 as the full downstream impact of the credential cascade becomes clearer.&lt;/p&gt;

&lt;p&gt;The campaign is not over. Each compromised package that harvested credentials created a pool of tokens that can be used to compromise the next target. The attack surface grows with every installation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Attack Worked
&lt;/h2&gt;

&lt;p&gt;Three structural factors made this cascade possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpinned dependencies in CI/CD.&lt;/strong&gt; LiteLLM's CI pipeline ran Trivy without pinning to a specific version or verifying checksums. When TeamPCP replaced the tag contents, LiteLLM's build pulled the malicious version automatically. Every pipeline that uses &lt;code&gt;@v1&lt;/code&gt; or &lt;code&gt;@latest&lt;/code&gt; tags for GitHub Actions has this exact exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD environments are credential-rich.&lt;/strong&gt; A typical CI/CD environment has access to package registry tokens, cloud provider credentials, database passwords, API keys, and deployment secrets. The credential harvester didn't need to know what it was looking for — it swept everything and let the attacker sort it out later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No ecosystem-level circuit breaker.&lt;/strong&gt; Once TeamPCP had valid PyPI tokens, they could publish new versions of any package those tokens had access to. PyPI has no mechanism to detect that a previously-legitimate maintainer's credentials are being used by an attacker. Neither does npm, Docker Hub, or the GitHub Actions marketplace. Each ecosystem trusts its own authentication, and none of them talk to each other.&lt;/p&gt;

&lt;p&gt;The result is a supply chain attack that propagates across ecosystem boundaries. Compromised GitHub Actions yield PyPI tokens. Compromised PyPI packages yield npm tokens. Compromised npm packages yield more GitHub tokens. The chain feeds itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you run Trivy in CI/CD:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether your pipelines used unpinned &lt;code&gt;trivy-action&lt;/code&gt; tags between March 19 and March 22&lt;/li&gt;
&lt;li&gt;If they did, treat the CI environment as fully compromised and rotate all secrets it had access to&lt;/li&gt;
&lt;li&gt;Pin GitHub Actions to full commit SHAs, not version tags. Tags can be force-pushed. Commit hashes cannot&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.microsoft.com/en-us/security/blog/2026/03/24/detecting-investigating-defending-against-trivy-supply-chain-compromise/" rel="noopener noreferrer"&gt;Microsoft's guidance&lt;/a&gt; has detection queries for Azure, Defender, and Sentinel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you installed LiteLLM from PyPI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether v1.82.7 or v1.82.8 was installed during the March 24 window&lt;/li&gt;
&lt;li&gt;If either version was installed on any system: full credential rotation — cloud providers, API keys, database passwords, SSH keys, Kubernetes tokens&lt;/li&gt;
&lt;li&gt;Audit for outbound connections to &lt;code&gt;models.litellm[.]cloud&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you use the Telnyx Python SDK:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versions 4.87.1 and 4.87.2 are malicious. Downgrade to 4.87.0 immediately&lt;/li&gt;
&lt;li&gt;The package is currently quarantined on PyPI&lt;/li&gt;
&lt;li&gt;If either version was installed: rotate all credentials in the environment, check for &lt;code&gt;msbuild.exe&lt;/code&gt; in Windows Startup folders, check for unexpected outbound connections to &lt;code&gt;83[.]142[.]209[.]203:8080&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For AI infrastructure generally:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pin every dependency in CI/CD to immutable references (commit SHAs for Actions, hashes for packages)&lt;/li&gt;
&lt;li&gt;Audit what credentials exist in your CI/CD environments. If your build runner has access to your PyPI token, your cloud provider keys, and your database password, a single compromised dependency can take all of them&lt;/li&gt;
&lt;li&gt;LLM proxies, agent orchestrators, and AI workflow tools sit in the execution path of your AI stack. They have elevated access because they need it. That makes them high-value targets. Treat them accordingly&lt;/li&gt;
&lt;li&gt;Monitor for unexpected outbound connections from CI/CD and development environments. The earliest signal of a credential harvester is a network call to a domain you don't recognise&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The Trivy → Checkmarx → LiteLLM → Telnyx chain is the clearest example yet of a self-propagating supply chain attack. Each compromise created the conditions for the next one. The attack didn't need to be technically brilliant at any single step. It needed to be persistent, and it needed the ecosystem to not notice fast enough.&lt;/p&gt;

&lt;p&gt;The campaign has been running for ten days. Five ecosystems are compromised. An estimated 300 GB of stolen credentials are being actively used. And the next package in the chain could be publishing right now.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://securitylabs.datadoghq.com/articles/litellm-compromised-pypi-teampcp-supply-chain-campaign/" rel="noopener noreferrer"&gt;Datadog Security Labs: TeamPCP campaign analysis&lt;/a&gt; · &lt;a href="https://www.sans.org/blog/when-security-scanner-became-weapon-inside-teampcp-supply-chain-campaign" rel="noopener noreferrer"&gt;SANS: When the Security Scanner Became the Weapon&lt;/a&gt; · &lt;a href="https://arcticwolf.com/resources/blog/teampcp-supply-chain-attack-campaign-targets-trivy-checkmarx-kics-and-litellm-potential-downstream-impact-to-additional-projects/" rel="noopener noreferrer"&gt;Arctic Wolf: TeamPCP campaign advisory&lt;/a&gt; · &lt;a href="https://www.endorlabs.com/learn/teampcp-strikes-again-telnyx-compromised-three-days-after-litellm" rel="noopener noreferrer"&gt;Endor Labs: Telnyx compromise attribution&lt;/a&gt; · &lt;a href="https://www.microsoft.com/en-us/security/blog/2026/03/24/detecting-investigating-defending-against-trivy-supply-chain-compromise/" rel="noopener noreferrer"&gt;Microsoft: Trivy compromise detection guidance&lt;/a&gt; · &lt;a href="https://www.stepsecurity.io/blog/teampcp-plants-wav-steganography-credential-stealer-in-telnyx-pypi-package" rel="noopener noreferrer"&gt;StepSecurity: WAV steganography analysis&lt;/a&gt; · &lt;a href="https://safedep.io/malicious-telnyx-pypi-compromise/" rel="noopener noreferrer"&gt;SafeDep: Telnyx PyPI compromise&lt;/a&gt; · &lt;a href="https://docs.litellm.ai/blog/security-update-march-2026" rel="noopener noreferrer"&gt;LiteLLM: Security incident report&lt;/a&gt; · &lt;a href="https://thehackernews.com/2026/03/teampcp-pushes-malicious-telnyx.html" rel="noopener noreferrer"&gt;The Hacker News: TeamPCP Telnyx&lt;/a&gt; · &lt;a href="https://www.sysdig.com/blog/teampcp-expands-supply-chain-compromise-spreads-from-trivy-to-checkmarx-github-actions" rel="noopener noreferrer"&gt;Sysdig: Checkmarx compromise&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/teampcp-supply-chain-cascade" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>cve</category>
      <category>aiinfrastructure</category>
    </item>
    <item>
      <title>LangChain Just Got Three CVEs. The Bugs Are From 2006.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sat, 28 Mar 2026 14:29:47 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/langchain-just-got-three-cves-the-bugs-are-from-2006-44pb</link>
      <guid>https://dev.to/mistaike_ai/langchain-just-got-three-cves-the-bugs-are-from-2006-44pb</guid>
      <description>&lt;p&gt;On March 27, &lt;a href="https://thehackernews.com/2026/03/langchain-langgraph-flaws-expose-files.html" rel="noopener noreferrer"&gt;researchers at Cyera disclosed three security vulnerabilities&lt;/a&gt; affecting LangChain and LangGraph — two of the most widely deployed AI development frameworks in the world.&lt;/p&gt;

&lt;p&gt;LangChain-Core recorded 23 million downloads in the week before disclosure. LangChain had 52 million. LangGraph had 9 million. That's 84 million combined weekly downloads carrying at least one of these vulnerabilities into production environments.&lt;/p&gt;

&lt;p&gt;The CVEs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-34070&lt;/strong&gt; (CVSS 7.5) — path traversal in prompt loading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2025-68664&lt;/strong&gt; (CVSS 9.3) — deserialization injection that leaks API keys and environment secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2025-67644&lt;/strong&gt; (CVSS 7.3) — SQL injection in the LangGraph checkpoint store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Path traversal. Deserialization of untrusted data. SQL injection. If you've been in web security for any length of time, you've seen these before. They were in the OWASP Top 10 in 2004.&lt;/p&gt;




&lt;h2&gt;
  
  
  CVE-2026-34070: Path Traversal in Prompt Loading
&lt;/h2&gt;

&lt;p&gt;LangChain's prompt-loading API (&lt;code&gt;langchain_core/prompts/loading.py&lt;/code&gt;) accepts file paths to load prompt templates. It does not validate those paths.&lt;/p&gt;

&lt;p&gt;A specially crafted prompt template reference can escape the intended directory and read arbitrary files from the server's filesystem. Configuration files, deployment metadata, tokens, prompt templates belonging to other applications — anything the process has read access to.&lt;/p&gt;

&lt;p&gt;This is &lt;a href="https://cwe.mitre.org/data/definitions/22.html" rel="noopener noreferrer"&gt;CWE-22: Improper Limitation of a Pathname to a Restricted Directory&lt;/a&gt;. It was first catalogued in 2006. Most web frameworks have built-in protections against it. LangChain's prompt loader did not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: upgrade &lt;code&gt;langchain-core&lt;/code&gt; to version 1.2.22 or higher.&lt;/p&gt;




&lt;h2&gt;
  
  
  CVE-2025-68664: Serialization Injection That Leaks Secrets
&lt;/h2&gt;

&lt;p&gt;This one is the most severe at CVSS 9.3.&lt;/p&gt;

&lt;p&gt;LangChain has an internal serialization format. When a dictionary contains an &lt;code&gt;lc&lt;/code&gt; key, the framework treats it as a serialized LangChain object rather than regular data. The vulnerability: &lt;code&gt;dumps()&lt;/code&gt; and &lt;code&gt;dumpd()&lt;/code&gt; did not escape user-controlled dictionaries that happened to include the reserved &lt;code&gt;lc&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;An attacker can craft input data that the framework interprets as a serialized object. When that object is processed, it can trigger the loading of arbitrary LangChain components — including ones that expose environment variables, API keys, and other secrets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cyata.ai/blog/langgrinch-langchain-core-cve-2025-68664/" rel="noopener noreferrer"&gt;Cyata documented this vulnerability in December 2025&lt;/a&gt; under the name "LangGrinch." As researcher Vladimir Tokarev noted: "Each vulnerability exposes a different class of enterprise data: filesystem files, environment secrets, and conversation history."&lt;/p&gt;

&lt;p&gt;This is &lt;a href="https://cwe.mitre.org/data/definitions/502.html" rel="noopener noreferrer"&gt;CWE-502: Deserialization of Untrusted Data&lt;/a&gt;. Java developers have been fighting this class of bug since at least 2015, when the Apache Commons Collections deserialization vulnerability became one of the most exploited flaws in enterprise software. The AI ecosystem is learning the same lesson.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: upgrade &lt;code&gt;langchain-core&lt;/code&gt; to version 0.3.81 (if on the 0.x branch) or 1.2.5+.&lt;/p&gt;




&lt;h2&gt;
  
  
  CVE-2025-67644: SQL Injection in LangGraph Checkpoints
&lt;/h2&gt;

&lt;p&gt;LangGraph uses SQLite for checkpoint storage. The &lt;code&gt;SqliteSaver&lt;/code&gt; component's &lt;code&gt;list()&lt;/code&gt; and &lt;code&gt;alist()&lt;/code&gt; methods accept metadata filter keys — and those keys are interpolated directly into SQL queries without sanitisation.&lt;/p&gt;

&lt;p&gt;An attacker who can influence the metadata filter keys can inject arbitrary SQL. The result: full bypass of any query filters and access to all checkpoint records, which contain conversation state, tool call results, and any data the agent processed during its run.&lt;/p&gt;

&lt;p&gt;This is &lt;a href="https://cwe.mitre.org/data/definitions/89.html" rel="noopener noreferrer"&gt;CWE-89: SQL Injection&lt;/a&gt;. It was the number-one vulnerability in the original OWASP Top 10 in 2004. Parameterised queries have been the standard defence for over twenty years. The LangGraph checkpoint store did not use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: upgrade &lt;code&gt;langgraph-checkpoint-sqlite&lt;/code&gt; to version 3.0.1.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;These are not exotic AI-specific attack vectors. There is no prompt injection here, no novel adversarial technique, no research paper required to understand the attack surface. These are bread-and-butter application security bugs — the kind that automated scanners have been catching in web applications since the mid-2000s.&lt;/p&gt;

&lt;p&gt;The web security community spent two decades building defences against these vulnerability classes. Frameworks like Django, Rails, and Express have path traversal protection, parameterised queries, and safe serialization built into their core. Developers using those frameworks get these protections by default without thinking about them.&lt;/p&gt;

&lt;p&gt;The AI framework ecosystem has not inherited those protections. It has inherited the speed and ambition, but not the scar tissue.&lt;/p&gt;

&lt;p&gt;LangChain is not a small project maintained by a single developer. It has significant funding, a large team, and enterprise customers. These vulnerabilities are not the result of neglect or resource constraints. They're the result of building fast in a domain where the security patterns haven't been established yet — and where the developers building the frameworks may not have backgrounds in the web security discipline that solved these problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More Than Usual
&lt;/h2&gt;

&lt;p&gt;When a web application has a path traversal bug, the blast radius is the data that application can access. When an AI orchestration framework has a path traversal bug, the blast radius includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every API key the agent has been configured with&lt;/li&gt;
&lt;li&gt;Every tool credential stored in environment variables&lt;/li&gt;
&lt;li&gt;Every prompt template, including ones that encode business logic&lt;/li&gt;
&lt;li&gt;Every conversation history checkpoint, which may contain customer data, internal documents, or credentials that users pasted into chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI frameworks accumulate access. They need API keys for LLM providers, database credentials for memory stores, authentication tokens for the tools they orchestrate. A single vulnerability in the framework layer exposes everything the framework touches — which, by design, is everything.&lt;/p&gt;

&lt;p&gt;The SQL injection in LangGraph's checkpoint store is a good example. Checkpoints contain the full state of agent conversations: tool calls, responses, intermediate reasoning, user inputs. An attacker who can query the checkpoint store without filters has access to the complete operational history of every agent running on that instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Patch immediately.&lt;/strong&gt; The fixes are straightforward version bumps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;langchain-core&lt;/code&gt; &amp;gt;= 1.2.22 (or &amp;gt;= 0.3.81 for the 0.x line)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;langgraph-checkpoint-sqlite&lt;/code&gt; &amp;gt;= 3.0.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Audit your environment variables.&lt;/strong&gt; If you're running LangChain in an environment that has API keys, cloud credentials, or database passwords in environment variables — and you almost certainly are — assume those were accessible through CVE-2025-68664 until you patched. Rotate them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check your checkpoint stores.&lt;/strong&gt; If you use LangGraph with SQLite checkpoints and the checkpoint store was accessible to untrusted input, assume conversation history was accessible. Audit what data those conversations contained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run a dependency audit.&lt;/strong&gt; &lt;code&gt;pip audit&lt;/code&gt; or &lt;code&gt;safety check&lt;/code&gt; will flag these CVEs in your lockfile. If you're not running dependency audits in CI, this is a good week to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consider what's between your agents and the world.&lt;/strong&gt; These CVEs are in the framework layer — the code that sits between your application logic and the LLMs, databases, and tools your agents use. If you're running DLP, content scanning, or access controls, they need to cover the framework layer too, not just the agent's outbound calls.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;RSAC 2026 wrapped up this week. &lt;a href="https://newsroom.cisco.com/c/r/newsroom/en/us/a/y2026/m03/cisco-reimagines-security-for-the-agentic-workforce.html" rel="noopener noreferrer"&gt;Cisco released DefenseClaw&lt;/a&gt;, an open-source framework for scanning AI agent skills and MCP servers. Microsoft announced Agent 365. CrowdStrike launched Charlotte AI AgentWorks. SentinelOne, Check Point, Saviynt, and Teleport all shipped AI agent security products.&lt;/p&gt;

&lt;p&gt;The industry is building defences for the AI agent era. That's genuinely necessary. But the LangChain disclosure is a reminder that the most urgent vulnerabilities aren't the exotic ones. They're the ones we already know how to find and fix — in the frameworks that haven't looked for them yet.&lt;/p&gt;

&lt;p&gt;84 million weekly downloads. Path traversal, SQL injection, and deserialization. The AI industry is speed-running the web's security history, and it hasn't reached the chapter where we learned to check our inputs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://thehackernews.com/2026/03/langchain-langgraph-flaws-expose-files.html" rel="noopener noreferrer"&gt;The Hacker News: LangChain, LangGraph Flaws Disclosure&lt;/a&gt; (March 27, 2026) · &lt;a href="https://www.techradar.com/pro/security/each-vulnerability-exposes-a-different-class-of-enterprise-data-langchain-framework-hit-by-several-worrying-security-issues-heres-what-we-know" rel="noopener noreferrer"&gt;TechRadar: LangChain framework security issues&lt;/a&gt; · &lt;a href="https://cyata.ai/blog/langgrinch-langchain-core-cve-2025-68664/" rel="noopener noreferrer"&gt;Cyata: LangGrinch CVE-2025-68664&lt;/a&gt; (December 2025) · &lt;a href="https://newsroom.cisco.com/c/r/newsroom/en/us/a/y2026/m03/cisco-reimagines-security-for-the-agentic-workforce.html" rel="noopener noreferrer"&gt;Cisco DefenseClaw announcement&lt;/a&gt; (March 2026)&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/langchain-three-cves" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cve</category>
      <category>langchain</category>
      <category>aiinfrastructure</category>
    </item>
    <item>
      <title>29 Million Secrets Leaked on GitHub Last Year. AI Coding Tools Made It Worse.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Sat, 28 Mar 2026 00:36:34 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/29-million-secrets-leaked-on-github-last-year-ai-coding-tools-made-it-worse-2a42</link>
      <guid>https://dev.to/mistaike_ai/29-million-secrets-leaked-on-github-last-year-ai-coding-tools-made-it-worse-2a42</guid>
      <description>&lt;p&gt;GitGuardian published the fifth edition of its &lt;a href="https://www.gitguardian.com/state-of-secrets-sprawl-report-2026" rel="noopener noreferrer"&gt;State of Secrets Sprawl&lt;/a&gt; report on March 27. It's the largest study of credential exposure on public GitHub, and this year's edition lands a finding that the AI agent ecosystem needs to sit with.&lt;/p&gt;

&lt;p&gt;AI-assisted commits leak secrets at roughly twice the rate of human-only commits. And 24,008 unique secrets were found specifically in MCP configuration files.&lt;/p&gt;

&lt;p&gt;Those aren't estimates. They're counts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;The headline stats from the report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;28.65 million&lt;/strong&gt; new hardcoded secrets detected in public GitHub commits in 2025. A 34% year-over-year increase and the largest single-year jump GitGuardian has recorded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-assisted commits&lt;/strong&gt; had a 3.2% secret-leak rate, versus a 1.5% baseline across all public GitHub commits. That's roughly &lt;strong&gt;2x the baseline&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-service credentials&lt;/strong&gt; (API keys for LLM providers, embedding services, AI platforms) increased 81% year-over-year, reaching 1,275,105 detected leaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24,008 unique secrets&lt;/strong&gt; were found in MCP configuration files on public GitHub. Of those, &lt;strong&gt;2,117 were confirmed valid&lt;/strong&gt; — live credentials sitting in public repos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;64% of valid secrets&lt;/strong&gt; from 2022 are still active in 2026. Four years later, not revoked.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why AI Tools Leak More
&lt;/h2&gt;

&lt;p&gt;The 2x leak rate for AI-assisted commits is not a simple "AI is bad at security" story. GitGuardian's report is careful about this, and the nuance matters.&lt;/p&gt;

&lt;p&gt;Developers remain in control of what gets accepted, edited, and pushed. AI coding tools suggest code. Humans approve it, modify it, and commit it. The leak happens through a human workflow — but the workflow has changed.&lt;/p&gt;

&lt;p&gt;Three things are different when AI is in the loop:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed.&lt;/strong&gt; AI-assisted development moves faster. More code reviewed per hour, more commits per day, more surface area for a secret to slip through. The cognitive load of reviewing AI-generated code for security issues sits on top of reviewing it for correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidence.&lt;/strong&gt; When a tool generates code that works, the instinct is to ship it. The review step becomes shallower. A hardcoded API key in a config block generated by an AI assistant looks the same as any other config value — unremarkable, easy to miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defaults.&lt;/strong&gt; AI coding tools generate what they've seen in training data. If thousands of public repositories contain hardcoded API keys in configuration files, that pattern gets learned and reproduced. The model isn't being malicious. It's being accurate — accurately reproducing the insecure patterns it was trained on.&lt;/p&gt;

&lt;p&gt;The result is not a tool failure. It's a process gap: the velocity increased, but the guardrails didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  24,008 Secrets in MCP Configs
&lt;/h2&gt;

&lt;p&gt;This finding deserves its own section because it points to something structural.&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) is how AI agents connect to external tools — databases, APIs, file systems, code repositories. An MCP configuration file defines which servers to connect to, what credentials to use, and how to authenticate.&lt;/p&gt;

&lt;p&gt;GitGuardian found 24,008 unique secrets across MCP-related configuration files on public GitHub. The report identifies a root cause that's uncomfortable: &lt;strong&gt;the documentation itself encourages the pattern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Popular MCP setup guides — including official quickstarts — routinely show API keys placed directly in configuration files or command-line arguments. When the getting-started guide puts the API key inline, developers follow that pattern. When those config files get committed, the secret goes with them.&lt;/p&gt;

&lt;p&gt;This is not surprising. It's the same pattern that plagued &lt;code&gt;.env&lt;/code&gt; files, Docker Compose files, and Kubernetes manifests before tooling caught up. The difference is scale and timing: MCP adoption is accelerating fast, and the ecosystem's security tooling hasn't caught up yet.&lt;/p&gt;

&lt;p&gt;Of the 24,008 secrets found, 2,117 were confirmed valid. That means 2,117 live credentials — capable of authenticating against real services — were sitting in public GitHub repositories at the time of the scan.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Remediation Gap
&lt;/h2&gt;

&lt;p&gt;Perhaps the most alarming number in the report isn't about AI at all.&lt;/p&gt;

&lt;p&gt;64% of valid secrets detected in 2022 are still active in 2026. Four years later. Not rotated, not revoked, not expired.&lt;/p&gt;

&lt;p&gt;This isn't a detection problem. GitGuardian detected them. The problem is what happens after detection: somebody needs to identify the secret's owner, assess its blast radius, revoke it, rotate it, update every system that depends on it, and verify nothing breaks. For most organisations, that workflow either doesn't exist or stalls at "identify the owner."&lt;/p&gt;

&lt;p&gt;AI agents make this worse in a specific way. An AI coding tool that generates a config file with a hardcoded secret doesn't know who owns that secret, what it connects to, or what the rotation procedure is. It can't file the remediation ticket. It just writes the code and moves on.&lt;/p&gt;

&lt;p&gt;The gap between "secret detected" and "secret revoked" is where the real risk lives. And it's growing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Agent Infrastructure
&lt;/h2&gt;

&lt;p&gt;If you're building or operating AI agents, three things from this report should change your threat model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. MCP config files are a credential attack surface.&lt;/strong&gt; Treat &lt;code&gt;.cursor/mcp.json&lt;/code&gt;, &lt;code&gt;claude_desktop_config.json&lt;/code&gt;, and any MCP server configuration with the same paranoia you'd apply to &lt;code&gt;.env&lt;/code&gt; files. Don't commit them. Don't share them in Slack. Don't paste them in documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI-generated code needs secret scanning in the commit pipeline.&lt;/strong&gt; Pre-commit hooks that catch secrets before they hit the repository are no longer optional. Tools like GitGuardian, TruffleHog, and &lt;code&gt;detect-secrets&lt;/code&gt; belong in every pipeline that ships AI-assisted code. The 2x leak rate makes this arithmetic simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The output side matters as much as the input side.&lt;/strong&gt; Most discussion about AI agent security focuses on what goes into the agent — prompt injection, poisoned context, malicious tool responses. This report is about what comes out: the code the agent writes, the configs it generates, the credentials it embeds. Output scanning — including DLP on tool call payloads — catches the secrets that pre-commit hooks miss, because not all agent output flows through git.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest Context
&lt;/h2&gt;

&lt;p&gt;We build DLP for MCP tool calls at mistaike.ai, so we have a stake in this conversation. We're not pretending otherwise.&lt;/p&gt;

&lt;p&gt;But the GitGuardian data stands on its own. 29 million secrets. 24,008 in MCP configs. 2x leak rate from AI-assisted code. 64% still valid after four years. These are someone else's numbers from an independent study, and they describe a problem that exists whether or not you use our product.&lt;/p&gt;

&lt;p&gt;The practical takeaway is simple: if your AI agents generate code, configs, or tool call payloads, something needs to be scanning that output for secrets. That something could be a pre-commit hook, a CI pipeline check, a runtime DLP layer, or all three. The specific tool matters less than having the coverage at all.&lt;/p&gt;

&lt;p&gt;Right now, most teams don't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://www.gitguardian.com/state-of-secrets-sprawl-report-2026" rel="noopener noreferrer"&gt;GitGuardian State of Secrets Sprawl 2026&lt;/a&gt; (March 27, 2026) · &lt;a href="https://blog.gitguardian.com/the-state-of-secrets-sprawl-2026/" rel="noopener noreferrer"&gt;GitGuardian blog: AI-Service Leaks Surge 81%&lt;/a&gt; · &lt;a href="https://www.helpnetsecurity.com/2026/03/27/gitguardian-exposed-credentials-risk-report/" rel="noopener noreferrer"&gt;Help Net Security: AI frenzy feeds credential chaos&lt;/a&gt; · &lt;a href="https://hackernoob.tips/ai-coding-tools-double-secret-leak-rates-2026/" rel="noopener noreferrer"&gt;HackerNoob: AI Coding Tools Double Secret Leak Rates&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/ai-coding-agents-leak-secrets" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>secrets</category>
      <category>aiagents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>LiteLLM Was Backdoored via Its Security Scanner. Langflow Hit CISA's Exploit Catalog. Same Week.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Fri, 27 Mar 2026 12:40:07 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/litellm-was-backdoored-via-its-security-scanner-langflow-hit-cisas-exploit-catalog-same-week-24f3</link>
      <guid>https://dev.to/mistaike_ai/litellm-was-backdoored-via-its-security-scanner-langflow-hit-cisas-exploit-catalog-same-week-24f3</guid>
      <description>&lt;p&gt;Two tools that appear in most AI development stacks had critical security incidents within 48 hours of each other this week.&lt;/p&gt;

&lt;p&gt;On March 24, LiteLLM — the open-source LLM proxy and router used across thousands of enterprise deployments — distributed malicious packages containing a credential-stealing backdoor. The attack window was approximately 5.5 hours.&lt;/p&gt;

&lt;p&gt;On March 25, CISA added Langflow to its Known Exploited Vulnerabilities catalog. Langflow is the visual framework for building AI workflows, with 145,000 GitHub stars. CVE-2026-33017 had already been exploited in the wild within 20 hours of the advisory's publication.&lt;/p&gt;

&lt;p&gt;Neither incident was subtle. Both were preventable with steps that are not particularly difficult. Together they mark a visible shift: AI development tooling is now a primary attack target, not collateral damage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The LiteLLM Attack Chain
&lt;/h2&gt;

&lt;p&gt;LiteLLM's compromise traced back to Trivy — a popular open-source container security scanner. Trivy had been compromised via a supply chain attack, and LiteLLM's CI/CD pipeline used Trivy as a dependency.&lt;/p&gt;

&lt;p&gt;The result: when LiteLLM's automated build ran, the compromised Trivy component injected malicious code into the resulting packages. Versions v1.82.7 and v1.82.8 were pushed to PyPI through what appeared to be a legitimate maintainer account, but they contained a credential harvester that LiteLLM's team had not written.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.litellm.ai/blog/security-update-march-2026" rel="noopener noreferrer"&gt;According to LiteLLM's post-incident report&lt;/a&gt;, the payload was designed to collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;SSH keys&lt;/li&gt;
&lt;li&gt;Cloud provider credentials (AWS, GCP, Azure)&lt;/li&gt;
&lt;li&gt;Kubernetes tokens&lt;/li&gt;
&lt;li&gt;Database passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stolen data was encrypted and exfiltrated to &lt;code&gt;models.litellm[.]cloud&lt;/code&gt; — a domain that looks plausible at a glance. The packages were live on PyPI from 10:39 UTC to 16:00 UTC on March 24. LiteLLM has engaged Google Mandiant for forensic analysis and paused new releases pending a full supply chain review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who was at risk&lt;/strong&gt;: anyone who installed LiteLLM without a pinned version during that window. Users running the official Docker image with pinned dependencies were not affected.&lt;/p&gt;

&lt;p&gt;This is the recursive supply chain attack in its clearest form. A security tool used to protect an AI tool became the vector that compromised it. The irony is not subtle. The lesson is: the thing auditing your dependencies can also be the thing that poisons them.&lt;/p&gt;

&lt;p&gt;LiteLLM sits in the call path between your application and the LLMs. It processes every prompt, every response, and has access to every API key you've configured. The malicious package didn't need to be clever to reach valuable data. It was already there.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Langflow RCE
&lt;/h2&gt;

&lt;p&gt;CVE-2026-33017 is a code injection vulnerability in Langflow carrying a CVSS score of 9.3. The vulnerable endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/build_public_tmp/{flow_id}/flow
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This endpoint is designed to let unauthenticated users build public flows. The vulnerability arises because it accepts attacker-supplied flow data containing arbitrary Python code in node definitions — and that code executes server-side with no sandboxing.&lt;/p&gt;

&lt;p&gt;One crafted HTTP request. Arbitrary Python execution on the host. No authentication required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thehackernews.com/2026/03/critical-langflow-flaw-cve-2026-33017.html" rel="noopener noreferrer"&gt;Researchers at Endor Labs documented&lt;/a&gt; that exploitation started approximately 20 hours after the advisory was published on March 19. No public proof-of-concept existed at the time. Attackers reverse-engineered the exploit directly from the advisory text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sysdig.com/blog/cve-2026-33017-how-attackers-compromised-langflow-ai-pipelines-in-20-hours" rel="noopener noreferrer"&gt;Sysdig's incident timeline&lt;/a&gt; shows how fast weaponisation moved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hour 0&lt;/strong&gt; — advisory published&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour 20&lt;/strong&gt; — automated scanning begins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour 21&lt;/strong&gt; — Python-based exploitation observed in the wild&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour 24&lt;/strong&gt; — data harvesting activity confirmed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CISA added CVE-2026-33017 to its &lt;a href="https://www.bleepingcomputer.com/news/security/cisa-new-langflow-flaw-actively-exploited-to-hijack-ai-workflows/" rel="noopener noreferrer"&gt;Known Exploited Vulnerabilities catalog&lt;/a&gt; on March 25. Federal agencies running Langflow have until April 8 to patch to version 1.9.0+ or cease using the product.&lt;/p&gt;

&lt;p&gt;All versions 1.8.1 and earlier are affected.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Both Incidents Share
&lt;/h2&gt;

&lt;p&gt;The obvious answer is "supply chain" — but that framing is too broad to be useful here.&lt;/p&gt;

&lt;p&gt;Look at the specifics.&lt;/p&gt;

&lt;p&gt;LiteLLM sits between your application and the LLMs. It has elevated access because it needs it. The payload targeted exactly the credentials that would give an attacker the most lateral movement: cloud provider keys, database passwords, Kubernetes tokens. Whoever built the attack understood what LiteLLM deployments look like.&lt;/p&gt;

&lt;p&gt;Langflow builds AI workflows where node definitions can contain executable code. The vulnerability wasn't in an obscure edge case. It was in the mechanism that makes the platform functional: flow definitions contain code, and the platform executes that code. The public-facing endpoint inherited all of that execution capability without any authentication guard.&lt;/p&gt;

&lt;p&gt;These aren't bugs found in peripheral features. They're consequences of what these tools are built to do.&lt;/p&gt;

&lt;p&gt;Tools that sit in the execution path of AI workflows — proxies, orchestrators, visual builders — accumulate trust and access because they need it to function. That trust is exactly what attackers are targeting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Advisory-to-Exploit Pipeline
&lt;/h2&gt;

&lt;p&gt;The 20-hour exploitation window for Langflow deserves closer attention.&lt;/p&gt;

&lt;p&gt;The standard assumption in enterprise security is that you have somewhere between 72 hours and a few weeks between a public CVE and active exploitation. That assumption is based on a world where attackers need to understand the vulnerability, write the exploit, test it, and deploy it.&lt;/p&gt;

&lt;p&gt;CVE-2026-33017 invalidated all of that. Attackers read the advisory, extracted the endpoint name and the attack vector description, and had working exploits running before most organisations had finished their morning meetings.&lt;/p&gt;

&lt;p&gt;Modern CVE advisories are detailed. They have to be — developers need to understand what's affected to make patching decisions. But a well-written advisory for a code injection vulnerability is also an exploit blueprint. The technical description is the proof-of-concept.&lt;/p&gt;

&lt;p&gt;Security teams should treat AI workflow and AI infrastructure CVEs as having a near-zero exploitation delay, not a standard 72-hour window.&lt;/p&gt;




&lt;h2&gt;
  
  
  What To Do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For Langflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgrade to version 1.9.0 immediately&lt;/li&gt;
&lt;li&gt;If you cannot patch immediately, restrict or disable the &lt;code&gt;POST /api/v1/build_public_tmp&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Do not expose Langflow instances directly to the internet&lt;/li&gt;
&lt;li&gt;Rotate any credentials the host had access to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For LiteLLM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pin your LiteLLM version in all production deployments&lt;/li&gt;
&lt;li&gt;Check whether your environment installed v1.82.7 or v1.82.8 during the March 24 10:39–16:00 UTC window&lt;/li&gt;
&lt;li&gt;If it did: rotate everything that LiteLLM had access to — AWS keys, GCP service accounts, database passwords, API keys&lt;/li&gt;
&lt;li&gt;Review your PyPI dependency resolution strategy for internal deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For AI infrastructure generally:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your LLM proxy, workflow builder, and agent orchestration layer all have elevated access. Treat them as production services with meaningful blast radii, not developer tools.&lt;/li&gt;
&lt;li&gt;Audit what credentials are available in the environments where these tools run.&lt;/li&gt;
&lt;li&gt;Pin dependencies. All of them. Especially security tooling used in CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;If your AI infrastructure makes outbound network calls, log them. An unexpected call to an unrecognised domain is the earliest signal you'll get.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Neither of these incidents required a sophisticated attacker. LiteLLM needed someone willing to spend time on a supply chain attack that would have wide downstream reach. Langflow needed someone who could read a CVE advisory and write a Python HTTP request.&lt;/p&gt;

&lt;p&gt;The tools we use to build AI systems are now valuable targets in their own right. That's new, and it changes the threat model for anyone operating AI infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://docs.litellm.ai/blog/security-update-march-2026" rel="noopener noreferrer"&gt;LiteLLM security incident report&lt;/a&gt; (March 24, 2026) · &lt;a href="https://www.bleepingcomputer.com/news/security/cisa-new-langflow-flaw-actively-exploited-to-hijack-ai-workflows/" rel="noopener noreferrer"&gt;BleepingComputer: Langflow CVE-2026-33017&lt;/a&gt; · &lt;a href="https://www.sysdig.com/blog/cve-2026-33017-how-attackers-compromised-langflow-ai-pipelines-in-20-hours" rel="noopener noreferrer"&gt;Sysdig: 20-hour exploitation timeline&lt;/a&gt; · &lt;a href="https://thehackernews.com/2026/03/critical-langflow-flaw-cve-2026-33017.html" rel="noopener noreferrer"&gt;The Hacker News: Endor Labs research&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/litellm-langflow-same-week" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>cve</category>
      <category>aiinfrastructure</category>
    </item>
    <item>
      <title>We Stopped Bolting Security onto MCP. We Built It In.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Wed, 25 Mar 2026 01:26:21 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/we-stopped-bolting-security-onto-mcp-we-built-it-in-i0n</link>
      <guid>https://dev.to/mistaike_ai/we-stopped-bolting-security-onto-mcp-we-built-it-in-i0n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Managed MCP hosting with Data Loss Prevention, 0-day CVE protection, and Content Safety is live on mistaike.ai. Self-service. No enterprise contract. 0-Day CVE protection is free.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/auth/register"&gt;Start for free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://dev.to/guides/sandbox-mcp-servers"&gt;Setup guide →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Enterprise MCP security platforms have existed for a while. They cost five figures per year, require dedicated security teams, and take months to configure.&lt;/p&gt;

&lt;p&gt;We searched for something different — a managed MCP platform where Data Loss Prevention, CVE protection, and Content Safety were default features developers and small teams could actually use. We couldn't find one. So we built it.&lt;/p&gt;

&lt;p&gt;Sign up, connect your MCP tools, and every tool call is inspected from the first minute. No configuration required to turn security on. It's already on. And if you're just getting started with existing MCP tools, our gateway alone is enough — you still get 0-day CVE protection on every call, completely free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Agent Is Flying Blind
&lt;/h2&gt;

&lt;p&gt;Every time your AI agent calls an MCP tool, it executes code written by someone else — on your infrastructure, with access to your network, your secrets, and your data. The response comes back and your agent acts on it, unquestioned.&lt;/p&gt;

&lt;p&gt;Most developers don't think about this. They connect MCP servers the way they install packages: trust the name, hope someone checked it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://blog.gitguardian.com/smithery-mcp-breach/" rel="noopener noreferrer"&gt;Smithery.ai breach&lt;/a&gt; showed what happens when that trust is misplaced. One path traversal vulnerability exposed 3,243 MCP servers and thousands of API keys. &lt;a href="https://dev.to/razashariff/9-real-mcp-security-breaches-cves-data-leaks-and-why-the-protocol-needs-a-cryptographic-identity-ff6"&gt;82% of surveyed MCP implementations&lt;/a&gt; had path traversal vulnerabilities.&lt;/p&gt;

&lt;p&gt;This isn't hypothetical. It's the current state of MCP infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Security Layers. Every Tool Call.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data Loss Prevention — Both Directions, Under 50ms
&lt;/h3&gt;

&lt;p&gt;Every tool call through mistaike.ai is scanned bidirectionally in real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outbound&lt;/strong&gt; (your agent → the tool): secrets, credentials, PII, and financial data are caught before they reach third-party code. Your AWS keys don't leave. Your customer's email address doesn't get forwarded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inbound&lt;/strong&gt; (the tool → your agent): API keys, database connection strings, and personal data are stripped from responses before your agent processes them.&lt;/p&gt;

&lt;p&gt;When a scan triggers, the content is redacted. Your agent sees a clean response. The offending data never moves. Every match is written to an immutable audit log: what triggered, what was redacted, which rule matched, confidence score.&lt;/p&gt;

&lt;h3&gt;
  
  
  0-Day CVE Protection — Free, and Always Up to Date
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;0-day CVE protection is free. For everyone. On every plan.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the one people miss.&lt;/p&gt;

&lt;p&gt;Traditional vulnerability scanners check your &lt;em&gt;committed code&lt;/em&gt;. That's table stakes. What they don't check: the code and data patterns embedded in the MCP &lt;em&gt;responses&lt;/em&gt; your agent receives and acts on.&lt;/p&gt;

&lt;p&gt;An MCP tool can return a SQL injection vector. A path traversal construct. An insecure deserialisation pattern. Your agent doesn't know — it just sees a tool response and uses it.&lt;/p&gt;

&lt;p&gt;Our pipeline cross-references every tool response against 9,527 known security vulnerability patterns drawn from CVE datasets and curated security research. If a response matches a known attack pattern, it's flagged before your agent ever processes it. This catches supply chain attacks specifically designed for the AI agent layer.&lt;/p&gt;

&lt;p&gt;We update our CVE lists and protections at least once a day. You don't manage updates — you're always protected against the latest known vulnerabilities, automatically.&lt;/p&gt;

&lt;p&gt;Even if you're not ready for managed hosting, connect your existing MCP tools through our gateway and you get this protection today, at no cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Safety — Stopping What Data Loss Prevention Doesn't Catch
&lt;/h3&gt;

&lt;p&gt;Tool responses can carry more than leaked data. They can carry instructions. Prompt injection attacks hide in tool outputs, attempting to redirect your agent's behaviour mid-task.&lt;/p&gt;

&lt;p&gt;Content Safety scanning runs on every inbound response, independently from the Data Loss Prevention pipeline. Configurable sensitivity. Per-server overrides for teams that need different thresholds on different tools. Full audit trail of every flag.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managed MCP Hosting: Your Code Never Runs on Your Infrastructure
&lt;/h2&gt;

&lt;p&gt;Upload a Python MCP server. We build it, run it, and route your agents through our gateway. The untrusted code never touches your systems.&lt;/p&gt;

&lt;p&gt;Six isolation layers between your code and your infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Kernel-level sandboxing.&lt;/strong&gt; Your server runs inside a user-space kernel that intercepts every system call — a separate kernel that limits what the process can see and do at the OS level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Default-deny egress.&lt;/strong&gt; Your server declares the external domains it needs (max 10, FQDNs only, no wildcards). Everything else — all outbound network access — is blocked before it leaves the container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Envelope-encrypted secrets.&lt;/strong&gt; Credentials are encrypted at rest, decrypted and injected directly into process memory at runtime, and the injection path is destroyed immediately after. No environment variables. No files on disk. Nothing to exfiltrate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Sandboxed build pipeline.&lt;/strong&gt; Dependency installation runs in its own isolated container with PyPI-only network access. Every dependency is vulnerability-scanned before the image is finalised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Hard resource limits.&lt;/strong&gt; Fixed CPU, memory, storage, and PID limits per tier — not configurable by users. This prevents resource exhaustion attacks and fork bombs within the sandbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Ephemeral containers.&lt;/strong&gt; Five minutes idle, the container is destroyed. Not paused — destroyed. Every new request gets a fresh instance. No state accumulation, no persistent foothold.&lt;/p&gt;

&lt;p&gt;If a server is compromised, the blast radius is one container with no outbound network access, no persistent storage, and no path to anything outside the sandbox.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pricing starts from £10/month, with team plans available.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not ready for hosting? The gateway is free. Route your existing MCP tools through mistaike.ai and get 0-day CVE protection on every call with no subscription required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/pricing"&gt;Full pricing →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Built for Developers and Teams Who Can't Afford to Think About This
&lt;/h2&gt;

&lt;p&gt;If you're an independent developer connecting AI agents to MCP tools: start with the free gateway — you get 0-day CVE protection immediately. Add Data Loss Prevention and managed hosting when you need them.&lt;/p&gt;

&lt;p&gt;If you're a small team: each team member's agent traffic is inspected by the same rules, policy changes take effect immediately across all connections, and the audit log gives your ops team visibility without requiring a dedicated security stack.&lt;/p&gt;

&lt;p&gt;If you're a startup: when a customer asks "how do you protect data flowing through your AI integrations?" — you have a real answer backed by a real audit trail.&lt;/p&gt;

&lt;p&gt;The security doesn't scale down with smaller plans. The developer on the free tier gets the same 0-day CVE protection as a team on an enterprise plan. The limits are on compute allocation and hosted servers, not protection.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/auth/register"&gt;Start free →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://dev.to/guides/sandbox-mcp-servers"&gt;Read the setup guide →&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://dev.to/security/sandbox"&gt;See the full security architecture →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nick Stocks is the founder of mistaike.ai. The platform is built and operated using AI agents — and yes, the DLP caught credential leaks during development. That's how we knew it worked.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/mcp-sandbox-mode" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>sandbox</category>
      <category>security</category>
      <category>launch</category>
    </item>
    <item>
      <title>Your Zero-Trust Architecture Has a Blind Spot. It's Called MCP.</title>
      <dc:creator>Nick Stocks</dc:creator>
      <pubDate>Fri, 20 Mar 2026 16:52:37 +0000</pubDate>
      <link>https://dev.to/mistaike_ai/your-zero-trust-architecture-has-a-blind-spot-its-called-mcp-12ko</link>
      <guid>https://dev.to/mistaike_ai/your-zero-trust-architecture-has-a-blind-spot-its-called-mcp-12ko</guid>
      <description>&lt;h1&gt;
  
  
  Your Zero-Trust Architecture Has a Blind Spot. It's Called MCP.
&lt;/h1&gt;

&lt;p&gt;You spent years building zero-trust. Verified every user. Locked down every device. Inspected every packet. Then you connected an AI agent to your systems via the Model Context Protocol and implicitly trusted everything the agent was told.&lt;/p&gt;

&lt;p&gt;That contradiction just became the most talked-about topic in AI security.&lt;/p&gt;

&lt;p&gt;In the past 72 hours, Dark Reading &lt;a href="https://www.darkreading.com/application-security/mcp-security-patched" rel="noopener noreferrer"&gt;previewed an RSAC 2026 session&lt;/a&gt; where Netskope researcher Gianpietro Cutolo will argue that MCP's security risks are architectural — not the kind you can address via patching or configuration changes. SC Media published an essay calling MCP &lt;a href="https://www.scworld.com/perspective/mcp-is-the-backdoor-your-zero-trust-architecture-forgot-to-close" rel="noopener noreferrer"&gt;"the backdoor your zero-trust architecture forgot to close"&lt;/a&gt;. And an independent researcher scanned 900 MCP configurations on GitHub and found that &lt;a href="https://medium.com/@hrswndnc/we-scanned-900-mcp-configs-on-github-75-had-security-problems-537acb7036f7" rel="noopener noreferrer"&gt;75% had security problems&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The industry is converging on an uncomfortable conclusion: the protocol that connects your AI agents to everything isn't covered by any of the security layers you already have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;The data from independent research groups paints a consistent picture.&lt;/p&gt;

&lt;p&gt;Security researchers catalogued approximately &lt;a href="https://www.scworld.com/perspective/mcp-is-the-backdoor-your-zero-trust-architecture-forgot-to-close" rel="noopener noreferrer"&gt;7,000 internet-exposed MCP servers&lt;/a&gt; — roughly half of all known deployments. Many operate with no authorization controls whatsoever.&lt;/p&gt;

&lt;p&gt;Knostic researchers scanned approximately &lt;a href="http://www.descope.com/blog/post/mcp-server-security-best-practices" rel="noopener noreferrer"&gt;2,000 publicly accessible MCP servers&lt;/a&gt; and found that every single verified instance granted access to internal tool listings without any authentication.&lt;/p&gt;

&lt;p&gt;A comprehensive scan of &lt;a href="https://agent-wars.com/news/2026-03-13-mcp-security-2026-30-cves-in-60-days-what-went-wrong" rel="noopener noreferrer"&gt;2,614 MCP implementations&lt;/a&gt; found that 82% of those handling file operations were vulnerable to path traversal attacks, and 67% carried code injection risk. Between 38 and 41% of 518 officially registered MCP servers offered no meaningful authentication at all.&lt;/p&gt;

&lt;p&gt;And the Orchesis scan of &lt;a href="https://medium.com/@hrswndnc/we-scanned-900-mcp-configs-on-github-75-had-security-problems-537acb7036f7" rel="noopener noreferrer"&gt;900+ MCP configurations&lt;/a&gt; committed to public GitHub repositories found that three out of four failed basic security checks.&lt;/p&gt;

&lt;p&gt;These aren't theoretical vulnerabilities. They're the current state of production deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Attack Surface Nobody Named
&lt;/h2&gt;

&lt;p&gt;Here's the conceptual problem: the cybersecurity industry has mature defences for network-layer attacks, compromised credentials, and device posture. We have names for these threats, frameworks to address them, and tools to enforce policy.&lt;/p&gt;

&lt;p&gt;But MCP introduces something different. SC Media's Sunil Gentyala describes what researchers now call the &lt;a href="https://www.scworld.com/perspective/mcp-is-the-backdoor-your-zero-trust-architecture-forgot-to-close" rel="noopener noreferrer"&gt;"context-layer attack surface"&lt;/a&gt;: the capacity for malicious or manipulated content flowing into an AI agent's reasoning process to induce it to perform unauthorised operations — without any underlying model compromise.&lt;/p&gt;

&lt;p&gt;This is not a network attack. It's not credential theft. It's not even prompt injection in the traditional sense. It's the ability to manipulate what an agent believes about the world, and then watch it act on those manipulated beliefs using real tools with real permissions.&lt;/p&gt;

&lt;p&gt;Your zero-trust architecture verified the user. It verified the device. It inspected the network traffic. But the MCP connection sits between your agent and its tools, carrying context that nobody is inspecting, authenticating, or rate-limiting.&lt;/p&gt;

&lt;p&gt;As Security Boulevard put it in their &lt;a href="https://securityboulevard.com/2026/03/the-ultimate-guide-to-mcp-security-vulnerabilities/" rel="noopener noreferrer"&gt;comprehensive MCP vulnerability guide&lt;/a&gt;: "Unlike static APIs that process predictable, human-driven requests, MCP involves agent-driven decision-making, shifting contexts, and evolving chains of tools. Every interaction creates new risk vectors. Every context switch opens new paths for exploitation."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Can't Patch This
&lt;/h2&gt;

&lt;p&gt;Netskope's Gianpietro Cutolo, whose &lt;a href="https://www.darkreading.com/application-security/mcp-security-patched" rel="noopener noreferrer"&gt;RSAC 2026 session&lt;/a&gt; is scheduled for next week, makes a specific claim: MCP's security risks exist at the architectural level in both LLMs and in MCP itself. They're not implementation bugs. They're design decisions.&lt;/p&gt;

&lt;p&gt;The protocol was designed for interoperability. It succeeded. Every major AI platform adopted it — Anthropic, OpenAI, Google, Microsoft, LangChain, Vercel, Pydantic AI. The standardisation worked exactly as intended.&lt;/p&gt;

&lt;p&gt;But that interoperability came with an implicit trust model: the agent trusts the server to return honest tool descriptions. The server trusts the agent to make reasonable requests. Neither party verifies the other's identity, integrity, or intent.&lt;/p&gt;

&lt;p&gt;You can patch individual CVEs. You can fix specific server implementations. But you can't patch away the fact that the protocol itself has no authentication, no message signing, no tamper detection, and no way to verify that the tools an agent sees are the tools the administrator intended.&lt;/p&gt;

&lt;p&gt;This is what Cutolo means by "architectural." The attack surface isn't in the bugs — it's in the blueprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Zero-Trust for the Context Layer Looks Like
&lt;/h2&gt;

&lt;p&gt;If the security industry spent a decade extending zero-trust from networks to identities to devices, the next extension is to the context layer. Here's what that means in practice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat MCP connections as privileged access pathways.&lt;/strong&gt; Every connection between an agent and an MCP server is a pathway to sensitive data and operations. Inventory them. Classify them. Govern them with the same rigour as admin access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect every tool call.&lt;/strong&gt; The agent doesn't just send requests — it sends context. Tool names, parameters, embedded content. Every tool call is a potential exfiltration channel, and every response is a potential injection point. If you wouldn't let unaudited HTTP requests reach your database, you shouldn't let unaudited tool calls reach your tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforce least privilege per tool, not per server.&lt;/strong&gt; Most MCP servers expose a bundle of tools with a single set of permissions. An agent that needs read access to a calendar shouldn't automatically get write access to email. Tool-level authorisation is the MCP equivalent of role-based access control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scan for data in transit.&lt;/strong&gt; Traditional DLP catches files leaving the perimeter. MCP DLP has to catch data leaving through tool call parameters — API keys in arguments, PII in prompts, credentials in responses. The exfiltration channel is the tool call itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log everything.&lt;/strong&gt; If your agent made a decision, you need to know what context it saw when it made it. Without audit logging at the MCP layer, you can't investigate incidents, prove compliance, or even know that something went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Is Going
&lt;/h2&gt;

&lt;p&gt;The products are starting to appear. &lt;a href="https://www.enterprisenews.com/press-release/story/89892/pointguard-ai-unveils-mcp-security-gateway-to-secure-autonomous-ai-agents/" rel="noopener noreferrer"&gt;PointGuard AI shipped an MCP Security Gateway&lt;/a&gt; on March 18. &lt;a href="https://www.tmcnet.com/usubmit/-aurascape-unveils-new-zero-bypass-mcp-gateway-expands-/2026/03/17/10349323.htm" rel="noopener noreferrer"&gt;Aurascape announced a Zero-Bypass MCP Gateway&lt;/a&gt; on March 17. Open-source projects like &lt;a href="https://dev.to/razashariff/agentsign-zero-trust-for-ai-agents-cryptographic-passports-owasp-aligned-scanner-and-mcp-12ep"&gt;AgentSign&lt;/a&gt; are building cryptographic identity layers for AI agents.&lt;/p&gt;

&lt;p&gt;The message from RSAC is clear: this won't be solved by a patch to MCP v2. It'll be solved by building the same kind of security infrastructure around the context layer that we built around the network, the identity, and the device.&lt;/p&gt;

&lt;p&gt;The zero-trust architecture you already have isn't wrong. It's just incomplete. The context layer is the next perimeter to close.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post draws on reporting from &lt;a href="https://www.darkreading.com/application-security/mcp-security-patched" rel="noopener noreferrer"&gt;Dark Reading&lt;/a&gt; (March 19, 2026), &lt;a href="https://www.scworld.com/perspective/mcp-is-the-backdoor-your-zero-trust-architecture-forgot-to-close" rel="noopener noreferrer"&gt;SC Media&lt;/a&gt; (March 18, 2026), &lt;a href="https://securityboulevard.com/2026/03/the-ultimate-guide-to-mcp-security-vulnerabilities/" rel="noopener noreferrer"&gt;Security Boulevard&lt;/a&gt; (March 19, 2026), &lt;a href="https://medium.com/@hrswndnc/we-scanned-900-mcp-configs-on-github-75-had-security-problems-537acb7036f7" rel="noopener noreferrer"&gt;Orchesis&lt;/a&gt; (March 18, 2026), &lt;a href="http://www.descope.com/blog/post/mcp-server-security-best-practices" rel="noopener noreferrer"&gt;Descope&lt;/a&gt; (February 25, 2026), and &lt;a href="https://agent-wars.com/news/2026-03-13-mcp-security-2026-30-cves-in-60-days-what-went-wrong" rel="noopener noreferrer"&gt;Agent Wars&lt;/a&gt; (March 13, 2026). All statistics are from the cited sources.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://mistaike.ai/blog/mcp-zero-trust-blind-spot" rel="noopener noreferrer"&gt;mistaike.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>zerotrust</category>
      <category>securityarchitecture</category>
      <category>rsac</category>
    </item>
  </channel>
</rss>
