05. 权限、计划与安全

沙箱

沙箱是可选的操作系统级隔离,包住 Matcha CLI 进程和它启动的命令。权限决定模型可以请求什么。沙箱决定请求被批准之后,进程实际能做什么。

启动时生效

off 的配置档在启动时应用到整个进程(Linux 上是 Landlock,macOS 上是 Seatbelt)。对该进程不可撤销。助手之后不能放宽它。子进程继承文件系统限制。

默认是关。你主动打开。

内置配置档

配置档文件系统读文件系统写子进程网络典型用途
off(默认)不限制不限制不限制可信机器,不隔离
workspace任意位置当前工作目录 + ~/.matcha/ + 临时目录允许日常开发
devbox任意位置顶层目录,除 /data(以及 /proc/sys/dev允许一次性虚拟机
read-only任意位置~/.matcha/ + 临时目录Linux 上拦截审阅、探索
strict当前工作目录 + 系统路径当前工作目录 + ~/.matcha/ + 临时目录Linux 上拦截不信任的目录树

临时目录包括 /tmp/var/tmp,以及 macOS 上 /private/var/folders 下真实的 TMPDIR。子进程网络拦截只用 Linux 上的 seccomp。macOS 上 restrict_network 是空操作。

workspaceread-onlystrict 会拒绝写入用户全局钩子来源(~/.matcha/hooks/~/.matcha/hooks-paths,以及其中列出的绝对目标),以免沙箱会话改写那些钩子。devbox 不施加这项保护。

自定义配置档

自定义配置档写在 ~/.matcha/sandbox.toml.matcha/sandbox.toml。它们 extends 一份内置配置档,再加 read_onlyread_writerestrict_network,以及内核强制的 deny 列表(如 **/.env 这类 glob)。自定义名不能占用内置名:--sandbox devbox 永远跑内置的。若用户文件和项目文件用同一自定义名却定义不同,用户文件胜出,启动时会警告;/doctor 会显示两条路径。

请求非 off 配置档时,助手留在本进程(没有共享 leader)。matcha workspace start / restart / resume 不可用;pausestopstatus 仍可用。

内置配置档无法生效时(内核过旧、缺少 entitlements)会警告并无强制地继续,但仍拒绝 leader。自定义配置档无法生效时(未知名称、损坏的 sandbox.toml,或 Linux deny 没有 bubblewrap)会拒绝启动。

配置档随会话保存。恢复会话会还原它。恢复时 --sandbox 必须与保存的配置档一致,否则 Matcha CLI 报错;要改隔离,请开新会话。

什么时候用

希望助手能读系统、但只写这个项目和 Matcha CLI 自己的主目录时,用 workspace。面对不信任的目录树,用 read-onlystrict。助手必须装包或写到工作目录之外时,跳过沙箱。

权限加上沙箱比单独用任何一项都更强:拒绝规则拦住模型去请求;内核拦住仍试图动手的进程。

用配置档启动

matcha --sandbox workspace
matcha --sandbox read-only
matcha --sandbox strict

MATCHA_SANDBOX 选择同一份配置档(GROK_SANDBOX 是已登记的别名)。新会话的解析顺序:

  1. 钉死配置档的托管要求
  2. --sandbox / MATCHA_SANDBOX
  3. 配置里的 [sandbox] profile
  4. off

自定义配置档示例

# ~/.matcha/sandbox.toml
[profiles.project]
extends = "workspace"
restrict_network = true
read_only = ["/data"]
read_write = ["/tmp/scratch"]
deny = ["/data/shared-secrets", "**/.env", "**/*.pem"]
matcha --sandbox project

*?[deny 项是 glob。macOS 上在运行时匹配(之后创建的文件仍能命中)。Linux 上在启动时展开——之后才出现的匹配不覆盖;Linux 必须严密时请写确切路径。两边都不支持的 glob 语法会拒绝启动。

恢复会话

matcha --continue
matcha --resume <id>

省略 --sandbox 以保留保存的配置档。传入不同的配置档会被拒绝。

Shell 环境

[shell_environment_policy] 过滤工具命令继承的变量,以免你 shell 里的密钥漏进子进程。这相关,但不是内核沙箱。默认是不动环境(inherit = "all")。

事件

违规和配置档已应用的记录写入 ~/.matcha/sandbox-events.jsonl