設定沙箱原則
一次代理執行是否受沙箱包裹,是在伺服器啟動時決定的(--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 寫入工單 |
| 存取網路 | 允許 | 沙箱是否有網路,以及執行環境的網頁工具 |
- 前往 設定 → 工作區 → 代理權限
- 選擇範圍——工作區、代理或空間——然後在該規則那一列選擇 允許、先詢問或拒絕
限定分支的推送規則,例如拒絕推送到 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
是否開啟。請按這個順序檢查它們。
- 前往 設定 → 伺服器 → 診斷與隱私
- 查看沙盒卡片。主機項目是指執行
cc_server的那部機器,而不是你 正在看的這部機器。後端欄位會列出原生沙盒(macOS 上的 Seatbelt, Linux 與 WSL2 上的 bubblewrap)或無隔離。生效中項目是這部裝置的 偏好,而不是伺服器實際使用的包裹。 - 查看伺服器的啟動日誌。它只會印出以下三行中的一行:
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、發佈或合併、寫入外部追蹤器、安裝套件、執行程序、變更工作區結構、啟動或驅動隔離艙 |
| 審查 | 唯讀 | 同樣這十一項。不能由使用者選擇——輸入區只提供代理、計畫與編排 |
| 編排 | 唯讀 | 同樣這十一項 |
網路存取與機密存取是唯讀模式刻意_不_拒絕的:研究正是唯讀模式存在的全部意義。
要求在動作執行前取得核准
標題為「要求在動作執行前取得核准」的章節核准是一項護欄決策,而不是沙箱設定。
- 前往 設定 → 工作區 → 代理權限
- 在工作區、代理或空間範圍,把該動作類別設為先詢問
一項先詢問決策會中斷該次執行並詢問你。未連接任何核准者時,它會失效即 拒絕,該動作即被拒絕。完整的解析順序請見 設定護欄。
疑難排解
標題為「疑難排解」的章節代理無法推送,而我從未拒絕過它
標題為「代理無法推送,而我從未拒絕過它」的章節看看 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 之下,現在兩種寫法都會被
拒絕)。在沒有後端的主機上,這些全都不適用。無論哪種情況,護欄都能直接拒絕
寫入工作樹之外。
相關指南
標題為「相關指南」的章節- 設定護欄
- 建立並設定代理
- 診斷代理
- 沙箱後端
- cc_server CLI:
--sandbox旗標