🌏 中文版
What This Post Is
This post is the "integration" post (order 20) of the Sandbox Series, focusing on MCP (Model Context Protocol) Server sandbox integration. MCP has become the standard protocol between AI agents and tools in 2026, but the MCP server itself becomes a new attack surface when executing agent code.
This post covers:
- MCP and sandbox relationship — Why MCP servers need sandboxing
- MCP server sandbox architecture — Isolation boundaries for STDIO and HTTP transports
- Common vulnerabilities — CVE-2026-33032, tool poisoning, path traversal
- Defense strategies — Non-privileged execution, version pinning, network allowlist
- Code example — Minimal Code Sandbox MCP implementation
MCP and Sandbox Relationship
What is MCP
Model Context Protocol (MCP) is an open standard created by Anthropic in late 2024, defining how AI agents access tools, data, and applications. By 2026, MCP has been adopted by Anthropic, OpenAI, Google, and most major orchestrators, becoming the "universal interface" of the AI agent ecosystem.
Why MCP Servers Need Sandboxing
The core value of an MCP server is "letting agents execute tools." But when tool code executes without sandbox isolation:
- Tool code can directly access host filesystem: Agents read
~/.ssh/id_rsa,~/.aws/credentialsthrough MCP server - Tool code can initiate network requests: Agents attack internal network services through MCP server
- Tool code can spawn subprocesses: Agents execute arbitrary shell commands through MCP server
This is the root cause of multiple MCP security incidents in 2026: the MCP server itself lacks sandbox isolation, and the agent code execution layer is directly exposed on the host.
MCP Server Sandbox Architecture
STDIO Transport Sandbox Boundary
STDIO is the most common MCP transport, with the MCP server communicating with the agent via standard input/output. The sandbox should be built around the MCP server process:
┌─────────────────────────────────────┐
│ AI Agent │
└─────────────────────────────────────┘
│ stdio
┌─────────────────────────────────────┐
│ MCP Server │
│ (sandboxed process) │
│ - Non-privileged user │
│ - Read-only filesystem mount │
│ - Network default no-egress │
│ - Subprocess PID limit │
└─────────────────────────────────────┘
│ OS isolation
┌─────────────────────────────────────┐
│ Host OS │
└─────────────────────────────────────┘
HTTP Transport Sandbox Boundary
For HTTP transport (Server-Sent Events or WebSocket), the MCP server runs on a network endpoint. The sandbox should wrap the server process, plus additional network policy:
┌─────────────────────────────────────┐
│ AI Agent │
└─────────────────────────────────────┘
│ HTTP/SSE
┌─────────────────────────────────────┐
│ Network Allowlist │
│ (only allow agent source IP) │
└─────────────────────────────────────┘
│
┌─────────────────────────────────────┐
│ MCP Server │
│ (sandboxed process) │
└─────────────────────────────────────┘
Common Vulnerabilities
CVE-2026-33032: nginx-ui MCP Authentication Bypass (CVSS 9.8)
Attack vector: nginx-ui product shipped with built-in MCP integration, allowing AI agents to manage nginx configuration on behalf of administrators. One MCP endpoint (/mcp_message) enforced only IP allowlist, but when the allowlist was empty, middleware treated it as "allow all," allowing unauthenticated requests to execute arbitrary commands.
Defense:
- Do not treat empty allowlist as "allow all"
- MCP endpoints should enforce authentication, not just IP restriction
Tool Poisoning
Attack vector: A malicious MCP server's tool description contains hidden instructions, inducing the agent to execute unintended operations. For example, a "read file" tool actually also writes to an attacker-controlled server.
Defense:
- Separate tool description review from actual execution logic
- Require human approval (step-up auth) before tool execution
Path Traversal
Attack vector: MCP server accepts user-supplied file paths without validation, agent can access files outside sandbox via ../ paths.
Defense:
- Normalize paths and validate they are within allowed scope
- Use chroot or read-only mounts to restrict filesystem access
Defense Strategies
1. Non-privileged Execution
MCP servers should run as non-privileged users, without root privileges, without Docker socket mounted, without access to cloud metadata endpoints.
# Wrong: running MCP server as root
docker run --user root my-mcp-server
# Correct: running as non-privileged user
docker run --user 1000 --cap-drop ALL --read-only my-mcp-server
2. Version Pinning
MCP server tool definitions and execution logic should be version-pinned, avoiding unexpected security behavior changes from provider-side updates.
3. Network Allowlist (Network Allowlist)
MCP server network access should default to no egress, allowing only necessary external API endpoints.
4. Human Approval for Tool Execution
For high-risk operations such as write, delete, deploy, payment, require human approval (step-up auth), not automatic execution.
5. Execute Tools Inside Sandbox
Each tool call made by the MCP server should run in an isolated sandbox, tool calls should not share state between calls, preventing lateral movement.
Code Example: Minimal Code Sandbox MCP Implementation
Here's a minimal Code Sandbox MCP server using Python and fastmcp, using Docker to isolate code execution:
from fastmcp import FastMCP
import subprocess
import tempfile
import os
mcp = FastMCP("code-sandbox")
@mcp.tool()
def run_python_code(code: str) -> str:
"""Execute Python code in a sandboxed Docker container"""
with tempfile.TemporaryDirectory() as tmpdir:
code_path = os.path.join(tmpdir, "script.py")
with open(code_path, "w") as f:
f.write(code)
result = subprocess.run(
["docker", "run", "--rm",
"--network", "none",
"--memory", "512m",
"--cpus", "1",
"--cap-drop", "ALL",
"--read-only",
"--tmpfs", "/tmp:noexec,nosuid,size=100m",
"-v", f"{tmpdir}:/workspace:ro",
"python:3.12-slim",
"python", "/workspace/script.py"],
capture_output=True,
text=True,
timeout=30
)
return f"stdout: {result.stdout}\nstderr: {result.stderr}\nexit_code: {result.returncode}"
if __name__ == "__main__":
mcp.run()
Key Security Settings Explanation
| Setting | Purpose |
|---|---|
--network none | Prohibit network access, prevent exfiltration and lateral movement |
--memory 512m | Limit memory, prevent resource exhaustion |
--cpus 1 | Limit CPU, prevent compute abuse |
--cap-drop ALL | Drop all Linux capabilities, prevent privilege escalation |
--read-only | Read-only filesystem, prevent writing malicious files |
--tmpfs /tmp:noexec,nosuid | Temp filesystem not executable, prevent binary attacks |
-v ...:ro | Mount code as read-only, prevent tampering |
What You Should Understand After Reading
- Why MCP servers need sandbox isolation when executing agent code.
- Sandbox boundary differences between STDIO and HTTP transports.
- Three common vulnerabilities: CVE-2026-33032 auth bypass, tool poisoning, path traversal.
- Five defense strategies: non-privileged execution, version pinning, network allowlist, human approval, sandbox tool execution.
- Minimal Code Sandbox MCP implementation using Docker isolation with key security settings.