Grok Build · Authorization Pipeline

從工具請求到受限執行:完整授權鏈

一次工具呼叫先被解析成具體存取意圖,再經過 plan gate、hooks、策略規則、會話授權、Auto 模式和使用者確認。允許執行後,沙箱繼續約束作業系統能力。

課程目標

能沿真實呼叫鏈定位「誰做了決定」,理解 AccessKind、權限規則、Bash 分段、hooks 與 sandbox 的邊界,避免把授權簡化成 ToolKind 判斷。

TEACHING DIAGRAM

授權決定「能否嘗試」,沙箱限制「執行時能做到什麼」

各階段名稱取自原始碼。策略內部存在短路與優先順序,圖中按主路徑呈現。

從工具解析到沙箱執行和後置 hook 的流程 tool input→ AccessKind plan gateedit policy pre_tool_useexplicit deny blocks permission managerpolicy + grants + auto user promptwhen unresolved sandboxOS capability boundary executepost_tool_use
六段真實鏈路
01 · PARSE

工具輸入轉 AccessKind

ToolInput 會對映為 Read、Edit、Bash、Grep、MCPTool、WebFetch 或 WebSearch,並攜帶路徑、命令、域名或 MCP 名稱等細節。決策輸入比 ToolKind 更具體。

02 · PLAN

Plan mode 先設編輯門

plan_mode_edit_gate 可在傳送權限請求前拒絕修改。計劃檔案存在單獨的自動批准路徑。

03 · HOOKS

PreToolUse 可顯式阻斷

匹配 hooks 按配置順序執行。顯式 deny 立即停止;timeout、崩潰或格式錯誤按當前實現 fail-open,並記錄到 UI 與日誌。隨後還可執行 client hook。

04 · POLICY

載入並評估規則

permission/resolution.rs 合併 requirements、managed settings、managed config、Grok config 與 Claude settings fallback。規則評估與來源順序無關,優先順序為 deny > ask > allow。

05 · DECIDE

多條快速路徑或使用者確認

管理策略 deny 最先短路。隨後依次考慮 yolo pin、session grants、Auto fast path / classifier、sandbox Bash auto、只讀安全項、MCP 與域名授權。仍未決定時才進入 prompt。

06 · ENFORCE

在沙箱能力內執行

Permission Allow 只放行本次請求。若沙箱實際 active,行程仍受 capability set 與子行程網路策略約束。完成後可觸發非阻斷的 post_tool_use hooks。

Bash 命令需要理解腳本結構

bash_command_splitting

tree-sitter-bash 將可安全分解的腳本拆成每個 plain command,識別 &&||、分號與管道。每個非 setup segment 都要獨立透過安全命令、策略或授權檢查,避免 ls && rm 借首段放行。

保守處理複雜語法

wrapper 會遞迴剝離到實際命令;危險前綴含 rm、chmod、chown、kill 與 git push。命令替換、複雜控制流或無法可靠分解的腳本進入保守 prompt。使用者只為完整腳本確認一次。

crates/codegen/xai-grok-workspace/src/permission/resolution.rs crates/codegen/xai-grok-workspace/src/permission/manager.rs crates/codegen/xai-grok-workspace/src/permission/bash_command_splitting.rs crates/codegen/xai-grok-hooks/src/dispatcher.rs PermissionHandle::request dispatch_pre_tool_use
權限層與沙箱層必須分開

權限層:意圖授權

回答「這次工具請求是否允許進入執行」。它讀取 AccessKind、目標細節、組織策略、會話授權、Auto verdict 和使用者選擇。規則可以要求 ask,也可以直接 deny。

沙箱層:能力約束

回答「獲准執行的行程實際能存取哪些檔案和網路」。沙箱 active 時,權限層的 Allow 不會擴大 OS capability;沙箱未應用時,也不能把權限彈窗當成核心隔離。

關鍵校正:「沙箱內所有寫操作自動批准」並非通用規則。原始碼中的 sandbox fast path 專門檢查 Bash,並且受 policy_forced_prompt 與 auto_forced_prompt 約束;Edit 還有自己的會話授權與 edit policy。
真實原始碼快照
crates/codegen/xai-grok-workspace/src/permission/manager.rsREAL SOURCE · abridged
// 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 後沙箱還限制什麼。

Takeaway:完整授權鏈依賴存取語義、腳本結構、配置來源、hook 決策、會話狀態與使用者選擇。權限層負責決策,沙箱層負責約束,兩層疊加才能描述一次工具執行的真實安全邊界。