首页 > 教程攻略 > ai教程 >BoxAgnts 运行时(3)——WebAssembly:更好的 Agent 沙箱

BoxAgnts 运行时(3)——WebAssembly:更好的 Agent 沙箱

来源:互联网 时间:2026-07-07 07:21:15

AI Agent 早已不满足于写写文案、聊聊天的角色了。如今的 Agent 系统能干的事多着呢——代码执行、文件操作、网页浏览、API 调用、基础设施管理、分布式任务协调……一旦 Agent 开始真正触碰真实环境,执行安全就从一个 Prompt 层面的小问题,陡然升级成系统级的大课题。

BoxAgnts 运行时(3)——WebAssembly:更好的 Agent 沙箱

现在市面上大多数方案仍然依赖 Python 子进程、Shell 命令、容器隔离——听着挺熟悉?没错,这些东西原本是为人类控制的软件设计的,让 LLM 这个天生的概率性执行者去驱动它们,就像让一个即兴表演者去执行一套严格剧本,风险可想而知。

WebAssembly 正在成为那个最有力的候选者。不是因为它时髦,而是因为它的执行语义和 AI 基础设施的安全要求,简直是天作之合。

传统 Agent 执行的问题

现在的 Agent 运行时,最后都会走到一种熟悉的架构:LLM 出主意,工具去执行,背后是 Python 运行时,再下层是 Shell、文件系统、网络。这套架构带来的麻烦事儿一箩筐:不受限的主机交互、依赖冲突、环境不一致、隔离边界薄弱、资源难以治理。当执行决策权交到 LLM 手里,问题就更棘手了——LLM 对提示词操纵特别敏感,执行路径本身是个概率问题,外部上下文稍变一下,行为就完全不一样。

BoxAgnts 直接来了个釜底抽薪。看看这段代码——boxagnts/wasm-tools/src/wasm_tool.rs,每个工具都是一个独立的 WASM 模块:

pub struct WasmTool {
    name: String,
    wasm_file: String,         // WASM 二进制文件路径
    description: String,
    permission_level: PermissionLevel,
    input_schema: Value,
}

这不再是“在 Python 里调用 Shell”——而是“在受控沙箱里执行自包含的二进制模块”。两者之间的安全边界,一个天上一个地下。

容器有帮助,但还不够

容器确实能提供文件系统隔离、进程命名空间、网络隔离、可重现部署。但它暴露的执行面还是相对宽泛——即便在容器内部,Agent 依然有可能滥用工具、访问非预期资源、泄露数据、递归调用危险操作。容器回答的问题是:“这个进程在哪个环境里跑?”而 AI 运行时必须回答的是:“这个 Agent 到底被允许执行哪些具体操作?”

BoxAgnts 的 WASM 沙箱正是冲着第二个问题来的:不依赖操作系统的进程隔离,直接在 Wasmtime 虚拟机层面构建边界——比进程更细粒度,比容器更轻量。

WebAssembly 的安全模型

默认情况下,WASM 模块什么都干不了:

  • 不能访问任意内存
  • 不能碰文件系统
  • 不能打开网络连接
  • 不能生成进程
  • 不能和主机系统直接交互

每一次对外界的操作都必须由运行时显式授予。这个“默认拒绝”模型和 AI Agent 的安全需求,真是一拍即合。

BoxAgnts 的 RunOption 结构体就把这个哲学写进了代码:

// boxagnts/wasm-sandbox/src/run.rs
pub struct RunOption {
    pub work_dir: Option<String>,
    pub map_dirs: Option<Vec<(String, String)>>,
    pub env_vars: Option<Vec<(String, Option<String>)>>,
    pub allowed_outbound_hosts: Option<Vec<String>>,
    pub block_url: Option<String>,
    pub block_networks: Option<Vec<String>>,
    pub wasm_timeout: Option<u32>,
    pub wasm_max_memory_size: Option<u32>,
    pub wasm_max_wasm_stack: Option<u32>,
    pub wasm_fuel: Option<u32>,
    pub wasm_cache_dir: Option<String>,
}

每一项都是显式授予。不配 work_dir?WASM 模块连文件影子都看不到。不配 allowed_outbound_hosts?所有网络请求统统拦截。不配 wasm_timeout?跑太久直接掐断。

能力注入:真正的杀手锏

现代 WASM 运行时最厉害的地方,其实不是可移植性,而是能力注入(Capability Injection)。运行时可以有选择地给模块文件系统、网络、环境变量、持久存储——而且粒度可以细到:

read:/workspace/docs
write:/workspace/tmp
fetch:https://api.example.com

BoxAgnts 里的每个 WASM 工具都有自己独立的能力集合。在 WasmTool::execute 中,ToolContext 提供的配置被精确映射到 RunOption

let work_dir = ctx.get_work_dir().await; // 只暴露工作目录
let allowed_outbound_hosts = ctx.get_allowed_outbound_hosts();// 白名单网络
let cache_dir = ctx.get_app_cache_dir().await;// 缓存目录

模块接到的能力范围就是它的世界边界,绝无越权的可能。这和传统子进程执行有着本质不同——子进程从父进程继承权限,WASM 模块从零开始,赤手空拳。

确定性执行

现在的 Agent 动不动就动态装依赖、改运行时状态、生成临时代码,弄得可重现性几乎不可能。而 WebAssembly 模块呢?自包含、平台无关、运行时受限、显式授权。同一段 WASM 工具,在本地开发机、云服务器、边缘设备甚至浏览器里,行为都是一致的。

BoxAgnts 内置了 7 个 WASM 工具,全部位于 app/extensions/tools/ 目录下:

file-read-component.wasm     ← 文件读取(支持大文件分页)
file-write-component.wasm    ← 文件写入
file-edit-component.wasm     ← 精确字符串替换编辑
file-glob-component.wasm     ← 文件名模式匹配
bash-component.wasm          ← Shell 命令执行
web-fetch-component.wasm     ← HTTP 请求
boxedjs-execute-component.wasm ← JavaScript 代码执行

每个工具编译一次,到处运行,行为一致——这对 AI 基础设施的审计、调试、重放和治理来说,是实打实的福音。

WASI:从执行格式到实用运行时

单独的 WASM 只是一堆二进制指令。WASI(WebAssembly System Interface)把它扩展成了实用的运行时,引入了文件系统、网络、时钟、随机数、流、环境变量等标准接口。更重要的是,WASI 也遵循能力导向原则——资源默认不可全局访问,得显式提供。

BoxAgnts 的 WASM 运行时在 RunCommon 配置里开启 WASI 支持:

// boxagnts/wasm-sandbox/src/run.rs
run_common.common.wasi.cli            = Some(true);
run_common.common.wasi.http           = Some(true);
run_common.common.wasi.inherit_network = Some(true);
run_common.common.wasi.allow_ip_name_lookup = Some(true);

HTTP 不是默认开启的——得显式设置 wasi.http = Some(true)。就算开了,出站连接还要受 allowed_outbound_hostsblock_networks 的约束。这比操作系统那一套诚实多了——操作系统假设用户可信才放权,而 AI Agent 不可信,需要更严格、更细粒度的边界。

资源治理

Agent 这玩意儿能搞出什么幺蛾子?递归死循环、任务爆炸、内存撑爆、API 流量失控,样样都来。BoxAgnts 通过 WASM 运行时提供了多层压制:

wasm_timeout           → 防止长时间运行
wasm_max_memory_size   → 防止内存膨胀
wasm_max_wasm_stack    → 防止栈溢出
wasm_fuel              → 指令计数限制(类似 gas)

wasm_fuel 是个特别精巧的设计——每个 WASM 指令消耗 1 单位燃料,耗尽后执行被捕获终止。无限循环?DoS 攻击?没门儿。

多 Agent 隔离

BoxAgnts 的 Managed Agent 模式允许你并行跑多个 Executor,每个都在自己的 WASM 沙箱里——内存独立、能力独立、生命周期独立。这种隔离不是事后补丁,而是从 RunOption 创建时就是架构自带的。就像一个操作系统里的进程隔离,一个 Executor 崩了或越权了,不会连累别人。

结语

一句话总结:WebAssembly 之所以是 AI Agent 更好的沙箱,不是因为新潮,而是因为它的安全模型——默认零权限、能力显式注入、资源硬性约束、行为确定性。BoxAgnts 的架构实践已经把这条路走通了:所有工具通过统一的 Tool trait 注册,所有 WASM 工具通过统一的 RunOption 约束执行,所有运行时风险都在沙箱边界被拦截。

相关资源

  • Boxagnts:github.com/guyoung/box…