跳转到主要内容

为什么需要容器隔离?

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

架构总览

Zeus 根据使用方式有两种不同的执行环境:
Web 用户(浏览器)                    Desktop 用户(Electron 应用)
     │                                         │
     ▼                                         ▼
sandbox_mode: "cloud"                 sandbox_mode: "local"
     │                                         │
     ▼                                         ▼
云沙盒                                 本地容器
(E2B / OpenSandbox / Daytona)         (Docker / Apple Containerization)
     │                                         │
     ▼                                         ▼
远程 VM,完全隔离                       本地容器,bind mount
文件存储在远端                          文件保留在你的磁盘上
API 请求中的 sandbox_mode 字段控制走哪条路径:
模式执行环境何时使用
cloud远程云沙盒(E2B / OpenSandbox / Daytona)Web 用户;所有请求的默认值
local你机器上的本地容器Desktop 用户,选择了工作目录时
none完全不执行代码纯对话模式;不注入任何沙盒工具
sandbox_mode"local" 时,云沙盒被完全绕过——不会创建远程 VM,不会注入沙盒工具(write/read/edit/bash)。取而代之的是,Agent 使用通过本地容器路由的 desktop_exec

local 模式端到端流程

以下是 Desktop 用户发送消息(带工作目录)时的完整数据流:
1. 用户选择 ~/Projects/my-app 作为工作目录
2. Desktop 渲染进程设置 sandbox_mode = "local" + working_directory = "~/Projects/my-app"
3. 请求到达 AI Backend(Python)
4. AgentService.invoke() 识别到 sandbox_mode = "local"
   → 跳过云沙盒工具注入
   → 注入系统提示词:"你在 /workspace 中操作,使用 desktop_exec"
5. LLM 决定执行:desktop_exec(command="npm install")
6. Backend 通过 WebSocket 将工具调用发送到 Desktop 应用
7. Desktop actions.ts 收到调用,payload 中包含 working_directory
8. actions.ts 检测容器运行时(Apple Containerization > Docker)
9. 容器启动(或复用已有的),带 bind mount:
   docker run -v ~/Projects/my-app:/workspace ...
10. 命令在容器内执行:docker exec <id> bash -c "npm install"
11. 输出通过 WebSocket → Backend → SSE → UI 返回

系统提示词注入

sandbox_mode == "local" 时,后端会向 Agent 的系统提示词中注入:
## Working Directory (Desktop Local Workspace)
You are operating in the user's local workspace: ~/Projects/my-app
- All commands execute inside an isolated container with this directory mounted at /workspace
- You can ONLY access files within /workspace
- Use desktop_exec for all file operations and shell commands
- Do NOT attempt to access paths outside /workspace
这是一个软约束(LLM 遵循指令)。硬约束是容器运行时本身——即使 LLM 试图访问 /etc/passwd,容器的文件系统中根本不存在这个文件。

容器运行时

Zeus Desktop 启动时按优先级顺序检测运行时,结果会被缓存。

1. Apple Containerization(优先)

适用于 macOS 26+(Tahoe),需要 Apple Silicon。 工作原理: 与 Docker 通过命名空间共享宿主 Linux 内核不同,Apple Containerization 将每个容器运行在独立的 micro-VM 中——一个轻量级虚拟机,拥有专属的 Linux 内核,由 Apple 的 Virtualization.framework 管理。
┌─────────────────────────────────────────┐
│ macOS 宿主机                             │
│                                         │
│  ┌────────────────────────────────────┐ │
│  │ micro-VM (Virtualization.framework)│ │
│  │                                    │ │
│  │  ┌──────────────────────────────┐  │ │
│  │  │ Linux 内核(专属)            │  │ │
│  │  │                              │  │ │
│  │  │ 容器进程                      │  │ │
│  │  │  /workspace ← virtiofs 挂载  │  │ │
│  │  └──────────────────────────────┘  │ │
│  └────────────────────────────────────┘ │
│                                         │
│  ~/Projects/my-app ──virtiofs──┘        │
└─────────────────────────────────────────┘
关键特性:
  • 隔离级别: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 内运行。
┌────────────────────────────────────────────┐
│ macOS 宿主机                                │
│                                            │
│  ┌──────────────────────────────────────┐  │
│  │ Docker Desktop VM(共享 Linux)       │  │
│  │                                      │  │
│  │  容器 A          容器 B              │  │
│  │  /workspace      /workspace          │  │
│  │      ↑               ↑              │  │
│  └──────│───────────────│──────────────┘  │
│         │               │                  │
│  bind mount        bind mount              │
│         │               │                  │
│  ~/Projects/a    ~/Projects/b              │
└────────────────────────────────────────────┘
关键特性:
  • 隔离级别:容器级(命名空间隔离)。所有容器共享 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

方面Apple ContainerizationDocker
隔离边界VM(专属内核)命名空间(共享内核)
内核漏洞风险限制在 micro-VM 内可能影响所有容器
目录共享协议virtiofs(原生)virtiofs(通过 Docker Desktop)
macOS 版本要求26+(Tahoe)12+
跨平台仅 Apple SiliconmacOS、Windows、Linux
启动时间不到 1 秒约 1-2 秒
镜像格式OCIOCI
运行时检测container --versiondocker info

容器生命周期

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
构建方式:
# Docker
cd apps/desktop/docker
docker build -t zeus-desktop-sandbox:latest .

# Apple Containerization
cd apps/desktop/docker
container build -t zeus-desktop-sandbox:latest .
镜像刻意保持精简(约 300MB)。用户可以构建自己的镜像并修改沙盒实现中的 IMAGE_NAME 常量来扩展。

安全模型总结

Zeus 采用纵深防御,共三层:
层级机制由谁执行
1. LLM 指令系统提示词声明”仅访问 /workspace”AI 模型遵循
2. 容器文件系统仅挂载 /workspace;宿主路径不存在容器运行时(内核)
3. 无回退无容器运行时则完全拒绝执行应用逻辑
仅靠第 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/