Git 位置检查与外部 Tool Guard
理解内置 Git 误操作检查及外部执行前裁决的覆盖范围。
托管 daemon ACP 会话有内置 Git relocation guard;外部 Tool Guard 则是另一个默认关闭、需专门服务的执行前裁决机制。两者都不能替代操作系统沙箱。
内置 Git 位置检查
内置检查针对 run_shell_command 和 monitor 中的 Shell 文本。若改变仓库位置的 Git 修改命令解析到会话有效目录之外,会在执行前拒绝;固定到 worktree 的 subagent 以自己的 worktree 为界。
识别范围包括字面的 git -C、--git-dir、--work-tree、相关 GIT_DIR/GIT_WORK_TREE/GIT_COMMON_DIR/GIT_INDEX_FILE 环境赋值、env -C、sudo -D,以及链中 cd/pushd/popd。常见包装命令和命令替换会展开分析,路径解析涵盖 symlink、.git gitfile 和 worktree 管理目录。
带 relocation 的目标若不能完整解析,连只读子命令也拒绝。解析成功的少量已核验只读命令,如 rev-parse、cat-file,可通过;但带执行型 -c、--output、--textconv、--filters 时仍有副作用限制。没有识别到 relocation 的命令保持原行为。
这是防字面误定位的尽力检查,不是对恶意 Shell 的安全边界。它不解释脚本文件、不跨命令追踪变量,也不解析 heredoc 语义;甚至可能拒绝 heredoc 中看似 Git 的非执行文字。无法确定执行目录或解析命令时会拒绝,并向模型提供 guard 错误。
外部 provider
启用 required 时,先部署符合协议的本机 provider,并提供独立秘密:
export QWEN_CODE_EXTERNAL_TOOL_GUARD_TOKEN='replace-with-local-secret'
qwen serve \
--external-tool-guard-mode=required \
--external-tool-guard-endpoint=http://127.0.0.1:8787 \
--external-tool-guard-timeout-ms=3000endpoint 只能是 origin 形式的 loopback HTTP(S),不接受路径、URL 凭据、重定向、非本机主机或代理路由。timeout 默认 3000 毫秒,范围 100–30000,分别约束启动握手和每次 prepare。
provider 实现 POST /v1/handshake 与 POST /v1/prepare,验证 bearer、使用协议版本 1 并回显 nonce/requestId。token 非空、最多 8192 UTF-16 code units、无控制字符;请求最多 1 MiB,响应最多 64 KiB,拒绝原因最多 500 UTF-16 code units 且无控制字符。
{ "protocolVersion": 1, "requestId": "<echo>", "allowed": true }裁决顺序与失败
原权限及 PreToolUse 通过后,执行器边界只发送一次 prepare,不重试;内置 Git 检查也先于外部裁决。超时、取消、传输失败、格式或关联 ID 错误、明确拒绝都会阻止执行。ACP child 还必须确认已安装 required callback,否则不能创建 Session。
请求带 sessionId、promptId、toolCallId、canonical toolName 和最终 arguments;toolCallId 只是关联标签,不是认证身份或独立幂等键。arguments 可能含敏感数据,provider 日志应按相同数据权限处理。
成功握手后才公布 external_tool_guard capability。off 不调用 provider,也不公布此能力。
覆盖边界
v1 只覆盖活动前台 managed Prompt 的顶层工具。required 模式拒绝嵌套或委派的 agent、workflow、create_sub_session、send_message、直接 /fork,以及 agent 驱动的工作区记忆 remember/dream。
顶层后台 Shell/monitor 启动仍是一条受控调用,但不会持续授权进程或审计最终完成;需要此前提的 provider 应拒绝相应形状。受控 MCP 调用在传输失败后也禁用自动重连重放。
PreToolUse hooks、斜杠命令动作在此边界之前运行,不受这次 provider 裁决授权或隔离。需要覆盖所有副作用的部署,应分别治理 hooks,并用 slashCommands.disabled 或 --disabled-slash-commands 限制未批准命令。显式 REST/ACP 管理调用仍遵守自己的认证契约,不属于模型工具 Guard。