
微软在 GitHub 上公开了一个新项目 NVX:一个超轻量的虚拟机沙盒,专门用来跑不可信的代码,比如智能体自己写的代码。
项目地址:https://github.com/microsoft/nvx
最早注意到它的,是一位研究微软虚拟化技术的博主。他 10 月 2 日发帖,直接引用了项目介绍,一天多就有 3.1 万次浏览、500 多次收藏。

Arthur Khudyaev @gerhart_x,北京时间 10 月 2 日 17:15
帖子翻译过来是:NVX 是一个超轻量的微型虚拟机沙盒,用硬件强制隔离来运行不可信的工作负载。它基于 OpenVMM 构建,里面跑的是 Linux。看起来它支持 Windows 的虚拟机监控程序平台 WHP,以及 Linux 上的 MSHV。
需要说明的是:这个项目在微软官方的 GitHub 账号下,代码是真的。但截至 10 月 3 日上午,我们没找到微软发的博客或公告,版本号也只是 0.1.0。所以它更像是悄悄公开的早期项目,还没有正式官宣。
先认识一下几位主角
Arthur Khudyaev:网名 Gerhart,X 上 3000 多关注。简介写着「我的爱好是研究 Hyper-V」,Hyper-V 就是微软自家的虚拟化技术。他经常第一时间挖出微软虚拟化相关的新东西。
NVX 的开发团队:按项目说明,NVX 由微软研究院系统研究组和 Azure 研究院系统组联合开发,基础是一个叫 Nanvix 的研究项目。
OpenVMM:微软开源的虚拟机管理程序,用 Rust 写的,可以跨平台运行。NVX 就是在它上面搭起来的。准确说,NVX 用的是放在 nanvix 账号下的一个 OpenVMM 分支,改动还在陆续合回官方版。
NVX 是干什么的
说白了,就是给智能体一台临时的小电脑。
智能体经常要跑自己写的代码。这些代码没人审过,可能有 bug,也可能被人利用。直接放在电脑上跑,风险很大。
常见的做法是放进容器里跑。但容器和主机共用一个系统内核,隔离没那么彻底。NVX 的做法是直接开一台虚拟机,靠 CPU 的硬件虚拟化功能把它和主机隔开。里面的代码就算出了问题,也很难碰到外面。
它的特点有这几个:
• 很轻:不模拟完整的电脑,没有固件,只开放一小组固定的设备
• 跨平台:Linux 上支持 KVM 和 MSHV,Windows 上支持 WHP,同一个系统镜像到处都能跑
• 能存快照:可以把一台运行中的虚拟机存下来,之后在新进程里秒恢复
• 系统可选:里面可以跑 Alpine 或 Ubuntu
• 开源:MIT 协议,装好 Python 3.10 以上,3 条命令就能跑起来
到底有多快
仓库里放了持续集成的测速数据。我们取了 10 月 2 日最新一次提交的结果:

数据来自 NVX 仓库,测试机为云上虚拟机,单位为毫秒
简单解读一下:
• 从零启动一台虚拟机,Linux 上大约 0.2 到 0.3 秒,Windows 上大约 0.4 秒
• 从快照恢复更快,Linux 上最快 30 毫秒,Windows 上大约 0.1 秒
• 冷启动时,OpenVMM 进程的内存峰值大约 75 MiB
要注意,这些是在云上的虚拟机里测的,不是物理机。换到物理机上,数字可能还会更好看。
翻了一遍源码
这次我们把 NVX 的仓库,连同它依赖的 OpenVMM 代码,都拉下来读了一遍。先看整体结构:
• NVX 仓库本身:大部分是 Python 写的工具脚本,负责构建、启动、测速和打包,大约 4.7 万行,其中约 4 成是测试。另有约 2100 行 C 写的虚拟机内部小工具,外加一份 Linux 内核配置和 4 个内核补丁
• 真正的虚拟机代码在 OpenVMM 里:NVX 用的不是微软官方版,而是放在 nanvix 账号下的一个分支(fork,也就是在别人代码的基础上另起一条线来改)。和分叉点相比,这个分支一共加了大约 5.9 万行代码,几乎都是 Rust
• 加得最多的是虚拟设备:virtio 是虚拟机里通用的一套「虚拟硬件」接口,这部分加了约 1.7 万行;启动入口和命令行约 1.1 万行;快照相关的工具约 7000 行
• 打算合回官方:仓库里有份文档,把这些改动拆成 165 个提交、27 个合并请求,规划怎么一步步合回微软官方的 OpenVMM
身世也能从代码里看出一点:仓库的说明文件写着,原来的 nanvix/nvx 仓库已经归档。看起来,NVX 是从 Nanvix 团队的仓库搬到微软官方账号下的。
再看隔离。智能体的代码其实被关在好几层盒子里:

根据 NVX 源码和设计文档整理
几个值得一提的细节:
• 设备是白名单:虚拟机里只有中断控制器、时钟、几个端口和 8 个固定的 virtio 插槽。串口、PCI 总线、固件统统没有
• 网络不直通:流量交给一个叫 Consomme 的内置 NAT 处理。NAT 就是网络地址转换,相当于一台小路由器。它可以只放行指定的 IP 和端口,最多 256 条放行规则、256 条禁止规则,外面主动连进来的一律拒绝
• 共享目录由主机把关:文档里的例子是把代码目录挂进虚拟机,同时禁止读取 .git/credentials 这个存密码的文件。检查在主机这边做,虚拟机里绕不过去
• 虚拟机里也不信任代码:沙盒模式下,智能体的程序跑在独立的命名空间里。命名空间可以理解为「隔间」,程序只看得到自己的文件和进程。它还会被切成普通用户身份,清空所有 Linux 特权
• 内核删得很干净:虚拟机里的 Linux 6.18 不能加载内核模块,也关掉了 PCI、ACPI、USB 和 IPv6,能被攻击的地方更少
开发者怎么用?目前主要靠命令行。官方文档给了一个完整流程:
• sandbox provision:准备沙盒,指定只读的系统层和一块可写盘
• sandbox start:启动虚拟机
• sandbox exec:在里面跑命令,比如用 python3 跑一个脚本
• sandbox stop 和 deprovision:停机、清理
OpenVMM 本身还有一套 ttrpc 管理接口。ttrpc 是一种轻量的远程调用协议,智能体框架可以用它直接创建、等待和关闭虚拟机。
快照为什么这么快
快照,就是给一台正在运行的虚拟机「拍张照」存下来。下次直接从照片接着跑,省掉开机的时间。
一份快照有 4 个文件:清单 manifest.bin、处理器和设备状态 state.bin、内存 memory.bin,以及可选的可写盘 scratch.img。
恢复时,NVX 并不会把整个 memory.bin 读进内存,而是用下面这段代码把它「映射」进来:

NVX 所用 OpenVMM 分支中的 support/sparse_mmap/src/unix/copy_on_write.rs
关键是 MAP_PRIVATE 这个参数,意思是「写时复制」:
• 虚拟机读内存时,系统按需从文件里取,用到哪一页才读哪一页
• 虚拟机要改某一页时,系统才悄悄复制一份私有的,原文件一个字节都不动
• 所以同一份快照,可以同时恢复出很多台虚拟机,彼此互不影响
Windows 上思路一样,用的是对应的 PAGE_WRITECOPY。恢复的入口在 openvmm_entry/src/snapshot_restore/prepare.rs,注释写得很直白:从打开的文件句柄创建一份私有映射。
还有两个很巧的设计:
• 快照由虚拟机自己发起:虚拟机里的 nvx-snapshot 脚本先冻结程序、冻结磁盘,再往 0x605 号端口写一个字节。源码注释写着,拍照成功的话,原来那台虚拟机在这次写入返回之前就被结束了。效果有点像程序里的 fork:写入之后的代码,只会在每一台恢复出来的副本里运行
• 恢复后重新播种随机数:如果 100 台虚拟机都从同一张快照恢复,它们的随机数状态会一模一样,生成的密钥也可能撞车。所以 NVX 每次恢复都会塞进 64 字节新的随机数和一个新的机器编号,让每台副本各自重新播种
文档里定的目标,是把恢复做到大约 10 毫秒。现在测到的是 30 到 116 毫秒,还有一段距离。
一个有意思的细节:让 AI 来攻击它
NVX 有一套「对抗测试」:让 GitHub Copilot 扮演攻击者,挑选各种手段去试探沙盒能不能被突破。
但 AI 的权限被管得很死。它只能从一份事先定好的测试清单里选编号,不能自己写命令、改路径或者判定结果。是否突破,由独立的程序来判断。
源码里一共定义了 3 组、24 个测试用例,分别针对虚拟机本身、快照和沙盒里的程序,放在 scripts/nvx_tools/adversarial_cases 目录的 3 个 JSON 文件里。用 AI 去攻击给 AI 用的沙盒,这个思路挺巧。
微软的沙盒不止这一个
最近一年,微软在智能体沙盒上铺了好几条线:
• Hyperlight:超轻量的微型虚拟机,已经是微软智能体框架里官方文档写明的代码执行后端
• MXC:微软执行容器,用一套配置统一管理多种沙盒,从进程级隔离到完整虚拟机都有,目前还是早期预览
• Azure Container Apps Sandboxes:Azure 上托管的沙盒服务,已经正式可用
• NVX:这次新公开的跨平台微型虚拟机沙盒
对比一下行业:E2B 这类沙盒公司常用的是亚马逊开源的 Firecracker,只能跑在 Linux 上。NVX 最大的不同,是 Windows 上也能原生跑。对微软来说,这意味着以后在 Windows 电脑上,也可能给智能体开一台本地的隔离小电脑。
还差什么
项目文档写得很坦白,目前还有不少限制:
• 只支持 x86-64,处理器只能选 1、2、4 或 8 个
• 不支持嵌套虚拟化,快照也不能跨平台恢复
• 还不能直接跑标准容器镜像(OCI 格式),也没有公开的沙盒快照流程
• 命令行里的沙盒命令,还不能自动管理检查点和恢复
• 文档的待办清单里还有 Azure Files 挂载、计费指标、多租户隔离等,看起来是在为云上的生产环境做准备
所以现在它更像一块底层积木,离直接拿来用还有距离。
一句话总结
智能体越来越能干,「给它一台安全的电脑」就成了刚需。微软这次悄悄公开的 NVX,把硬件级隔离做得更轻,还第一次照顾到了 Windows。正式版什么时候来、会不会接进 Windows 和 Azure,值得继续关注。
相关链接
• NVX 项目地址:https://github.com/microsoft/nvx
• 设计文档:https://github.com/microsoft/nvx/blob/dev/doc/design.md
• 测速说明:https://github.com/microsoft/nvx/blob/dev/doc/benchmarks.md
• 测速原始数据:https://github.com/microsoft/nvx/tree/dev/data
• OpenVMM 项目地址:https://github.com/microsoft/openvmm
• 快照设计文档:https://github.com/microsoft/nvx/blob/dev/doc/design/snapshot-and-restore.md
• 设备和网络规格:https://github.com/microsoft/nvx/blob/dev/doc/design/machine-and-device-abi.md
• 使用说明:https://github.com/microsoft/nvx/blob/dev/doc/run.md
• 虚拟机内的快照脚本:https://github.com/microsoft/nvx/blob/dev/guest/common/nvx-snapshot
• 内核配置:https://github.com/microsoft/nvx/blob/dev/kernel/config-microvm
• Copilot 攻击测试用例:https://github.com/microsoft/nvx/tree/dev/scripts/nvx_tools/adversarial_cases
• 合回官方 OpenVMM 的规划:https://github.com/microsoft/nvx/blob/dev/doc/openvmm-upstream-roadmap.md
• NVX 所用的 OpenVMM 分支:https://github.com/nanvix/openvmm
• 写时复制映射代码:https://github.com/nanvix/openvmm/blob/2728f33ea9a44d2d0fb956d9f01768ae2100fb62/support/sparse_mmap/src/unix/copy_on_write.rs
• 快照恢复入口代码:https://github.com/nanvix/openvmm/blob/2728f33ea9a44d2d0fb956d9f01768ae2100fb62/openvmm/openvmm_entry/src/snapshot_restore/prepare.rs