Hotdry.
ai-systems

Deno沙箱实现本地MCP模式代码执行:安全隔离与权限控制

基于mcp-deno-sandbox项目,在Deno沙箱中运行本地MCP模式,支持JS/TS/Python代码执行,提供运行时权限与模块隔离参数配置。

在 AI 大模型时代,LLM 生成的代码执行已成为常见需求,但安全风险突出,如 prompt injection 导致文件删除或数据泄露。开源项目 mcp-deno-sandbox 提供解决方案:利用 Deno 内置沙箱,在本地 MCP(Model Context Protocol)模式下隔离执行 TypeScript、JavaScript 和 Python 代码,实现多上下文安全处理。

为什么选择 Deno 沙箱 + MCP 本地模式?

Deno 作为 Node.js 作者 Ryan Dahl 的 “重制版” 运行时,默认采用 V8 引擎沙箱机制,与 Chrome 浏览器相同,确保代码默认无文件、网络访问权限。只有显式授权(如 --allow-read)才能操作资源。这种能力模型(capability-based security)天然适合 LLM 代码执行场景,避免全系统权限滥用。

mcp-deno-sandbox 项目将此扩展为 MCP 服务器,支持 Claude Desktop 等客户端集成。“An MCP server that allows you to run TypeScript, JavaScript, and Python code in a sandbox on your local machine using the Deno® sandbox。” 项目强调简单性,便于审计,仅依赖 Deno 核心与 Pyodide(浏览器内 Python)。

相比 Docker 容器,Deno 启动更快(毫秒级),资源占用低;相比 Node 沙箱,更安全无全局依赖。适用于本地开发测试、AI 代理任务,如代码验证、数据处理。

核心实现原理

  1. MCP 协议集成:MCP 标准化 LLM 与工具交互,服务器暴露 stdio/SSE 接口。客户端(如 Claude)发送代码片段,服务器在 Deno 子进程执行,返回结果。
  2. 沙箱隔离
    • JS/TS:直接 Deno 运行,支持 ES 模块。
    • Python:嵌入 Pyodide WASM,无需系统 Python,避免依赖冲突。
  3. 权限分层:启动参数直传 Deno,如 --allow-net=api.github.com 限制网络;--deny-write=/home/.ssh 阻挡敏感路径。
  4. 多上下文处理:每个调用独立沙箱实例,避免状态污染;支持资源检查(如权限列表工具)。

证据:项目测试显示,限制 --allow-write=/tmp 下,代码无法访问~/.ssh;网络限域后,仅允许指定 API 调用。

可落地配置参数与清单

实现本地 MCP 模式,需 Node/Deno 环境。以下参数针对安全与性能优化:

1. 环境准备(5 分钟)

  • 安装 Deno:curl -fsSL https://deno.land/install.sh | sh
  • 或 Node(自动拉 Deno):npm i -g mcp-deno-sandbox
  • 测试:deno --version

2. Claude Desktop 配置(claude_desktop_config.json)

{
  "mcpServers": {
    "denoSandbox": {
      "command": "deno",
      "args": [
        "run",
        "npm:mcp-deno-sandbox",
        "--allow-net=icanhazip.com,api.github.com",
        "--allow-read=/tmp,/home/project",
        "--allow-write=/tmp",
        "--deny-write=/home/.ssh,/etc"
      ]
    }
  }
}
  • macOS 路径:~/Library/Application Support/Claude/claude_desktop_config.json
  • 重启 Claude 生效。

Node 版:

{
  "mcpServers": {
    "denoSandbox": {
      "command": "npx",
      "args": ["mcp-deno-sandbox", "--allow-net=...", "--allow-read=..."]
    }
  }
}

3. 权限参数清单(按风险排序)

参数 示例 用途 风险阈值
--allow-net --allow-net=api.github.com,icanhazip.com 限域网络 高:仅信任 API;监控流量 > 1MB 报警
--allow-read --allow-read=/tmp,/project/src 读代码库 中:排除~/.aws 等;限文件 < 10MB
--allow-write --allow-write=/tmp/output 写临时结果 高:仅 /tmp;超时 5s 杀进程
--deny-all 默认启用 全局拒绝 -
--allow-env --allow-env=DENO_DIR 限环境变量 低:仅开发用
--no-run,--no-ffi 默认禁用 防子进程 / FFI 绝对禁止

监控点

  • 日志:Deno 输出权限拒绝事件。
  • 指标:执行时长 < 10s、内存 < 500MB、调用率 < 10/min。
  • 工具:Prometheus 刮取 Deno metrics。

4. 使用示例与测试

在 Claude 提示:“用 denoSandbox 运行此 JS:console.log ('Hello'); fetch ('https://icanhazip.com')”

  • 预期:打印 IP,无额外网络。
  • 违规测试:尝试 fs.writeFile ('~/.ssh/id_rsa') → 权限拒。

Python 示例:LLM 生成 “import numpy; print (np.array ([1,2]).sum ())” → Pyodide 执行。

5. 性能与扩展

  • 基准:JS 执行 < 100ms,Python<500ms(单次 Pyodide 加载)。
  • 优化:复用环境(牺牲简单性);集群 Deno Deploy。
  • 多模型:兼容 Cursor、Windsurf 等 MCP 客户端。

风险与回滚策略

  1. Prompt Injection:LLM 被骗执行 rm -rf。缓解:权限白名单;输入消毒。
  2. 资源耗尽:无限循环。参数:--max-time=5s(Deno 实验旗)。
  3. Pyodide 开销:~200ms 加载。回滚:禁用 Python,仅 JS。
  4. 审计:代码 < 1000 行,自审或社区 PR。

回滚:默认无权限模式;kill -9 进程。

总结与来源

Deno 沙箱 + MCP 本地模式,提供生产级安全代码执行,参数化配置确保落地。通过以上清单,开发者可在 1 小时内上线,支持 AI 代理多上下文任务。未来可扩展 WASM 模块隔离。

资料来源:

  • GitHub: bewt85/mcp-deno-sandbox (2025)
  • Deno Security Docs
  • HN 讨论 (news.ycombinator.com)
查看归档