Skip to content
FunCoding

Search

Search docs, Skills and MCP

Git 位置检查与外部 Tool Guard

理解内置 Git 误操作检查及外部执行前裁决的覆盖范围。

This page has not been translated into English yet. The original Chinese version is shown below.

托管 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=3000

endpoint 只能是 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。