在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)