为什么需要容器隔离?
当 AI Agent 在你的机器上执行 shell 命令时,它拥有与你用户账户相同的文件访问权限——它可以读取~/.ssh、删除 ~/Documents 中的文件、或修改系统配置。这对于生产工具来说是不可接受的。
Zeus 通过容器隔离解决这个问题:当你在 Desktop 中选择一个工作目录后,所有命令都在隔离的 Linux 容器内执行。容器只能看到那一个目录(挂载在 /workspace)。你机器上的其他所有内容都是不可见且不可达的。
架构总览
Zeus 根据使用方式有两种不同的执行环境:sandbox_mode 字段控制走哪条路径:
| 模式 | 执行环境 | 何时使用 |
|---|---|---|
cloud | 远程云沙盒(E2B / OpenSandbox / Daytona) | Web 用户;所有请求的默认值 |
local | 你机器上的本地容器 | Desktop 用户,选择了工作目录时 |
none | 完全不执行代码 | 纯对话模式;不注入任何沙盒工具 |
sandbox_mode 为 "local" 时,云沙盒被完全绕过——不会创建远程 VM,不会注入沙盒工具(write/read/edit/bash)。取而代之的是,Agent 使用通过本地容器路由的 desktop_exec。
local 模式端到端流程
以下是 Desktop 用户发送消息(带工作目录)时的完整数据流:
系统提示词注入
当sandbox_mode == "local" 时,后端会向 Agent 的系统提示词中注入:
/etc/passwd,容器的文件系统中根本不存在这个文件。
容器运行时
Zeus Desktop 启动时按优先级顺序检测运行时,结果会被缓存。1. Apple Containerization(优先)
适用于 macOS 26+(Tahoe),需要 Apple Silicon。 工作原理: 与 Docker 通过命名空间共享宿主 Linux 内核不同,Apple Containerization 将每个容器运行在独立的 micro-VM 中——一个轻量级虚拟机,拥有专属的 Linux 内核,由 Apple 的 Virtualization.framework 管理。- 隔离级别:VM 级别。即使容器内发生内核漏洞利用,也无法触达宿主机。
- 通过 virtiofs 共享目录:Apple 实现的 virtio-fs 协议。宿主机通过 virtio 传输将目录暴露给客户 VM。在 VM 内部,它表现为
/workspace的普通挂载。读写操作实时透传,但客户进程无法导航到共享目录之外。 - 性能:接近原生。virtiofs 使用共享内存区域(DAX),避免了早期 Docker for Mac 文件共享中 9p 协议的性能开销。
- 启动:亚秒级。micro-VM 启动一个为快速启动优化的最小 Linux 内核。
- OCI 兼容:使用标准 OCI 容器镜像——同一个 Dockerfile 同时适用于 Docker 和 Apple Containerization。
container --version,超时 3 秒。
2. Docker(回退方案)
适用于 macOS、Windows 和 Linux。需要安装 Docker Desktop(Linux 上为 Docker Engine)。 工作原理: Docker 使用 Linux 命名空间和 cgroups 隔离进程。在 macOS 上,Docker Desktop 运行一个隐藏的 Linux VM(底层使用 Apple Virtualization.framework),容器在这个共享 VM 内运行。- 隔离级别:容器级(命名空间隔离)。所有容器共享 Docker VM 内同一个 Linux 内核。内核漏洞利用可能影响其他容器。
- 通过 bind mount 共享目录:
-v 宿主路径:容器路径标志将宿主目录映射到容器文件系统中。Docker Desktop 使用 virtiofs(macOS 12.5+)或 gRPC-FUSE 在 macOS 宿主和 Linux VM 之间桥接。 - 性能:良好。使用 virtiofs 后端的 bind mount(Docker Desktop 4.15+)接近原生速度。旧版 gRPC-FUSE 后端在
node_modules密集型工作负载中明显较慢。 - 启动:容器约 1-2 秒(VM 已经在运行)。
- OCI 兼容:标准 Docker 镜像。
docker info,超时 5 秒。
3. 无可用运行时
如果两种运行时都未检测到,当设置了working_directory 时,Zeus 拒绝执行任何命令。返回给 Agent 的错误信息为:
“未检测到容器运行时,请安装 Docker Desktop 或升级到 macOS 26 以使用 Apple Containerization。”这是一个刻意的设计选择——没有软隔离回退方案。我们不会尝试通过
cwd 或 shell 技巧来限制路径,因为这些可以被轻易绕过(cd /、符号链接、$HOME 展开等)。
对比:Apple Containerization vs Docker
| 方面 | Apple Containerization | Docker |
|---|---|---|
| 隔离边界 | VM(专属内核) | 命名空间(共享内核) |
| 内核漏洞风险 | 限制在 micro-VM 内 | 可能影响所有容器 |
| 目录共享协议 | virtiofs(原生) | virtiofs(通过 Docker Desktop) |
| macOS 版本要求 | 26+(Tahoe) | 12+ |
| 跨平台 | 仅 Apple Silicon | macOS、Windows、Linux |
| 启动时间 | 不到 1 秒 | 约 1-2 秒 |
| 镜像格式 | OCI | OCI |
| 运行时检测 | container --version | docker info |
容器生命周期
Zeus 为每个会话管理一个容器:- 启动:当第一个带
working_directory的desktop_exec命令到达时,Zeus 检测运行时、创建容器(docker run -d或container run -d),并 bind-mount 目录。 - 执行:后续命令通过
docker exec/container exec发送到运行中的容器。 - 复用:如果该会话的容器已存在且运行中,直接复用。
- 停止:会话结束(或 Desktop 应用关闭)时,容器被移除(
docker rm -f/container rm -f)。
sleep infinity 作为入口点——保持存活直到被显式停止。
沙盒镜像
两种运行时使用同一个 OCI 镜像:zeus-desktop-sandbox:latest。
内容(定义在 apps/desktop/docker/Dockerfile):
- 基础:Ubuntu 22.04
- 语言:Python 3 + pip + venv, Node.js 22 LTS + npm + pnpm
- 工具:git, curl, wget, jq, build-essential (gcc, make 等)
- 工作目录:
/workspace
IMAGE_NAME 常量来扩展。
安全模型总结
Zeus 采用纵深防御,共三层:| 层级 | 机制 | 由谁执行 |
|---|---|---|
| 1. LLM 指令 | 系统提示词声明”仅访问 /workspace” | AI 模型遵循 |
| 2. 容器文件系统 | 仅挂载 /workspace;宿主路径不存在 | 容器运行时(内核) |
| 3. 无回退 | 无容器运行时则完全拒绝执行 | 应用逻辑 |
安装指引
Docker Desktop
- 从 docker.com/products/docker-desktop 下载
- 安装并启动 Docker Desktop
- 验证:在终端运行
docker info——应显示服务器版本和存储驱动 - 构建镜像:
docker build -t zeus-desktop-sandbox:latest apps/desktop/docker/
Apple Containerization(macOS 26+)
- 升级到 macOS 26(Tahoe)或更新版本
containerCLI 随系统附带(Containerization 框架的一部分)- 验证:在终端运行
container --version - 构建镜像:
container build -t zeus-desktop-sandbox:latest apps/desktop/docker/