隔离级别对比

定义

隔离级别描述的是:工作负载与宿主之间,以及工作负载彼此之间,由哪一层机制隔开。本百科区分三种常见级别。

  1. 共享内核容器:隔离来自 namespace 与 cgroup,内核只有一份。
  2. 完整虚拟机:客户机拥有独立内核与较完整的虚拟硬件,由 hypervisor 调度。
  3. MicroVM:仍然是虚拟机,但设备模型与用户空间被大幅裁剪,以换取接近容器的启动时间。

Box 把前一种称为 Sandbox(须显式请求),把第三种作为省略 --isolation 时的默认路径。完整通用虚拟机(例如桌面 QEMU 虚拟机)不是 Box 的产品对象。

问题背景

「把程序装进盒子」这一句话,没有说明盒子的壁有多厚。若威胁模型是「自己的无害工具」,共享内核通常足够,且开销最低。若威胁模型包含不可信代码、多租户或内核漏洞,则必须把边界上移到硬件虚拟化,并接受额外的内存与启动成本。Box 的产品立场是:这两种选择必须由调用方显式做出,且一经记录不得在恢复时被重新解释。

机制说明

对照

维度 共享内核容器 / Box Sandbox 完整虚拟机 Box 默认 MicroVM
内核 与宿主共用 每实例一份客户机内核 每实例一份精简客户机内核
主边界 namespace、cgroup、可选 seccomp / LSM 硬件虚拟化 + 设备模拟 硬件虚拟化 + 精简 virtio 设备
典型启动 毫秒级 数秒到数十秒 约百毫秒量级(视镜像与预热而定)
内存开销 接近进程本身 完整客户机用户空间 + 设备 低于完整虚拟机,高于普通容器
主要风险 内核逃逸、错误挂载、特权配置 虚拟化实现缺陷、错误的设备透传 与完整虚拟机同类,但攻击面更小
最适合 受信或半受信工具、基准、自动化 强隔离且可接受慢启动 不可信工作负载的本地默认路径

为何不能静默切换

从调用方角度看,run 的参数可以完全相同;从安全角度看,两条路径不等价。若实现在 MicroVM 资格不足时自动改走共享内核,调用方会得到一个「命令成功、边界已被削弱」的结果。Box 因此规定:

  • 省略 --isolation 只表示 MicroVM;
  • --isolation sandbox 只表示共享内核;
  • 显式 --isolation microvm 被拒绝,以免脚本把后端名称写成可互换模式;
  • 选择写入 BoxRecord 后,生命周期、恢复与清理不得再查阅当前环境变量来改道。

详见 ExecutionManager、Backend 与 Router代际与 fail-closed

威胁模型中的一句话

共享内核 Sandbox 不能防御:可工作的宿主内核漏洞利用、敌对宿主管理员、硬件侧信道,以及通过 bind mount 故意暴露的数据。当这些风险不可接受时,应使用默认 MicroVM。该陈述来自 Box README 与 docs/host-sandbox-backend-design.md

在 Box 中的位置

  • 枚举 ExecutionIsolation::{Microvm, Sandbox} 定义于 src/core/src/config.rs
  • 设计文档:docs/host-sandbox-backend-design.md
  • 平台资格:Linux/KVM、Apple Silicon/HVF、Windows x86_64/WHPX 用于 MicroVM;经认证的 Linux x86_64 / aarch64 用于 Sandbox GA。

验证命令

a3s-box run --rm alpine:3.20 -- uname -r
a3s-box run --rm --isolation sandbox alpine:3.20 -- uname -r
uname -r

第一条应报告客户机内核;第二条应与宿主相同。若第二条因主机未准备 OCI Runtime 而失败,这是预检失败,不是自动改走第一条路径。

相关与易混