こんにちは!我是哥倫比亞大學博士課程、研究 AI 與資安的 Koukyosyumei。

那麼,我想大多數讀者都是使用 Claude Code 或 Codex 來開發的吧;大家對於「AI agent 在執行 shell 指令或網路存取時,是如何確認安全性」這件事,理解到什麼程度呢?

Agent 雖然能自動完成各種工作,但也可能不小心刪除檔案、把機密資訊傳送到外部,或執行會大量消耗 CPU 資源的低效率程式。

當然,Claude Code 和 Codex 都內建了用來安全執行 agent 的 sandbox 機制。此外,像是 h5idocker-agent 這類更高性能、面向 agent 的 sandbox 也逐漸受到關注。

本文將解說 Claude Code 與 Codex 內建 sandbox 功能的運作方式,並進一步說明更高性能的 sandbox——h5i 的簡單使用方法。

Claude Code 的沙盒

Claude Code 可以將 OS 層級的沙盒功能(Bubblewrap、socat、seccomp 等等)套用到 Bash Tool 上。至於 Read、Write、WebFetch 等其他工具,則透過適時向使用者確認的 permission model 來確保安全性。

這些沙盒設定可以在 settings.jsonsandbox block 中決定,並能針對各個 Bash Tool 設定允許的指令、排除的指令、是否可存取網路、憑證的處理方式等。

{
  "sandbox": {
    "enabled": true,
    "network": {
      "tlsTerminate": {},
      "allowedDomains": ["*.github.com", "registry.npmjs.org"]
    },
    "credentials": {
      "envVars": [
        { "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
        { "name": "NPM_TOKEN", "mode": "mask" }
      ]
    }
  }
}

另外,也可以在 permissions block 中,針對各工具靜態定義 allow / ask / deny 規則。

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)",
      "Bash(git * main)",
      "Bash(* --version)",
      "Bash(* --help *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

Codex 的沙盒

在 Codex 中,會結合兩種原則:決定「允許什麼」的 sandbox policy,以及決定「要向誰詢問」的 approval policy,並使用 OS 層級的沙盒來執行所有指令。

sandbox policy 提供以下三種模式:

  • read-only:可以讀取整個磁碟,但不能寫入,也不能存取網路
  • workspace-write:可以對目前目錄、/tmp 等位置進行寫入
  • danger-full-access:允許更大範圍的存取模式。

approval policy 例如有以下三種選項:

  • on-request:預設模式,當模型判斷有需要時,會向使用者請求核准。
  • never:一律拒絕需要提升權限的請求。
  • granular:可對特定請求進行拒絕等更細緻的設定。

h5i

h5i 是一套可用更高自由度設定更廣範圍的沙盒工具。Claude Code 和 Codex 基本上是專注於判斷個別指令是否可執行,而 h5i 則是分離工作環境本身。

具體來說,透過 h5i env 指令,可以建立一個在 OS 層級沙盒中隔離的專用 Git worktree。除了 Claude Code 和 Codex 所具備的系統呼叫層級限制與資料夾存取限制之外,還能設定記憶體、程序數量等資源限制。此外,也能彈性設定以網域為單位的存取允許與否,以及憑證在不同環境之間的分離等。

安裝

curl -fsSL https://raw.githubusercontent.com/h5i-dev/h5i/main/install.sh | sh

初始化

h5i init
h5i hook setup --write --wrap-bash

建立沙盒環境

h5i env create claude-env --profile agent-claude
h5i env shell claude-env
box$ claude --dangerously-skip-permissions
box$ exit

h5i env diff claude-env      # 檢查環境內的變更
h5i env propose claude-env   # 提出環境內的變更
h5i env apply claude-env     # 將提議的變更套用回原始分支

h5i env 的預設模式 supervised 模式,不使用像 docker 這類較重的容器,而是透過結合系統呼叫監控與 namespace 設定來實現輕量級的沙盒環境,因此只要約 0.2~3 秒就能進入沙盒內的 shell。

在這個環境中,即使 agent 因為提示注入攻擊、幻覺或其他原因而誤作動,也能避免對原始環境造成破壞性變更,或防止機密資訊外洩等事故。此外,h5i 以「可稽核的工作區」為標語,環境內執行過的指令、其結果、使用者提供的提示等都會被完整記錄,之後也可以加以驗證。

參考


原文出處:https://qiita.com/Koukyosyumei/items/3bd4696237ea64c38971


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝17   💬3   ❤️5
735
🥈
我愛JS
📝3   💬6   ❤️4
165
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登