從工具請求到受限執行:完整授權鏈
一次工具調用先被解析成具體存取意圖,再經過 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 之後沙箱仲限制咩。