在 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 代理任务,如代码验证、数据处理。
核心实现原理
- MCP 协议集成:MCP 标准化 LLM 与工具交互,服务器暴露 stdio/SSE 接口。客户端(如 Claude)发送代码片段,服务器在 Deno 子进程执行,返回结果。
- 沙箱隔离:
- JS/TS:直接 Deno 运行,支持 ES 模块。
- Python:嵌入 Pyodide WASM,无需系统 Python,避免依赖冲突。
- 权限分层:启动参数直传 Deno,如 --allow-net=api.github.com 限制网络;--deny-write=/home/.ssh 阻挡敏感路径。
- 多上下文处理:每个调用独立沙箱实例,避免状态污染;支持资源检查(如权限列表工具)。
证据:项目测试显示,限制 --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 客户端。
风险与回滚策略
- Prompt Injection:LLM 被骗执行 rm -rf。缓解:权限白名单;输入消毒。
- 资源耗尽:无限循环。参数:--max-time=5s(Deno 实验旗)。
- Pyodide 开销:~200ms 加载。回滚:禁用 Python,仅 JS。
- 审计:代码 < 1000 行,自审或社区 PR。
回滚:默认无权限模式;kill -9 进程。
总结与来源
Deno 沙箱 + MCP 本地模式,提供生产级安全代码执行,参数化配置确保落地。通过以上清单,开发者可在 1 小时内上线,支持 AI 代理多上下文任务。未来可扩展 WASM 模块隔离。
资料来源:
- GitHub: bewt85/mcp-deno-sandbox (2025)
- Deno Security Docs
- HN 讨论 (news.ycombinator.com)