AI 代理执行 LLM 生成的代码时面临一个根本矛盾:代码沙箱需要足够安全以抵御恶意输入,又需要足够轻量以支持毫秒级响应。传统方案如 Docker 沙箱启动耗时约 195 毫秒,Pyodide WASM 运行时冷启动更达 2.8 秒,这对于需要频繁执行代码片段的 Agent 系统而言是不可接受的延迟。Pydantic 推出的 Monty 正是针对这一场景设计的 Rust 原生 Python 子集解释器,它将冷启动时间压缩至 1 微秒以内,同时通过参数白名单与导入限制构建了一条不同于容器隔离的安全边界。
参数白名单:能力即权限的显式授权模型
Monty 的安全核心在于其 "外部函数调用" 机制。与传统沙箱通过系统调用过滤或 seccomp 限制权限不同,Monty 采用了一种更激进的方案:沙箱内的 Python 代码完全无法直接访问文件系统、网络或环境变量,所有与宿主环境的交互必须通过开发者显式注册的外部函数完成。
在 API 层面,这一机制体现为 Monty 构造函数的 external_functions 参数 —— 开发者通过字符串列表声明允许沙箱内代码调用的函数名,然后在运行时将实际的 Rust 或 Python 函数绑定到这些名称。这种设计的精妙之处在于它实现了 "能力即权限"(capability-based security)的安全模型:沙箱代码能做什么,完全取决于宿主显式授予的能力列表,而非传统 Unix 模型的 "默认可访问、逐步限制" 思路。
Monty 进一步通过序列化检查点增强了这一模型的可控性。当沙箱代码调用外部函数时,解释器会创建一个 MontySnapshot 状态快照,开发者可以在此时检查函数名、参数,甚至将执行状态持久化到数据库供后续恢复。这种 "断点续传" 能力不仅支持跨进程边界的执行恢复,更重要的是让宿主能够在每个外部调用点实施二次授权验证 —— 例如检查 fetch 函数的 URL 参数是否在允许列表内,或对 call_llm 的输入进行内容审计。
导入限制:从语言子集消除攻击面
如果说参数白名单控制了 "代码能做什么",Monty 的导入限制则从根本上限定了 "代码是什么"。Monty 不使用 CPython 运行时,而是基于 Rust 实现了 Python 语法子集的解释器。这一架构决策意味着传统的 Python 沙箱逃逸路径 —— 如通过 __import__ 动态加载 os 或 subprocess 模块 —— 在语言层面即被阻断。
Monty 的导入限制体现为三个层次。首先,解释器仅支持极有限的标准库子集:目前仅包含 sys、typing、asyncio,即将支持 dataclasses 和 json。其次,完全禁止导入任何第三方库,不支持 pip install 的安装模式。最后,语言语法本身受到约束:暂不支持类定义和 match 语句,仅支持基础数据类型、函数定义和异步 / 同步控制流。
这种设计的工程价值在于攻击面的最小化。传统基于 CPython 的沙箱方案,即使通过 seccomp 或命名空间隔离,仍需面对 Python 庞大的 C API 和复杂的对象模型带来的潜在逃逸漏洞。Monty 通过实现一个最小化的、经过 Rust 内存安全保证的解释器,将可信计算基(TCB)从数百万行 C 代码缩减至数万行 Rust 代码,同时移除了整个模块导入机制这一攻击向量。
工程权衡与可落地参数
Monty 的设计并非没有代价。语言子集限制意味着 LLM 必须使用受限语法编写代码,这可能增加提示工程的复杂度,并限制某些需要标准库支持的算法实现。此外,安全边界完全依赖于宿主 Rust 代码对外部函数的正确实现 —— 如果开发者错误地将 std::process::Command 暴露为外部函数,沙箱即被绕过。
在实际部署中,建议遵循以下参数配置原则。external_functions 应采用最小权限原则,仅注册代理执行必需的工具函数,避免暴露通用的系统接口。对于 inputs 参数,建议实施输入验证,防止 LLM 通过数据注入影响宿主逻辑。资源限制参数 —— 内存配额、栈深度和执行超时 —— 应根据 Agent 任务的典型负载设置,既防止资源耗尽攻击,又避免过度限制正常执行。最后,利用 dump() 和 load() 的序列化能力,在多步骤代理任务中实现执行状态的可审计持久化,这既是容错机制,也是安全审计点。
Monty 代表了 AI 代码执行安全模型的一次范式转移:从 "沙箱化危险代码" 转向 "仅执行受限语言子集"。这种设计用表达能力的约束换取了安全边界的清晰性和执行性能的数量级提升,为 LLM Agent 的代码执行层提供了一种比容器更轻、比纯提示更安全的新选择。
资料来源
- Pydantic Monty GitHub 仓库 README 与使用文档
- Monty 技术对比分析(Docker / Pyodide / Starlark 替代方案评估)