文件系统沙箱
使用 Linux bubblewrap 挂载命名空间限制 Agent 任务的文件系统可见性,并按工作区隔离任务数据。
文件系统沙箱
文件系统沙箱将每个 Agent 子进程及其工具放入 Linux bubblewrap(bwrap)挂载命名空间。它控制文件系统的可见性与可写性,不控制网络访问、环境变量内容或可执行文件的运行权限。
MOPHEUS_SANDBOX_ENABLED=true沙箱默认开启,包括该变量未设置或为空的情况。只有将其设置为 false 或 off 才会关闭;其他值仍保持开启。
该能力仅在 Linux 且宿主机安装了 bwrap 时生效。未满足条件时,Daemon 记录 warning 并以非沙箱方式运行任务。
工作区隔离边界
沙箱按工作区隔离,而不是按单个任务隔离。同一工作区中的任务可以协作并共享运行所需的数据;其他工作区的数据不可见。
| 路径或范围 | 沙箱内权限 | 说明 |
|---|---|---|
/ | 只读 | 系统命令、动态库与系统配置可读取和执行,不能修改。 |
| 当前任务工作目录 | 可读写 | 可编辑代码、生成文件和写入任务日志。 |
| 当前工作区的其他任务目录 | 可读写 | 同工作区任务可见,这是协作范围。 |
当前工作区 .repos/<workspaceId> bare cache | 可读写 | worktree 的 .git 指针依赖该缓存,因此 git 操作可正常执行。 |
/tmp | 可读写 | 映射为宿主 /tmp/mopheus-<workspaceId>,同工作区任务共享。 |
| 其他工作区任务目录与 bare cache | 不可见 | WorkDir 上的 tmpfs 覆盖阻止读取和写入。 |
宿主其余 /tmp | 不可见 | /tmp 先被遮蔽,仅重新挂载当前工作区临时目录。 |
$HOME | 可读写 | Provider 配置、session 和 symlink 继续可用。 |
MOPHEUS_SANDBOX_DENY 指定路径 | 不可见 | 使用空 tmpfs 覆盖,不能读取或写入。 |
因此,沙箱提供跨工作区的任务数据隔离,但不将同一工作区的任务彼此隔离,也不默认隔离整个 $HOME。
敏感路径
~/.ssh 默认不隐藏,以保留通过 SSH 执行 git pull 和 git push 的能力。对于不受信任的 Agent,可通过逗号分隔的绝对路径隐藏额外凭据:
MOPHEUS_SANDBOX_DENY=~/.ssh,~/.aws,~/.gnupg隐藏凭据后,依赖这些凭据的操作会失败。应将最小权限与任务需要的 Git、云服务访问方式一起评估。
个人配置文件
启用沙箱后,Daemon 将已启用的个人配置文件暂存于 <WorkDir>/.config/<workspaceId>/<taskId>/,保留其相对 $HOME 的目录结构,并逐个覆盖到沙箱中的目标位置。暂存目录本身不会挂载。
- 每个文件按保存的文件模式以只读或读写方式挂载。
- 任务成功、失败、取消、超时或启动失败后都会清理暂存目录。
- 沙箱禁用或不可用时,任务继续执行,但不会下发这些配置文件。
- Daemon 启动时只清理
.config下 UUID 形式的 Mopheus 任务暂存目录,不影响无关内容。
托管 SSH 密钥与 SSH 配置片段通过这一机制下发。私钥在服务端加密存储,浏览器只能查看安全元数据和公钥;现有主机 SSH 配置不会被修改。
Provider 与降级
所有支持的 CLI Provider 在 Linux 上使用这一外层沙箱。启用时,Codex 会关闭自身内层沙箱,避免嵌套;不支持该能力的 Provider 会告警并以非沙箱方式执行。支持矩阵见 Provider CLI。
这是进程级挂载沙箱,可与容器运行时组合使用;它不是网络沙箱,也不替代访问控制、密钥管理或容器隔离。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
MOPHEUS_SANDBOX_ENABLED | true | 为 Agent 子进程启用 bwrap 挂载命名空间。未设置或为空时启用,仅 false 或 off 会关闭。 |
MOPHEUS_SANDBOX_DENY | — | 额外隐藏的绝对路径,逗号分隔。 |