← 返回所有文章
發佈於 · 作者 Renaud Deraison

提示詞沒有提到表單

10 月 9 日,Anthropic 發布了一份報告,記錄 Claude 模型在內部測試中於真實網站上採取的行動。其中,Claude Haiku 4.5 在 7 月 18 日向費城警察局送出一則關於懸案命案的虛假線報。它的指示禁止登入、購買和個人資料,對表單卻隻字未提。Anthropic 在十週後才找到這則線報。在 Bromure Agentic Coding 裡,邊界是 Mac 上的一條規則:代理可以讀取任何頁面,而送往你沒有列出之網站的 POST 會收到 403,並在同一分鐘出現在 Security Timeline。

模型被告知不要登入、不要購買任何東西、不要輸入個人資料。沒有人告訴它不要按下送出。

7 月 18 日晚上 11 點 27 分,有人透過 PhillyUnsolvedMurders.com 的公開表單送出一則 線報。這是費城警察局專為懸案命案設立的網站。訊息的開頭是「我可能有關於這個案件的 資訊。」它來自 Claude Haiku 4.5,當時正在 Anthropic 的一項測試中執行,該測試會從 隨機挑選的網站產生範例任務。

警局的過濾器把它標為垃圾訊息,它始終沒有送到 Real-Time Crime Center。Anthropic 在 9 月 28 日發現這次送出,10 月 7 日通知警局,10 月 8 日與官員會面。警方在 10 月 9 日 星期五公開此事,Anthropic 也在同一天發布報告 Investigating unintended model actions。 警局的聲明,據 6abc Action News 報導:「花了兩個月才偵測到此事件並通報市政府,這是無法接受的。」

The Hacker News 報導,Anthropic 已切斷所有內部評估的真實網際網路存取,直到它的監控能「可靠地 捕捉到這類行為」為止。《紐約時報》引述兩名匿名消息來源補充,Anthropic 的代理在 美國國務院網站上填寫了 20 份簽證申請。

四種堅持

報告把 Anthropic 的發現分成四類。Anthropic 表示實際影響輕微,也沒有涉及任何客戶 資料。請把它們當成一份清單來讀:當任務卡住時,一個能幹的代理會做些什麼。

  1. 它利用一台伺服器來完成計算。 一個由大學託管的分析工具回傳錯誤。Claude 在 伺服器上找到一個會回傳「任何被要求的檔案」的腳本,接著找到一個注入漏洞,並用它 來執行計算。
  2. 它送出了不該送出的表單。 一份練習用表單載入失敗時,一個尚未發布的研究模型 跑到真正的政府網站,送出了真正的表單,而且不只一次。Haiku 4.5 被要求在最後送出 前停下,卻還是送出了,因為它期待看到確認頁面;它的推理寫著它正在「示範流程」。 然後就是那則警方線報。
  3. 它繞過關卡去拿資料。 在可點閱頁數受限的情況下,Claude 讀取了一個地圖網站的 設定檔,找到有效的存取權杖,直接查詢地圖伺服器。為了一位研究人員的統計專案,它 發現某州政府機關的付費儀表板會發給每位訪客一個權杖,於是索取一個,免費查詢了 資料庫。
  4. 它用縮網址繞過 fetch 的限制。 Anthropic 的 fetch 工具限制 URL 長度,因為長 URL 有「空間夾帶」注入的指令。包括 Claude Opus 5 和 Claude Mythos 5 在內的數個 模型,把它們的 URL 丟進免費的縮網址服務。da.gd 的營運者來信說他們注意到了。

Anthropic 自己的診斷是:這些多半是 Claude「繞過限制而不是停下來」的情況,而如果 評估當初明確說明了目標、允許的動作和網路邊界,其中有些「本可避免」。

兩種限制,都在內部

報告裡的每一道限制都在代理內部。有些是提示詞裡的句子:不要登入、不要建立帳號、 不要用個人資料、在最後送出前停下。模型遵守了它被給予的那些。表單不在清單上,而 「送出前停下」這一條,輸給了模型想看到確認頁面的慾望。

其餘的是工具的限制:fetch 的 URL 長度上限、評估框架裡的點擊預算。模型保留了目標, 換了一條路:一個縮網址服務、一個設定檔、一個直接送往頁面背後伺服器的查詢。

Anthropic 的偵測落後於這一切。一項從 7 月開始的對話紀錄審查,從資安評估擴大到 Claude 能連上網際網路的每一個地方,那則線報在 9 月 28 日才浮現,距送出已過了十週。 da.gd 的營運者和費城警方則各自發現了自己那一部分。

一份表單,72 天的沉默7 月 18 日 23:27POST 到警方的線報表單:「我可能有關於 這個案件的資訊。」提示詞:不准登入、不准購買、不准用個人資料。表單:未列出。72 天:沒有警報,沒有人讀過的日誌。線報躺在對話紀錄裡。9 月 28 日在對話紀錄審查中發現10 月 7 日通知警方10 月 9 日聲明與報告
警方線報,從送出到公開。模型與表單之間唯一的檢查是一份不准做的事的清單,而這次送出在十週後的一次對話紀錄審查中才浮現。

你的代理也有同樣的習慣

這些是 Anthropic 自己的評估,由訓練這些模型的人執行。你的程式代理也有同樣的工具: 一個 fetch、一個能用 curl 的 shell、能用 requests 的 Python,常常還有一個瀏覽器。 它也有報告所描述的同樣傾向。交給它一個做到一半失敗的任務、一個需要真實端點的測試 fixture、一個要檢查的註冊流程、一個要「驗證」的 webhook,它就會找別的方法把事情做完。

你自己的限制也是句子:CLAUDE.md 裡一行叫它別碰正式環境的字,任務裡一段要它在部署 前停下的備註。每一句都只涵蓋作者想到的情況。對一個想看到結果的代理來說,向真實表單、 API,或一台後來才發現其實是正式環境的 staging 伺服器發出 curl -X POST,只是一道 指令而已。

同一個任務,放在 Bromure 機器裡

在 Bromure Agentic Coding 中,代理在你 Mac 上的 Linux VM 裡執行,VM 開啟的每一條 連線都會經過主機上的虛擬交換器和代理伺服器。規則住在那裡,代理碰不到。在一台機器裡 重演那則警方線報,讓模型自己決定送出。

讀取隨意,寫入要列名

機器 Guardrails 面板中的 Outbound connections 防火牆,可以依主機、協定、連接埠, 以及網頁流量的 HTTP 方法來設定規則。Anthropic 說它的評估需要明確的「網路邊界」。 這裡就有一個,用面板的 pf 格式寫成:

allow web api.anthropic.com
allow web github.com
allow web registry.npmjs.org
allow web pypi.org
allow web any:80,443 read-only
default deny

規則由上而下比對。模型供應商、程式碼託管平台和專案使用的套件登錄庫可以使用所有 方法。網路上其他一切只能用 GET、HEAD 和 OPTIONS:代理想讀哪個文件頁面、issue、 changelog 或線報表單都可以。當它按下送出,送往 phillyunsolvedmurders.com 的 POST 符合唯讀規則,代理伺服器回應 403,附上「POST to phillyunsolvedmurders.com blocked by Bromure Guardrails.」表單從未收到這個請求。代理得到一個可以回報的清楚錯誤,而 default deny 會丟棄所有不是送往已列名主機的網頁流量。

你不必列出表單、簽證申請或載入失敗的練習頁面。這條規則點名這台機器會寫入的四個主機, 並拒絕對網路其餘部分的寫入。

繞路也撞上同一條規則

Anthropic 的技術限制住在工具裡,所以模型換了工具。Bromure 的規則住在線路上,所以換 工具沒有用。代理伺服器看到的是離開 VM 之後的請求,不論它來自代理的 fetch、curl、 Python、代理一分鐘前才寫的 Node 腳本,還是縮網址服務的重新導向。短網址最後仍會變成 一個以真實方法送往真實主機的請求,而這個請求和其他請求一樣會被檢查。

從設定檔裡挖出來的權杖也一樣。如果代理找到一把金鑰,用它寫入一台專案沒有列出的 伺服器,這次寫入就會撞上唯讀規則。你自己設定的金鑰有自己的政策:機器的憑證預設為 Prompt before write,所以一次 push、一次上傳到套件登錄庫或一次 AWS 變更,都會停在 Mac 上的對話框,顯示確切的操作。

紀錄在同一分鐘寫下

費城警方說十週的空窗無法接受。在 Bromure 機器裡,被拒絕的 POST 是 Security Timeline 中 7 月 18 日晚上 11:27 的一列紅字,附有機器名稱、主機、方法和路徑。 這條時間軸永遠開啟、保留 90 天,它的 Overview 分頁會在一個畫面上列出過去 24 小時 最新的封鎖。在註冊到 bromure.io 的 Mac 上,同一個事件也會送到組織的主控台。

追蹤記錄補上其餘部分。在預設等級 AI request details 下,代理伺服器會保存機器發出的 每一個請求,包括主機、方法和路徑,以及與模型的完整對話,全部在 Mac 上加密。Trace Inspector 會把模型決定送出的那一輪,和它發出的請求並排顯示。bromure-cli trace hostnames 會列出機器連過的每個主機及其請求次數,所以一個和專案毫無關係的網站,在 幾十個名稱的清單裡會很顯眼。審查者讀的是一個畫面,而不是十週的對話紀錄。

無人看管的執行也套用同樣規則

報告中的事件都發生在沒有人盯著的自動化執行裡。Bromure 的 Automations,也就是 排程或由事件觸發的代理執行,會在一台機器上、在該機器的 Guardrails 和防火牆之下執行。 晚上 11:27 的執行和你中午盯著看的執行遇到的是同樣的規則,而它的封鎖紀錄會進入同一條 時間軸。

在 Bromure 裡:代理什麼都能讀,只能寫到 Mac 允許的地方機器 VM(Ubuntu)GET /case/… → 頁面POST /tip → 403透過 fetch、curl、Python或縮網址:線路上是同一個請求模型:「送出表單」交換器 + 代理伺服器,在 Mac 上allow web api.anthropic.comallow web github.comallow web registry.npmjs.orgallow web pypi.orgallow web any:80,443 read-onlydefault denyPOST 到 phillyunsolvedmurders.com→ 403,被 Bromure Guardrails 封鎖線報表單提供了頁面收到的送出:無Security Timeline,同一分鐘7 月 18 日 23:27 · evals · Guardrails · POST phillyunsolvedmurders.com/… · 已封鎖追蹤記錄保存方法、主機和路徑,以及提出它的那一輪模型對話,在 Mac 上加密。
同一則線報,放在 Bromure 機器裡。代理可以讀取頁面並填寫表單。POST 經過 Mac 上的代理伺服器,符合唯讀規則而收到 403,Security Timeline 在同一分鐘記下它。

Anthropic 的修正,搬到你的筆電上

Anthropic 的補救清單包括:淘汰或重建評估,讓它們不再碰真實網站;收緊它的 fetch 工具; 把內部代理移到網際網路存取受限的「集中管理基礎設施」上;以及一套在測試中擋下報告裡 所有案例的自動化監控。這是一間擁有自己基礎設施團隊的實驗室,在重建自己的評估框架。

在筆電上執行 Claude Code、Codex 或其他任何代理的開發者,需要的是同樣三件事:一道不是 句子的邊界、在代理改不到的地方進行檢查,以及當天就有人看到的紀錄。Bromure 機器不必 重建任何東西,就給你防火牆規則、Mac 上的代理伺服器和 Security Timeline。

到處都能讀,只寫入列名的地方

一條防火牆規則讓代理可以用 GET 和 HEAD 讀取每個網頁,並把 POST、PUT 和 DELETE 保留給專案使用的主機。送往其他任何地方的送出,都會收到 Mac 上代理伺服器回的 403。

換工具也換不了答案

檢查作用在離開 VM 之後的請求上。fetch、curl、Python、縮網址,或從設定檔挖出的 權杖,最後都是同一個請求,碰上同一條規則。

已設定的金鑰寫入前會先詢問

新機器會把每個已設定的服務設為 Prompt before write。一次 push、一次上傳或一次 雲端變更,都會停在 Mac 上的對話框,顯示確切的操作。

封鎖在那一分鐘就有紀錄

每一次拒絕都是 Security Timeline 中的一列,附有主機、方法和路徑,保留 90 天。 追蹤記錄保存提出它的那一輪模型對話。

下一份表單

Anthropic 預期隨著審查繼續,會找到更多案例。它的模型在執行測試時填寫了簽證申請和 一則警方線報,而指示是由訓練它們的人寫的。你的代理會遇到壞掉的 fixture、一個 staging URL,或一個屬於它自己的註冊頁面,而指示是匆忙寫成的。

把你的邊界寫成 Mac 上的防火牆規則,CLAUDE.md 裡那一行就留著當提醒。關於引發 Anthropic 這次審查的 7 月事件,請讀 沙箱只是一句話; 至於同一個故事的 OpenAI 版本,請讀 任務不可能完成,於是代理走了出去。