Skip to main content

为什么需要容器隔离?

当 AI Agent 在你的机器上执行 shell 命令时,它拥有与你用户账户相同的文件访问权限——它可以读取 ~/.ssh、删除 ~/Documents 中的文件、或修改系统配置。这对于生产工具来说是不可接受的。 Zeus 通过容器隔离解决这个问题:当你在 Desktop 中选择一个工作目录后,所有命令都在隔离的 Linux 容器内执行。容器只能看到那一个目录(挂载在 /workspace)。你机器上的其他所有内容都是不可见且不可达的。

架构总览

Zeus 根据使用方式有两种不同的执行环境:
API 请求中的 sandbox_mode 字段控制走哪条路径: sandbox_mode"local" 时,云沙盒被完全绕过——不会创建远程 VM,不会注入沙盒工具(write/read/edit/bash)。取而代之的是,Agent 使用通过本地容器路由的 desktop_exec

local 模式端到端流程

以下是 Desktop 用户发送消息(带工作目录)时的完整数据流:

系统提示词注入

sandbox_mode == "local" 时,后端会向 Agent 的系统提示词中注入:
这是一个软约束(LLM 遵循指令)。硬约束是容器运行时本身——即使 LLM 试图访问 /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。
检测方式:Zeus 执行 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 镜像。
检测方式:Zeus 执行 docker info,超时 5 秒。

3. 无可用运行时

如果两种运行时都未检测到,当设置了 working_directory 时,Zeus 拒绝执行任何命令。返回给 Agent 的错误信息为:
“未检测到容器运行时,请安装 Docker Desktop 或升级到 macOS 26 以使用 Apple Containerization。”
这是一个刻意的设计选择——没有软隔离回退方案。我们不会尝试通过 cwd 或 shell 技巧来限制路径,因为这些可以被轻易绕过(cd /、符号链接、$HOME 展开等)。

对比:Apple Containerization vs Docker

容器生命周期

Zeus 为每个会话管理一个容器:
  1. 启动:当第一个带 working_directorydesktop_exec 命令到达时,Zeus 检测运行时、创建容器(docker run -dcontainer run -d),并 bind-mount 目录。
  2. 执行:后续命令通过 docker exec / container exec 发送到运行中的容器。
  3. 复用:如果该会话的容器已存在且运行中,直接复用。
  4. 停止:会话结束(或 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
构建方式:
镜像刻意保持精简(约 300MB)。用户可以构建自己的镜像并修改沙盒实现中的 IMAGE_NAME 常量来扩展。

安全模型总结

Zeus 采用纵深防御,共三层: 仅靠第 1 层是不够的(LLM 可能产生幻觉或被越狱)。第 2 层提供硬边界。第 3 层确保我们永远不会降级到不安全状态。

安装指引

Docker Desktop

  1. docker.com/products/docker-desktop 下载
  2. 安装并启动 Docker Desktop
  3. 验证:在终端运行 docker info——应显示服务器版本和存储驱动
  4. 构建镜像:docker build -t zeus-desktop-sandbox:latest apps/desktop/docker/

Apple Containerization(macOS 26+)

  1. 升级到 macOS 26(Tahoe)或更新版本
  2. container CLI 随系统附带(Containerization 框架的一部分)
  3. 验证:在终端运行 container --version
  4. 构建镜像:container build -t zeus-desktop-sandbox:latest apps/desktop/docker/