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 合併規則防止項目悄悄削弱同名全局策略。