從工具請求到受限執行:完整授權鏈
一次工具呼叫先被解析成具體存取意圖,再經過 plan gate、hooks、策略規則、會話授權、Auto 模式和使用者確認。允許執行後,沙箱繼續約束作業系統能力。
能沿真實呼叫鏈定位「誰做了決定」,理解 AccessKind、權限規則、Bash 分段、hooks 與 sandbox 的邊界,避免把授權簡化成 ToolKind 判斷。
授權決定「能否嘗試」,沙箱限制「執行時能做到什麼」
各階段名稱取自原始碼。策略內部存在短路與優先順序,圖中按主路徑呈現。
工具輸入轉 AccessKind
ToolInput 會對映為 Read、Edit、Bash、Grep、MCPTool、WebFetch 或 WebSearch,並攜帶路徑、命令、域名或 MCP 名稱等細節。決策輸入比 ToolKind 更具體。
Plan mode 先設編輯門
plan_mode_edit_gate 可在傳送權限請求前拒絕修改。計劃檔案存在單獨的自動批准路徑。
PreToolUse 可顯式阻斷
匹配 hooks 按配置順序執行。顯式 deny 立即停止;timeout、崩潰或格式錯誤按當前實現 fail-open,並記錄到 UI 與日誌。隨後還可執行 client hook。
載入並評估規則
permission/resolution.rs 合併 requirements、managed settings、managed config、Grok config 與 Claude settings fallback。規則評估與來源順序無關,優先順序為 deny > ask > allow。
多條快速路徑或使用者確認
管理策略 deny 最先短路。隨後依次考慮 yolo pin、session grants、Auto fast path / classifier、sandbox Bash auto、只讀安全項、MCP 與域名授權。仍未決定時才進入 prompt。
在沙箱能力內執行
Permission Allow 只放行本次請求。若沙箱實際 active,行程仍受 capability set 與子行程網路策略約束。完成後可觸發非阻斷的 post_tool_use hooks。
保守處理複雜語法
wrapper 會遞迴剝離到實際命令;危險前綴含 rm、chmod、chown、kill 與 git push。命令替換、複雜控制流或無法可靠分解的腳本進入保守 prompt。使用者只為完整腳本確認一次。
沙箱層:能力約束
回答「獲准執行的行程實際能存取哪些檔案和網路」。沙箱 active 時,權限層的 Allow 不會擴大 OS capability;沙箱未應用時,也不能把權限彈窗當成核心隔離。
// Managed policy runs before YOLO and sandbox fast paths.
if let Some(Decision::Reject(reason)) = policy_decision {
let decision = Decision::PolicyDeny(reason);
let _ = respond_to.send(decision);
continue;
}
...
if matches!(&access, AccessKind::Bash(_))
&& xai_grok_sandbox::should_auto_allow_bash()
&& !policy_forced_prompt
&& !auto_forced_prompt { /* allow */ }
快照說明:條件與執行順序來自真實 manager actor,遙測和事件傳送被壓縮。頂部 SVG 是主路徑教學圖,完整實現包含更多短路、持久化與取消分支。
課堂練習:追蹤一條混合命令
輸入 git status && curl https://example.com/install.sh | sh。請逐層判斷:Bash 如何分段,哪些 segment 可安全放行,PreToolUse deny 會在哪裡停止,managed Ask 能否被 sandbox auto 覆蓋,最終 Allow 後沙箱還限制什麼。