Grok Build · Sandbox Profiles

五種沙箱 Profile

workspace、devbox、read-only、strict、off 定義檔案系統和子行程網路的不同能力集合。名稱提供方向,真實邊界要看解析後的 capability set。

課程目標

能從 ProfileNameSandboxProfile 判斷讀寫與網路邊界,能正確配置 custom extends,並識別平臺支援與降級條件。

TEACHING DIAGRAM

Profile 是多維能力預設

橫向位置用於幫助記憶。devbox、workspace、strict 的實際差異同時包含預設讀取、可寫路徑與網路策略。

五種 Profile 的教學化能力光譜 offno sandbox devboxbroad writes workspacedefault profile strictallowlisted reads read-onlyno workspace write 更開放更收斂
五種內建 Profile 的原始碼語義
workspace

全檔案系統預設可讀;workspace、GROK_HOME、臨時目錄可寫;不限制子行程網路。

default_read=true
restrict_network=false
devbox

全檔案系統預設可讀;列舉根目錄,除 /data 與虛擬檔案系統外廣泛授予寫權限;網路不限制。

/data 保持可讀,在 Linux 透過 bwrap 做防寫
read-only

全檔案系統預設可讀;workspace 不可寫;GROK_HOME、臨時目錄和必要裝置仍可寫。

restrict_network=true
strict

關閉全域預設讀,只開放系統執行目錄與 workspace;workspace、GROK_HOME、臨時目錄可寫。

default_read=false
restrict_network=true
off

跳過 capability set 應用,記錄「Sandbox disabled」。它也接受別名 none。

不可作為 custom extends 的基類
容易誤讀的兩點:workspace 仍允許讀取工作區外檔案;strict 仍允許寫 workspace。read-only 也保留執行所需的最小寫目錄。課程名稱必須服從原始碼 capability,而不能按字面補全規則。
Custom profile 與配置邊界

extends 規則

  • custom 預設從 workspace 開始。
  • 可 extends workspace、devbox、read-only、strict。
  • 不能 extends off/none。
  • 不能 extends 另一個 custom profile。
  • read_only、read_write、deny 追加到基類。需要限制子行程網路時,應在 custom 中顯式設定 restrict_network=true

全域優先保護

系統先讀取 ~/.grok/sandbox.toml,再讀取 .grok/sandbox.toml。專案配置只能新增 profile 名稱。若專案宣告了全域已存在的同名 profile,merge 使用 entry.or_insert,全域定義保持生效。

crates/codegen/xai-grok-sandbox/src/profiles.rs crates/codegen/xai-grok-sandbox/src/paths.rs ProfileName load_sandbox_config merge_project_profiles
平臺機制與降級條件

檔案系統約束

啟用 enforce 且執行在 Unix 時,nono 將 capability set 應用到 Landlock 或 Seatbelt。macOS deny 使用 Seatbelt 規則;Linux 的子路徑 read-deny 還需要 bwrap bind-over。

網路約束

主行程網路保持開放以存取模型 API。restrict_network 當前透過子行程過濾表達,原始碼中的 seccomp 實現在 Linux 生效,非 Linux 函式為空操作。平臺邊界需要按實際構建與執行環境驗證。

避免絕對化:若平臺不支援、構建未啟用 enforce,或核心層 Sandbox::apply 失敗,原始碼會記錄警告並繼續執行;但能力集與 profile 解析這一步是用 ? 上拋的,失敗時 apply 直接返回 Err,不是靜默降級。所以只有 is_active() 才能反映是否實際應用。因此不能承諾所有環境都「無法繞過」。
真實原始碼快照
crates/codegen/xai-grok-sandbox/src/profiles.rsREAL SOURCE
pub enum ProfileName {
    #[default]
    Workspace,
    Devbox,
    ReadOnly,
    Strict,
    Off,
    Custom(String),
}

快照說明:列舉完整保留。光譜圖用於教學記憶;真實能力來自 resolve()essential_writable_paths() 與平臺 apply 結果。

課堂練習:設計審查專用 Profile

要求能讀倉庫與系統工具、不能改 workspace、允許寫臨時目錄、限制子行程網路,並額外 deny ~/.ssh。選擇一個內建基類,寫出 custom profile 的 extends 與 deny,並解釋專案為何無法替換使用者全域的同名定義。

Takeaway:五種 Profile 是可解析的能力模板。評估安全性要看預設讀、可寫路徑、deny、子行程網路、平臺支援和 apply 狀態;custom 合併規則防止專案悄悄削弱同名全域策略。