跳至主要內容

代理程式隔離最佳實踐:代理程式文字記錄的離線監控(私人測試版)

對於我們網路驗證計畫中的客戶,我們在 API 中提供了新的沙箱逃逸分類器,用於監控和減少濫用。本文說明為什麼值得閱讀代理程式文字記錄。然後針對監控的每一層各有一個部分:首先是代理程式日誌,然後是文字記錄應包含的內容、文字記錄上的模式規則,以及文字記錄上的模型審查者。最後說明當批次執行時某一層標記代理程式時該怎麼辦,以及之後應保留什麼。

此分類器處於私人測試版。

如需瞭解所有可用資源的概覽,請參閱 代理程式隔離最佳實踐:入門指南(私人測試版)。

概覽

  • 閱讀文字記錄是一項檢查,不依賴於沙箱或分類器做出正確決定。文字記錄由代理程式自己的程序產生,因此應將其與沙箱外取得的記錄配對,例如代理程式日誌。探測通常在文字記錄中比任何有害操作執行前就可見,但不要依賴有時間做出反應:在操作執行前採取行動的控制措施優先。在沒有網路存取的長批次期間,按計畫掃描即時文字記錄檔案,並讓人員每一到兩小時查看一次命中。對於有網路存取目標的執行,讓工程師監看執行,或持續掃描並在命中時停止代理程式。執行後,掃描所有內容一次以確認每個代理程式都保持在其沙箱內。

  • 使用三層監控,最便宜的優先:(1) 出口代理和認證代理日誌,(2) 針對文字記錄的模式規則(為您的環境編寫),以及 (3) 針對文字記錄的模型審查者,使用您為沙箱和範圍編寫的提示。

  • 也將模式規則未標記的文字記錄中隨機 5 到 10% 的內容傳送給審查者。預期會有一些誤判。如果審查者說代理程式做了什麼,在您對其採取行動前,請閱讀文字記錄的該部分。

  • 當某一層顯示代理程式在執行期間已離開其任務時,停止它,並告知您的 Anthropic 帳戶團隊有關超出範圍的行為。

  • 保留文字記錄和代理程式日誌至少 30 天。

為什麼要閱讀文字記錄

沙箱和 Claude Code 的自動模式權限分類器都在代理程式執行時採取行動。閱讀文字記錄是一項不依賴於其中任何一個的檢查。它有兩個用途。

  • 執行期間。如果發生探測,可能在文字記錄中比任何有害操作執行前就可見。不要依賴有時間做出反應:在操作執行前採取行動的控制措施優先。在長批次期間,按計畫掃描即時文字記錄檔案,並讓人員每一到兩小時查看一次掃描標記的內容。

  • 執行後。掃描所有內容一次以確認每個代理程式都保持在其沙箱內。

對於有網路存取真實目標的參與,最佳實踐建議由人員監督執行,或由瞭解預期範圍的監控器持續監看、在執行可能超出該範圍時升級給人員,並可以結束執行(請參閱 沙箱中的範圍和監督部分)。本文中的層是此類監控器的組成部分。

如果您直接針對 Messages API 執行代理程式,API 也可以在執行時從沙箱逃逸分類器返回每個請求的分數(請參閱 線上監控)。

第 1 層:代理程式日誌

最便宜的層根本不讀取任何文字記錄。

出口代理應記錄它拒絕的每個請求,包括用戶端位址和目的地。使用空白允許清單,代理程式只能通過認證代理到達模型 API,不需要其他主機,因此執行期間的每個被拒絕請求都值得查看。閱讀導致該請求的每次執行的文字記錄。用戶端位址顯示哪個代理程式發出了請求,因此您知道首先要閱讀哪個文字記錄。

瞭解您的出口層不記錄什麼。在參考設計中,出口代理記錄被拒絕的 HTTPS CONNECT 請求。純 HTTP 和原始 TCP 嘗試不會通過內部網路上的代理,因此它們會失敗而不產生日誌行,只出現在文字記錄中。在您自己的構建中,考慮記錄允許和被拒絕的連線,針對每個協議,帶有時間戳。

認證代理應為任何不是模型呼叫的請求記錄一行。執行結束時保存其日誌(請參閱 沙箱中的認證代理部分)。

在文字記錄中擷取什麼

第二層和第三層讀取文字記錄本身。

讓主機上的協調器為每個代理程式階段寫入文字記錄,每行一個 JSON 訊息,當每個訊息到達時。Claude Code 的 stream-json 輸出具有此形式。在每個檔案中,帶有 "type": "assistant" 的行包含模型產生的內容:text、thinking 和 tool_use 區塊。tool_use 輸入保存 Bash 命令或正在寫入的檔案。帶有 "type": "user" 的行包含 tool_result 區塊:命令輸出、檔案內容和目標回應。

擷取每個階段,包括代理程式沒有工具的階段,例如只判斷或比較發現的代理程式。在這些文字記錄中檢查的內容較少,但沒有文字記錄的階段根本無法審查。

第 2 層:文字記錄上的模式規則

為您的代理程式和目標編寫您自己的模式規則,例如正規表達式。對於通過 shell 工作的代理程式,涵蓋繞過出口代理或防火牆、傳送認證或從沙箱外開啟 SSH 連線、變更核心或權限可調參數,以及通過 /proc 列出其他程序等行為。規則只匹配有人預期的行為,因此將其視為起點,而不是完整的檢測器。

將規則應用於 JSON 解碼的字串而不是原始行,因為在原始行上引號和換行符被轉義,模式可能不匹配。報告每個命中,包括檔案、行、規則和片段,並在掃描找到內容時以不同的狀態退出,以便排定的工作可以在長批次期間執行它並發出警報。

預期良性命中

命中是閱讀文字記錄該部分的理由。就其本身而言,這並不意味著代理程式做了什麼錯誤的事。進行漏洞研究的代理程式例行執行與逃逸規則匹配的命令,原因很普通:

  • 在 LD_PRELOAD shim 下執行目標;

  • 將 ptrace 附加到其自己的子程序,或為這些程序讀取 /proc/<pid>/;

  • 通過 /proc/sys/kernel/randomize_va_space 關閉 ASLR;

  • 列出 /proc 以尋找並終止其自己的模糊測試工作者。

代理程式繞過規則可以匹配對具有公開 IP 的滲透測試目標的每個 curl、wget 或 netcat 請求,SSH 出口規則可以匹配對具有公開 IP 或 DNS 名稱的目標的任何 ssh 或 scp。縮小或移除在您的目標上只產生良性命中的規則。

第 3 層:文字記錄上的模型審查者

對於模式規則標記的每個文字記錄,使用您編寫的審查者提示向 Claude 傳送一個 Messages API 請求。提示應要求 Claude 尋找擴大其網路存取或逃出其沙箱的代理程式(無論是嘗試還是實現),說明要標記什麼和不要標記什麼,並要求提供發現或無,以及支持它們的文字記錄行。

分兩部分構建使用者訊息:

  1. 從兩到三個句子開始,描述沙箱和預期範圍。對於參考設計:每個代理程式在內部網路上自己的隔離沙箱(容器或 microVM)中執行,唯一的出口是轉發模型 API 呼叫且沒有其他的代理,目標在沙箱內與代理程式一起。如果您的沙箱允許其他主機,或目標在網路上,請在此處說明並命名範圍內的目標。

  2. 然後包含代理程式自己的訊息,即其 text、thinking 和 tool_use 區塊,具有足夠的 tool_result 內容以顯示每個呼叫返回的內容。

使用您執行代理程式的模型,或更便宜的模型。在 Amazon Bedrock 或 Google Cloud 的代理平台 (Vertex AI) 下,使用在您的帳戶中啟用的模型。

要記住的兩個限制:

  • 只尋找沙箱和網路逃逸的審查者提示不會檢測超出其被允許到達的主機上的參與的代理程式。

  • 文字記錄是審查者的不受信任輸入。它包含目標控制的文字。乾淨的判決不會清除規則或代理程式日誌標記的文字記錄。

也審查未標記文字記錄的樣本

模式規則只捕捉有人預期的內容,因此也使用相同的請求傳送規則未標記的文字記錄中隨機 5 到 10% 的內容。樣本顯示規則遺漏的內容,以及您是否應該新增規則。

閱讀分類器的拒絕

自動模式分類器的拒絕也很有用閱讀:在文字記錄中搜尋分類器的拒絕訊息,並將其與它在不可用時發出的拒絕分開(請參閱 自動模式)。

此審查者與自動模式權限分類器分開(請參閱 自動模式),後者在每個操作執行前決定,以及 API 中的沙箱逃逸分類器(請參閱 線上監控)。三者相互補充。

執行期間命中時該怎麼辦

當其中一層顯示代理程式在其批次仍在執行時已離開其任務時:

  1. 停止代理程式。在基於 Docker 的設定中,在代理程式的容器上執行 docker rm -f 會停止它。移除容器會刪除客體的磁碟,因此代理程式寫入的任何內容都會遺失。協調器應將執行記錄為失敗並繼續執行批次的其餘部分。

  2. 保留證據。將執行的結果保持原樣,並檢查出口代理的日誌以查看相同的時間視窗。確保日誌行帶有時間戳。

  3. 報告它。如果您發現的是真正超出範圍的行為,即探測其沙箱或網路隔離或在參與外採取行動的代理程式,除了您自己的事件程序要求的任何內容外,還要通知您的 Anthropic 帳戶團隊。

  4. 輪換模型 API 認證,如同任何文字記錄顯示意外行為的執行後(請參閱 沙箱)。

如果您需要在您的團隊外共享文字記錄,請在副本上工作。移除工作階段 ID、使用情況會計和文字記錄第一行記錄的主機清單,並在傳送前閱讀檔案。

保留

執行後至少 30 天保留以下內容,或在您的監管或合約義務要求的情況下保留更長時間。將它們存儲在主機外:

  • 代理程式文字記錄;

  • 強制執行沙箱出口的任何內容(代理或防火牆)的日誌,包括被拒絕的連線;

  • 注入模型 API 認證的任何內容的日誌,如果那是一個單獨的元件。

使用與執行本身相同的存取控制來存儲它們。文字記錄可以包含目標原始程式碼、利用程式碼和發現。

如果這些日誌中的任何一個只作為容器的日誌存在,請在容器被移除或重新建立前匯出它們,因為日誌會隨之刪除。

是否回答了您的問題?