安全
每个模型生成的工具调用先分类,再由 ApprovalPolicy(Crystal.Tools.ToolInvocationPolicy)决定。副作用不会绕过该执行器。
风险是 read、write、privileged 或 forbidden。权限是 workspace、outside_workspace、network 或 privileged_escalation。
什么可以不经提示放行
Section titled “什么可以不经提示放行”调用只有在以下全部成立时才无需审查即放行:
- 分类不要求提示。
- 风险不是 Forbidden 或 Privileged。
- 权限是 Workspace。
- 工具在自动工具集中,或风险是 Read,或风险是 Write 且审批模式允许该写入。
| 模式 | 什么会自动放行 |
|---|---|
| Full | 通过上述检查的任何 Workspace 写入,包括保持 Write + Workspace 的外部工具。Bash、bash_start 和 bash_stop 仅当被分类为 Workspace 写入 |
| Edit、Review | 只有内置 write 和 edit |
| Default | 不自动放行写入 |
网络、特权或禁止的命令不会自动放行。Forbidden、Privileged、工作区外和网络权限从不完全自动放行。分类不允许可复用授权时,该授权被跳过。
Review 可以允许一次调用。Forbidden 分类或必需的提示仍会回到你。审查者对 Forbidden 的 Allow 不会执行。
未知工具名,包括没有任何插件分类器认领的名称,是 Privileged,权限为 PrivilegedEscalation,摘要为 Unknown tool。
任一片段是 .ssh 或 .gnupg(不区分大小写),或 .crystal 紧接着 credentials.json 时,该路径是凭据路径。先展开 ~。检查在参数上跑一次,再在解析后的完整路径上跑一次。
这些路径对 read、list、tree、glob、grep、search、describe_image、view_image、write 和 edit 是 Forbidden / PrivilegedEscalation。目录遍历跳过解析目标是凭据路径的文件。会话目录规则不能授予它。导出拒绝它。
缺失或无法解析的路径不会变成 Forbidden。无法读取的必需 path 是工作区读取。路径无法解析,或工作区无法规范化的写入或编辑,是工作区写入。规范化后位于可访问会话目录之外的路径是带 OutsideWorkspace 的 Read 或 Write,不会自动放行。
Shell 命令
Section titled “Shell 命令”bash 和 bash_start 使用同一个分类器。匹配不区分大小写。超过一秒的匹配视为命中,因此超时会失败关闭。
| 类别 | 模式 | 风险 | 权限 |
|---|---|---|---|
| Forbidden | \bsudo\b |
forbidden | privileged_escalation |
| Forbidden | 同时带递归和强制标志、目标为 /、~、$HOME 或 ${HOME} 的 rm |
forbidden | privileged_escalation |
| Forbidden | 管道到 sh 或 bash 的 curl 或 wget |
forbidden | privileged_escalation |
| Forbidden | 带 -f 或 --force 的 git push |
forbidden | privileged_escalation |
| Forbidden | 命令文本中的 .ssh、.gnupg 或 .crystal/credentials.json 路径 |
forbidden | privileged_escalation |
| Privileged | chmod 777、chown、mkfs、dd 、kill -9、shutdown、reboot |
privileged | privileged_escalation |
| Network | 尚未被禁止时的 curl、wget、ssh、scp、nc、nmap |
write | network |
| Other | 任何其他非空命令 | write | workspace |
先测 Forbidden,再测特权,再测网络。什么都不匹配,或无法从参数读取的命令,是名为 Workspace shell command 的工作区写入。
bash_status 和 bash_logs 是工作区读取(Read background shell task)。bash_stop 是工作区写入(Stop background shell task),不按命令字符串重新分类。
- 不允许离开根的工作区工具会拒绝离开它的路径。可读工具可以解析外部路径,然后把它分类为 OutsideWorkspace。
- 写入或编辑只读会话目录会在分类之前被拒绝:
Writing to a read-only session directory is not allowed. Change its access with /access. - 在 Plan 中,
edit、write、bash、bash_start和bash_stop在分类之前被拒绝:Plan mode does not allow <name>. - 插件钩子可以提高审批风险,不能降低。原始钩子不受该限制,并在加载时被点名。见插件。
- 运行时文本是纯英文。异常、日志和界面装饰中没有表情符号。
- 秘密不得出现在源码、日志、诊断或提交中。
credentials.json在 Unix 上是所有者读写(0600)。Windows 不改变文件 ACL。