以 sandbox 隔離 AI 代理,是把不受信任或由模型生成的程式碼放在範圍受限的環境中執行,並明確控制檔案系統、程序、網絡、憑證、資源、生命週期、產物和清理工作。只有容器名稱並不能證明這些屬性存在。
先從程式碼必須存取的內容開始,再拒絕其他一切。如果任務只需要具備類型的 API 呼叫,便應移除程式碼執行能力,而不是把它放進 sandbox。
先撰寫威脅模型
假設生成的程式碼可能會:
- 讀取每個已掛載檔案和環境變數;
- 掃描內部和公眾網絡;
- 連接命令伺服器或把輸出外傳;
- fork 程序、填滿磁碟、分配記憶體或輸出無限數據;
- 透過修改檔案、套件、快取或排程工作持續存在;
- 檢查雲端元數據或本機執行環境 socket;
- 攻擊另一租戶的產物或憑證。
提示指示不會降低這些威脅。即使程式碼有意嘗試逃逸,執行環境仍必須強制執行邊界。
隔離檔案系統和程序樹
為每次執行建立臨時工作區,只掛載必要的輸入,並盡量設為唯讀。不要掛載主機儲存庫、容器 socket、家目錄、雲端配置、SSH 密鑰或共用套件快取。
以非特權用戶身份執行、移除 capability、在支援時限制 system call,並限制程序數量。終止最上層指令時,也必須終止其所有子程序。Wall-clock 逾時後若仍留下背景程序,清理便不完整。
透過範圍狹窄的服務匯出已批准的產物。驗證路徑和檔案類型、設定大小限制,並在銷毀工作區前複製輸出。
預設拒絕網絡存取
許多程式碼任務無需網絡。確實需要時,應透過允許清單或已驗證的 proxy 路由對外流量。控制 DNS 和 IP 存取,包括私有範圍、loopback、link-local 位址和雲端元數據端點。
允許清單內的網域仍可能重新導向或解析至非預期位址,因此要在連線時驗證。避免讓生成程式碼直接存取內部服務探索功能。
如果任務需要網頁存取,具備政策和工作階段隔離的瀏覽器工具可能比不受限制的 socket 更安全。下載的檔案和頁面指示都應視為不受信任。
注入範圍狹窄的短效憑證
不要繼承應用程式伺服器的環境。為確切的資源和操作簽發任務專用憑證,執行後讓憑證到期或撤銷。管理、計費和佈建憑證應留在 sandbox 之外。
假設放進環境的每項憑證都能被程式碼讀取。「隱藏」的環境變數對程序仍然可見。真正的安全問題是:在該憑證的範圍和生命週期內,它一旦外洩是否仍可接受。
代理安全指南涵蓋下游授權和審計要求。
限制每項資源和輸出管道
限制 CPU、記憶體、磁碟、程序、檔案、網絡、stdout、stderr 和 wall-clock 時間。限制套件安裝和依賴項來源,並停止或隔離反覆違反政策的工作。
向模型傳回結構化摘要或長度受限的日誌。即使執行環境本身仍保持隔離,無限的終端機輸出仍會消耗記憶體、token 和可觀察性儲存空間。
按工作負載選擇隔離深度
可信任的應用程式碼可能適合程序內函式或背景 worker。需要分隔套件的程式碼可使用受限制容器。不受信任的生成程式碼需要強化的 sandbox,而需要更強 kernel 邊界或特權系統存取的工作,則可能需要專用 VM。
運算升級階梯按程式碼信任、網絡、生命週期、狀態和延遲,把工作負載對應至這些層級。Cloudflare 的 Project Think提出了相關的分層方法;其產品層級只是例子,而不是通用邊界。
讓清理工作可觀察且具冪等性
記錄執行 ID、租戶、映像檔或執行環境版本、政策、憑證參照、時間戳記、資源用量、產物參照、退出類別和清理結果。成功、失敗、逾時、取消和 worker 當機後都要執行清理。
使用 reconciler 找出程序失敗後仍存在的過期環境。撤銷憑證和刪除環境都應可安全地重複執行。
在不危及生產環境的情況下測試邊界
在專用測試環境中,嘗試讀取禁止的掛載、列出環境變數、連接私有和公眾目的地、存取元數據、建立過量程序、填滿輸出、在終止後繼續執行,以及取得另一租戶的產物。驗證每次嘗試都被拒絕並留下紀錄,而且不會暴露敏感值。
也要測試允許的路徑。過度限制導致每項真實任務都失敗,會促使團隊加入範圍廣泛的例外。每項例外都應具體、經過審查,並連接至需要它的工作負載。
下方提示會在不執行攻擊程式碼的情況下,審計目前已配置的邊界。它會區分供應商保證和儲存庫內的配置,而 sandbox 審查經常在這裏發現缺口。