微软开源 NVX:Agent 微虚拟机沙盒的硬件级隔离拆解
AI Agent 越来越能干,但随之而来的一个刚需问题:Agent 要跑自己生成的代码,这些代码没人审过、可能有 bug、也可能被利用。直接在主机的原生进程里跑风险很大。传统做法是把代码放进容器,但容器与宿主机共享同一个内核,隔离并不彻底。
微软近期在官方 GitHub 账号下悄悄公开了一个项目NVX:一个超轻量的微虚拟机(Micro-VM)沙盒,专门用来以硬件强制隔离的方式运行不可信工作负载。它基于微软开源的 Rust 虚拟机管理程序 OpenVMM 构建,运行 Linux 客户机,同时支持 Linux(KVM / MSHV)与 Windows(WHP)跨平台运行。
下面从"为什么需要"和"怎么做到"两个角度做技术拆解。
一、它要解决什么问题
Agent 场景下,代码执行环境的痛点有三个:
| 痛点 | 说明 |
|---|---|
| 不可信 | Agent 自己写的代码未经审查,可能有漏洞或被诱导执行危险操作 |
| 共享内核风险 | 容器与宿主机共享内核,一旦漏洞穿透容器边界,反主机风险仍在 |
| 冷启动太重 | 传统虚拟机开机慢、资源占大头,不适合"每次任务开一台"的轻量场景 |
NVX 的答案:开一台"临时的小电脑",直接靠 CPU 硬件虚拟化把客机与宿主机隔开——里面的代码出了问题,也很难碰到外面。同时尽可能做轻,让"用完即弃"成为可接受的默认。
二、核心特点
| 特点 | 说明 |
|---|---|
| 超轻量 | 不模拟完整电脑,无固件,只开放一小组固定设备 |
| 跨平台 | Linux 上 KVM / MSHV,Windows 上 WHP,同一个系统镜像到处跑 |
| 快照秒恢复 | 冷启动约 0.2–0.4 秒,快照恢复最快约 30 毫秒 |
| 系统可选 | 客机可跑 Alpine 或 Ubuntu |
| 开源 MIT | 装好 Python 3.10 以上,3 条命令即可 |
仓库microsoft/nvx(MIT 协议,dev 分支,版本目前是 0.1.0 早期),由微软研究院系统研究组与 Azure 研究院系统组联合开发,底子来自 Nanvix 研究项目。
三、隔离是怎么做的:多层嵌套
从源码与设计文档看,Agent 的代码被关进"多层盒子":
1. 设备白名单:虚拟机里只有中断控制器、时钟、几个端口和 8 个固定的 virtio 插槽,串口、PCI 总线、固件统统没有——攻击面被收窄到很小。
2. 网络不直通:流量交给内置的 Consomme NAT 处理,只放行指定的 IP 和端口(最多 256 条放行、256 条禁止),外部主动连入的一律拒绝。
3. 共享目录由主机把关:文档里的做法是把代码目录挂进虚拟机,同时禁止读取.git/credentials(存密码文件)。检查在宿主机侧完成,虚拟机内绕不过去。
4. 虚拟机里也不信任:沙盒模式下,Agent 程序跑在独立命名空间(namespaces)里,只看得见自己的文件和进程;且以普通用户身份运行,清空全部 Linux 特权。
5. 内核裁剪:客机 Linux 6.18 不能加载内核模块,并关掉 PCI、ACPI、USB、IPv6,攻击面更小。
四、快照为什么这么快:写时复制
快照恢复是 NVX 的亮点。一份快照包含 4 个文件:清单manifest.bin、处理器与设备状态state.bin、内存memory.bin、可选的可写盘scratch.img。
恢复时,NVX 不把整个memory.bin读进内存,而是用内核的MAP_PRIVATE(写时复制)把文件映射到内存:
- 客机读内存时,系统按需从文件取页,用到哪页读哪页;
- 客机改写某页时,系统才悄然复制一份私有页面,原文件一个字节不动;
- 因此同一份快照可同时恢复出多台互不影响的虚拟机。
Windows 上对应PAGE_WRITECOPY,思路一致。恢复入口在openvmm_entry/src/snapshot_restore/prepare.rs,注释直白:从打开的文件句柄创建私有映射。
还有两个巧思:
- 快照由虚拟机自触发:客机里的脚本先冻结程序与磁盘,再往 0x605 端口写入一个字节;写入之后的代码只在每台恢复出来的副本里运行,效果类似 fork。
- 恢复后重新播种随机数:否则多台副本随机数状态一致,生成的密钥/凭据可能碰撞;NVX 每次恢复注入 64 字节新随机数和新的机器编号。
文档把恢复目标定在约 10ms,当前实测 30–116ms。
五、开发者怎么用
目前主要通过命令行(sandbox provision → start → exec → stop/deprovision),OpenVMM 还提供一套 ttrpc 管理接口,智能体框架可编程创建、等待、关闭虚拟机。附一个最简 Linux/KVM 启动序列(与官方 README 一致):
gitclone https://github.com/microsoft/nvx.git&&cdnvx python3 scripts/nvx.py download# 下载最新 release(无需本地构建)python3 scripts/nvx.py run# 启动,打印 NVX-GUEST-BOOT-OK: alpine# 客机内优雅退出/sbin/nvx-exit0Windows 同样支持:启用 Windows Hypervisor Platform 后python scripts\nvx.py download+run。
六、与既有沙盒的对比
| 方案 | 隔离级别 | 平台 | 备注 |
|---|---|---|---|
| Docker 容器 | 共享内核 | 跨平台 | 隔离不够彻底 |
| Firecracker(E2B 等用) | 微 VM | Linux only | 行业常用但单平台 |
| NVX | 微 VM | Linux + Windows | 首个 Windows 原生可跑微 VM 沙盒 |
| Hyperlight | 微 VM | Linux | 已成微软 Agent 框架代码执行后端 |
| MXC / ACA Sandboxes | 多级 | 云 | 管理/托管类,早期/正式并存 |
NVX 最大差异化点是Windows 上也能原生跑,意味着未来 Windows 电脑上也可能直接给 Agent 开一台本地隔离环境。
七、当前限制与判断
- 只支持 x86-64,vCPU 只能选 1/2/4/8;
- 不支持嵌套虚拟化;快照不能跨平台恢复;
- 不能直接跑标准容器镜像(OCI);无常公开快照流程;
- 命令行沙盒命令还不能自动管理检查与恢复;
- 待办里还有 Azure Files 挂载、计费、多租户隔离,显然在为云计算生产环境做准备。
所以当前它更像"底层积木",离开箱即用还有距离。
小结
AI Agent 越来越能干,"给它一台安全的电脑"就成刚需。NVX 把硬件级隔离做得更轻,并且第一次照顾了 Windows,这是它区别于 Firecracker 系(只能 Linux)的差异化价值。除了隔离能力,它"精简攻击面 + 多副本恢复不共享状态 + 写时复制"的设计思路,对任何想给自己 Agent 运行时加隔离的开发者都有参考意义。