跳到內容

設定沙箱原則

一次代理執行是否受沙箱包裹,是在伺服器啟動時決定的(--sandbox)。 啟用沙盒開關與 設定 → 伺服器 → 診斷與隱私 下的後端選擇器,都是 儲存在你裝置上的偏好設定。沙盒卡片的主機偵測所報告的,只是伺服器主機能夠 包裹什麼。

有兩個控制項能觸達一次執行,本指南兩者都會說明:設定 → 工作區 → 代理權限 中的動作規則——它們決定代理可以推送、開啟或存取什麼——以及伺服器自己的 --sandbox 旗標。

有六樣東西在約束代理。第一樣是作業系統沙箱,也是唯一有條件的一樣—— 其餘五樣在每部主機上都成立。

界線 它的作用
作業系統沙箱 macOS 上是 Seatbelt,Linux 與 WSL2 上是 bubblewrap。包裹 Claude Code CLI、ACP 配接器與執行環境的 bash 工具。在 Windows 上,以及缺少 bwrap 和 socat 的 Linux 上缺席
它自己的工作樹 每則對話都會取得一份寫入時複製的簽出。原始簽出會以拒絕寫入路徑的形式併入該次執行,而真正強制執行它的是沙箱
經仲介的憑證 憑證仲介會為每次執行簽發一份環境,並在拆除時撤銷它。其中的 GitHub 權杖可以讀取但不能推送:推送會經由 Control Center,它會先詢問推送規則
動作護欄 每個會變更狀態的工具都會宣告自己的效果類別,而護欄會在呼叫執行之前解析它們。未連接核准者時,prompt 會被拒絕
環境清理 ACP 與執行環境的 bash 工具會得到一個過濾後的環境。經由 NoSandboxAdapter 的 Claude Code 則會繼承主機環境
模式的工具介面 唯讀模式會直接移除會改動工作樹的工具,並釘住該模式自己的輸出動詞,使它仍能交付

有三件事比它們看上去更弱:

  • 只有內建執行環境會強制執行工具閘門、完成契約與結構性模式規則。 Claude Code 配接器不會。Claude Code 尤其是以 --dangerously-skip-permissions 啟動的,因為非互動式的 claude -p 否則 會永遠卡在自己的提示上——所以 Claude 自己的 read、write 與 edit 呼叫, 既不會被 Control Center 看見,也不受它閘控,bash 命令也只由一個讀取命令列 的鉤子檢查。沙箱開啟的地方,它就是圍住它們的界線。
  • 執行環境的行程內檔案工具(read、write、edit、apply patch、search、 find、search_files)在伺服器行程內執行,因此沒有任何沙箱設定檔約束它們。 只有 bash 工具會經過受沙箱包裹的命令執行器。這些工具的界線,是它們自身 的路徑限制加上動作護欄。
  • 在沒有後端的主機上,第一列完全不適用。ACP 與執行環境的 bash 工具會退回 環境清理加上命令政策;Claude Code 則經由 NoSandboxAdapter 繼承主機環境。 伺服器會在其啟動日誌中說明這一點。請在下面檢查你自己的情況。

git push、GitHub、工單與網路都沒有依代理設定的開關。每一項都是一條動作規則:

規則 內建預設 涵蓋內容
推送到遠端 先詢問 每一次推送到 GitHub 的 git push,無論使用哪個配接器
開啟 pull request 先詢問 gh pr create 以及 pull request 工具
發佈審查或合併 先詢問 gh pr merge、gh pr review、gh pr comment、gh pr close
寫入外部追蹤器 先詢問 透過 Control Center 工具與 gh issue 寫入工單
存取網路 允許 沙箱是否有網路,以及執行環境的網頁工具
  1. 前往 設定 → 工作區 → 代理權限
  2. 選擇範圍——工作區、代理或空間——然後在該規則那一列選擇 允許、先詢問或拒絕

限定分支的推送規則,例如拒絕推送到 main 的規則,同樣生效:請參見 護欄。

檢查點:請代理推送一個分支。設為先詢問時,你會收到一則寫明儲存庫與 ref 的 核准請求;設為拒絕時,git 會印出 ! [remote rejected] <ref> (Control Center policy: …)。

每條規則如何作用於執行:

  • 推送是靠執行手中持有什麼來強制執行。它的 GitHub 權杖是唯讀的 GitHub App 安裝權杖,能讀取內容並處理 pull request。它的 git 設定會把每一次 GitHub 推送 送往 cc_server 上的回送閘道,閘道先詢問規則,然後才用代理永遠看不到的寫入 權杖轉送推送。閘道只會轉送到工作樹自己的儲存庫,或與工作區連結的 GitHub 儲存庫。這對每個配接器都成立。
  • 來自 shell 的 pull request 與 issue 會透過命令列被辨識:在執行環境的 bash 工具中,以及經由鉤子在 Claude Code 的 Bash 工具中。隱藏命令的代理 (腳本、eval、直接呼叫 API)能繞過這項檢查,但繞不過推送閘道。
  • 工單金鑰從不放入沙箱。代理透過 Control Center 的 MCP 工具寫入工單,這些 工具會詢問規則。
  • 網路會在執行開始時解析一次。拒絕會關閉沙箱的網路;允許與先詢問 會讓它保持開啟,而在先詢問下,執行環境的 web_fetch 和 web_search 工具 仍會在每次呼叫時詢問。只要網路開啟,GitHub 就一律在對外允許清單中。

有兩件事決定它,而且兩件都在伺服器上:主機是否提供後端,以及 --sandbox 是否開啟。請按這個順序檢查它們。

  1. 前往 設定 → 伺服器 → 診斷與隱私
  2. 查看沙盒卡片。主機項目是指執行 cc_server 的那部機器,而不是你 正在看的這部機器。後端欄位會列出原生沙盒(macOS 上的 Seatbelt, Linux 與 WSL2 上的 bubblewrap)或無隔離。生效中項目是這部裝置的 偏好,而不是伺服器實際使用的包裹。
  3. 查看伺服器的啟動日誌。它只會印出以下三行中的一行:
    • agent sandbox ON 加上後端備註——執行會受包裹
    • no OS-native agent sandbox on this host 加上安裝提示(如有)——執行 不受包裹
    • agent sandbox DISABLED by --sandbox off——刻意的退出

GET /healthz 不會回報沙箱狀態,因此啟動日誌才是檢查手段。

要有意關閉沙箱——某些主機上的設定檔會出問題,正是這個開關存在的理由—— 請以 --sandbox off 啟動伺服器,或設定 CC_SERVER_SANDBOX=off。預設值是 on,而 on 的意思是「主機有後端就用一個」,絕不是「必須有一個」。

有兩種情況永遠不會得到原生沙箱的包裹。在 Windows 上,原生探測一律回報 不可用,也沒有任何東西可安裝——代理派送會使用 none。microvm 後端是另一 回事(互動式終端機與機台),並依它自己的執行階段進行探測閘控。在 Linux 與 WSL2 上,bwrap 和 socat 都必須位於 PATH 上;缺少它們時, 探測會回報不可用,並指出缺少的套件。

在已安裝 bubblewrap 的 Linux/WSL2 上,對於代理之後才建立的檔案,標準原則的 機密檔案 glob 無法強制執行。這類原生執行現在會失敗,而不是悄然忽略這些 規則。因此,開機探測通過並不保證 Linux 上的派送一定能啟動。 --sandbox off 是一次刻意的無約束退出,而不是替代性的資安邊界。

模式按空間儲存,並以模式預設層的身分饋入護欄解析器。四種模式中有三種是 唯讀的,而唯讀模式會直接拒絕十一種效果類別:

模式 工作樹 由預設拒絕的
代理(chat) 可寫入 無——內建預設值適用
計畫 唯讀 刪除檔案、寫入工作樹之外、提交、推送、開啟 PR、發佈或合併、寫入外部追蹤器、安裝套件、執行程序、變更工作區結構、啟動或驅動隔離艙
審查 唯讀 同樣這十一項。不能由使用者選擇——輸入區只提供代理、計畫與編排
編排 唯讀 同樣這十一項

網路存取與機密存取是唯讀模式刻意_不_拒絕的:研究正是唯讀模式存在的全部意義。

核准是一項護欄決策,而不是沙箱設定。

  1. 前往 設定 → 工作區 → 代理權限
  2. 在工作區、代理或空間範圍,把該動作類別設為先詢問

一項先詢問決策會中斷該次執行並詢問你。未連接任何核准者時,它會失效即 拒絕,該動作即被拒絕。完整的解析順序請見 設定護欄。

看看 git 印出了什麼。Control Center policy: … 表示某條規則拒絕了這次推送,或 一個先詢問沒有得到回應。… is not linked to this workspace 表示推送目標既 不是工作樹自己的儲存庫,也沒有與工作區連結。 Control Center has no GitHub credential that can push … 表示該儲存庫沒有安裝 GitHub App,也沒有能推送的回退憑證:在該儲存庫上安裝這個 App,或連接 GitHub。

那麼該主機上的代理執行就不會被 Seatbelt 或 bubblewrap 包裹,剩下那些界線 就是你全部的依靠。在 Linux 與 WSL2 上,安裝兩個缺少的工具—— sudo apt-get install bubblewrap socat——然後重新啟動伺服器;啟動日誌隨後 應顯示沙箱已開啟。在 Windows 上沒有原生後端可安裝,因此請改為收緊護欄: 參見設定護欄。

是哪個工具觸及它,決定了這是否在預期之內。

執行環境的行程內檔案工具(read、write、edit、apply patch、search、find、 search_files)在伺服器行程內執行,因此沒有任何沙箱設定檔適用於它們—— 它們的界線是自身的路徑限制加上護欄。在有後端的地方,bash 命令或 Claude Code CLI 會 受包裹,而在任何模式下,你已註冊的簽出在那層包裹內 都是拒絕寫入的,包括它們經符號連結解析後的寫法(在 macOS 上,經由 /tmp 或 /var/folders 抵達的路徑會解析到 /private 之下,現在兩種寫法都會被 拒絕)。在沒有後端的主機上,這些全都不適用。無論哪種情況,護欄都能直接拒絕 寫入工作樹之外。