Workshop

MXC 实战:微软开源的沙箱代码执行系统,一套 SDK 管住 Agent 的每个进程

6 min read ·

Agent 能写代码之后,下一个问题立刻浮出来:这段代码在哪跑。让模型输出的脚本直接碰你的开发机,等于把家门钥匙交给一个多数时候靠谱、偶尔抽风的实习生;用 Docker 隔一层,又很快会遇到「容器逃逸、挂载目录、网络默认全通」这些老问题。微软 2 月创建、本周在 Show HN 上获得关注的 MXC(Microsoft eXecution Container)给出了一个系统化的答案:把「怎么隔离」抽象成一份声明式策略,把「用什么隔离」藏进九种可替换后端,三语言 SDK 一装就用。这篇实战把它在 macOS 上完整跑一遍,并把策略调优的流程走通。

一、MXC 解决的核心问题:策略与后端解耦

先看它官方给的架构图——应用通过 SDK 发起一次容器创建请求,请求里写清楚三件事:容器类型、隔离规则、要执行的命令。MXC 校验请求、选定后端、把工作负载放进容器:

  • 你的应用(Launch API)→ MXC SDK(Rust / .NET / Node,进程内)→ 选中的后端(进程内)→ 被隔离的工作负载(ProcessContainer / WSLC / Bubblewrap 等)

这个分层听起来平淡,实际是它和「自己写 Docker 脚本」最大的区别。脚本方案里安全策略散落在启动参数、挂载配置、防火墙规则里,换一台机器就变一次形;MXC 把这些全部收敛进一份版本化的 JSON schema,有 stable 目录、有校验、有诊断,策略本身成了可以 review、可以进版本库的代码。

后端清单按平台分三档:

运行平台默认后端其他后端
Windows 11 x64 / ARM64processcontainerwindows_sandbox、wslc、microvm、hyperlight、isolation_session
Linux x64 / ARM64bubblewraplxc、microvm、hyperlight
macOS ARM64 / x64seatbelt无

标了星号的是实验性后端。注意 macOS 只有 Seatbelt 一个选项——它直接生成系统自带的 sandbox-profile,这也是苹果 App Store 沙箱同源的技术,日常隔离可信度足够。

二、五分钟跑起来

MXC 是 SDK 依赖,不需要克隆仓库。三个包管理器各有一个入口:crates.io 上的 mxc-sdk、nuget 上的 Microsoft.Mxc.Sdk、npm 上的 @microsoft/mxc-sdk。Node 和 .NET 的包内置了原生运行时产物,装完即可用;Rust 的 crate 会把 SDK、引擎和所选后端一起编进你的应用。

Node 侧最小可运行示例长这样:

import { spawn, type ContainerRequest } from '@microsoft/mxc-sdk/v1';

const request: ContainerRequest = {
  command: 'node -e "console.log(\'hello from container\')"',
  network: { egress: { default: 'deny' } },
  timeoutMs: 30_000,
};

const child = await spawn(request);

三个要素齐了:命令、网络策略(默认拒绝出站)、超时兜底。把 command 换成模型生成的代码路径,这就是一个最小的 Agent 执行器。官方 samples 目录里还有流式标准输入输出的完整示例,适合需要交互式执行的场景。

如果暂时不想接 SDK,也可以直接用平台专属的执行器二进制(比如 Windows 上的 wxc-exec),接受符合稳定 schema 的 JSON 请求,适合测试阶段快速验证策略。

三、策略三件套:文件系统、网络、UI

MXC 的策略模型分三个维度,全部默认收紧:

文件系统策略:只读路径、读写路径、拒绝路径三个列表。给 Agent 的执行器通常是「工作目录可写、其余只读、密钥目录显式拒绝」的组合。

网络策略:出站默认拒绝,支持代理转发和按后端的主机过滤。这一条对 Agent 场景尤其关键——模型生成的脚本最常见的恶意或失误行为就是往外发数据,出口默认关死,再按需放行包管理器的域名,能把数据外带的风险压到最低。

UI 策略:剪贴板、显示器、GUI 访问各自独立开关。桌面 Agent(比如自动化测试机器人)需要碰 UI 时显式开,纯后端执行器全程关死。

一个值得强调的设计:请求先被校验,不合法的策略直接报错,不会「尽力而为」地降级执行。这比很多沙箱工具的静默降级要诚实得多。

四、策略调优 Playbook:debug 与 audit

真实程序在沙箱里跑,第一件事几乎必然是各种 access denied。MXC 为此准备了两条工作流。

诊断模式:执行器加 --debug 参数,标准输入输出留给工作负载,MXC 自己的诊断信息单独输出,能看到每一次被拒的访问和原因。先跑一遍收集拒绝清单,再逐项把合法访问加进策略。

审计模式:这条是给「策略作者」用的捷径。对一个你信任的工具跑 audit 模式,MXC 会记录它实际访问的所有文件与能力,自动产出一份策略草稿,你再人工收紧。要特别注意官方文档里的粗体警告:audit 模式会关闭被分析工作负载的全部沙箱保护,绝对不能用它跑不可信代码——它的正确用途是给「我自己的可信插件」建档,而不是给「模型输出的脚本」放行。

这套「先全拒绝、audit 收集、人工收紧」的流程,比常见的「先全放开、出事再堵」要安全一个量级,也是我把 MXC 推荐给团队时的核心理由。

五、后端选型的现实建议

按隔离强度和开销排个序,给不同场景对号入座:

  • 完全不可信的模型输出:Hyperlight 或 MicroVM(Nanvix)。Hyperlight 是微软开源的微型虚拟机库,启动开销在毫秒级,能把每次执行的隔离成本压到接近进程级;Nanvix 走完整一点的 VM 路线。两者在 Windows 和 Linux 上可用。
  • 半可信的内部插件:ProcessContainer(Windows 默认)或 Bubblewrap(Linux 默认),开销最小,配合默认拒绝的网络策略已经能挡住绝大多数事故。
  • macOS 开发环境:Seatbelt 没得选,但配合文件系统策略的拒绝列表,日常隔离够用。
  • 桌面自动化:Windows Sandbox 或 WSLC,前者隔离完整但重,后者适合需要 Linux 工具链的场景。

一个务实的迁移路径:开发与测试阶段用默认后端图省事,生产上线前把后端字段换成 Hyperlight,策略 JSON 一行不改——这正是策略与后端解耦兑现承诺的时刻。

六、合规与工程细节

几个容易被忽略但生产上要过的点:MXC 是 MIT 协议,商用无忧;官方构建有可选遥测,但默认关闭且需要用户显式同意、管理员策略允许、应用在请求里显式开启三个条件同时满足,本地自己编译的版本遥测直接是空操作;Rust 工具链锁 1.93,Node SDK 要求 Node 24 以上,接入前先对齐版本。仓库 10 月初仍在高频提交,diagnostics 文档对「为什么我的程序在容器里跑不起来」这类问题覆盖得相当细,踩坑时先翻它。

Agent 基础设施这条线上,沙箱执行是公认的最后一块硬骨头之一。MXC 的开源把「隔离策略工程化」这件事从各家自拼脚本变成了一个有 schema、有 SDK、有多后端的标准件,光是这一点就值得每个做 Agent 产品的团队认真评估。

Frequently asked questions

MXC 和直接用 Docker 跑不可信代码有什么区别?
Docker 是单一后端,安全边界由容器运行时决定,而且默认配置对恶意代码并不算硬隔离。MXC 的价值在两层:一是策略与后端解耦,同一份 JSON 策略在开发机用 Seatbelt、在生产用 MicroVM,行为语义一致;二是它把文件系统、网络、UI 剪贴板这些维度做成显式声明,默认拒绝,审计时能直接看到每一项权限给了谁。
九种后端应该怎么选?
稳妥起见按隔离强度排:Hyperlight 和 MicroVM(Nanvix)是微型虚拟机,隔离最强,适合跑完全不可信的模型输出;Bubblewrap、LXC、ProcessContainer 是进程级容器,开销小,适合可信插件;macOS 只有 Seatbelt 一个后端,走系统自带的沙箱配置文件;Windows Sandbox 和 WSLC 适合桌面场景。开发时用便宜的,上线前换强的。
audit 模式安全吗,会泄露什么?
audit 模式本身会关闭被分析工作负载的全部沙箱保护,官方文档明确警告绝对不能用它跑不可信代码。它的用途是给你自己写的可信工具生成策略:记录程序实际访问了哪些文件和能力,产出一份初始策略草稿,你再人工收紧。用完即弃,不要在多租户环境开着它常驻。
Node SDK 的默认策略是什么,够安全吗?
SDK 不提供默认放行,策略必须显式声明。官方示例里网络出口直接写 default deny,超时 thirty 秒封顶,这种默认拒绝、按需开启的思路是 MXC 的核心设计。够不够安全取决于你的策略覆盖度,建议先全拒绝跑一遍,用诊断日志收集 access denied 列表再逐项放开,比从放行开始收缩安全得多。
MXC 适合生产环境的 Agent 产品吗?
它本来就是微软内部在用的执行容器方案,这次开源补齐了三语言 SDK 和版本化的稳定 schema,集成成本不高。注意三点:Rust 侧要求 1.93 工具链,Node 侧要求 24 以上;Windows 部分后端还是实验状态;官方构建的可选遥测默认关闭,合规团队可以放行。Agent 产品把执行层换成它,比自己维护一套沙箱脚本要可靠。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.