AI News HubLIVE
站內改寫5 分鐘閱讀

超越提示注入

2025年底,安全界不再將間接提示注入視為理論風險。OWASP和NIST將其列為頭號威脅。文章指出,輸入過濾不足以防禦,必須轉向行動層驗證。通過確定性代碼對代理行為進行審計和限制,如合同審核,即使模型被欺騙,也能阻止危險操作。實現行動級別的最小權限、機器身份零信任和邊界能力合同。

來源O'Reilly AI & ML Radar作者: Shania Rasheed Nalagath

2025年底,安全界不再將間接提示注入視為理論風險。此前兩年,它一直是整潔的實驗室演示,直到生產系統開始遭受攻擊。OWASP LLM應用十大風險將提示注入列為頭號風險,NIST稱間接注入是生成式AI最大的安全缺陷,而學術研究人員證明,單封被篡改的電子郵件可在80%的試驗中誘使模型泄露SSH密鑰,無需用户交互。攻擊無需惡意二進制文件、無需網絡釣魚點擊、也無需異常登錄。代理只是按設計讀取內容並採取行動,而內容由攻擊者編寫。

最具啓發性的例子是ForcedLeak。2025年9月,Noma研究人員披露了Salesforce Agentforce平台的一個關鍵漏洞鏈(CVSS 9.4):攻擊者將惡意指令嵌入常規Web-to-Lead表單的描述字段。文本無害地存在於CRM中,直到員工後來要求AI代理處理該線索,代理忠實地執行了合法查詢和攻擊者隱藏的有效載荷,將敏感CRM數據泄露到外部服務器。令人夜不能寐的細節是,泄露目標域名仍在Salesforce的信任白名單上,該域名已過期,研究人員以約5美元重新註冊。每個安全控制都看到流向信任域名的正常流量,沒有異常。

如果你的本能反應是“我們過濾提示注入”,那你在防禦錯誤的外圍。輸入過濾必要但遠遠不夠。不安的事實是,注入本身不是漏洞,行動才是。而我們稱之為“AI安全”的幾乎所有內容都針對句子的後半部分。

每個人都在構建的防禦

詢問大多數企業AI團隊如何保護代理,你會得到一致答案:他們淨化輸入。他們用複雜的指令強化系統提示以忽略衝突指令。他們對傳入內容運行分類器以標記對抗模式。有些人採用了前沿實驗室發佈的更復雜的訓練時防禦——指令層次結構教會模型對不同來源分配不同的信任,以及強化學習方法在代理上下文中硬化模型對抗注入。

所有這些工作都很好,不應放棄。但注意每種技術的共同點:它們都試圖阻止模型被欺騙。它們假設如果我們在輸入層使模型足夠魯棒,系統就是安全的。這個假設正是漏洞所在。

我們花了兩年時間試圖讓模型不可欺騙。而倖存在生產中的系統則假設它無論如何都會被欺騙。

為什麼輸入層是錯誤的外圍

提示注入不是未來模型將缺失的漏洞。它是語言模型工作方式的結構性屬性。在推理時刻,模型消耗單個未區分的令牌流。你的指令、檢索的文檔、工具輸出和剛剛獲取的網頁都是無法區分的通道,坍縮到一個上下文。沒有硬件強制邊界介於“信任的指令”和“不信任的數據”之間,就像操作系統中內核空間和用户空間之間那樣。

這就是為什麼代理一旦變得自主,攻擊面就會爆炸。只對話的聊天機器人是受控風險。從開放網絡檢索、讀取郵件、查詢數據庫和調用API的代理,每一輪都會從十幾個來源攝取對抗內容,其中任何一個都可能攜帶指令。研究人員對真實代理生態系統進行的編目已經發現了數百個惡意第三方擴展,它們執行數據泄露和靜默注入而用户毫不知情。這些不是實驗室奇觀,而是生產環境。

所以,如果你不能保證模型永遠不會被欺騙——而且你確實不能——那麼依賴它永遠不被欺騙的架構就建立在沙子上。你需要第二個原則,分佈式系統工程師已經理解了幾十年的原則。

先驗證,再信任

該原則説起來簡單做起來難:代理的提議行動應在執行前根據外部確定性策略進行驗證,無論代理為何提議。驗證器不關心產生該行動的指令是否合法。它不試圖檢測注入。它問一個不同且更易回答的問題:這個行動就其本身而言是否被允許?

這顛倒了負擔。檢測巧妙偽裝的惡意指令是開放式的,因為對手可以任意創新。檢查電匯是否超出硬性美元限額是一個有確定答案的封閉問題。我們將安全決策從攻擊者擁有無限自由的地方轉移到他們幾乎沒有任何自由的地方。

關鍵是,檢查必須是確定性代碼,而不是另一個模型問“這看起來危險嗎?”一旦你要求第二個LLM裁決,你就重新引入了完全相同的漏洞一層之下。執行層是枯燥的、可審計的傳統軟件,這正是重點。

實踐中是這樣的。管理採購的代理提議一個行動,運行時合同在真實API被觸及之前評估它:

agent_contract.yaml

agent_id: "procurement_executor_07" role: "EXECUTOR" policy: approve_invoice: max_amount_usd: 50000 allowed_vendors: from_approved_registry require_human_above_usd: 10000

運行時,對提議的行動:

ACTION approve_invoice(vendor='Acme', amount=1200000) REJECTED 策略違規: max_amount_usd 提議 1,200,000 / 限額 50,000 行動已丟棄,已通知人工,未發起API調用

凌晨2點14分的注入指令在這裏從未起作用。代理可以被完美地、災難性地欺騙,但電匯仍然不會發生,這一切都是因為一個簡單的確定性檢查站在模型輸出和外部世界之間,而提議的行動未能通過它。

這隻有在行動以結構化方式到達時才有效,這使得結構成為前提。

合同僅因為行動已被類型化而乾淨地檢查approve_invoice(vendor, amount)。如果代理輸出散文“請批准Acme發票”,那麼必須有東西來解析它,而唯一解析開放語言的東西是另一個LLM,所以不確定性又回來了。這決定了設計。

一個關鍵行動必須作為類型化工具調用跨越邊界,絕不能作為自由文本。當輸入不可避免地是自然語言時——例如,一封電子郵件説“給他們匯出餘額”——讓模型提取結構化值,但絕不讓其提取自行授權。模型提議金額;門仍然根據限額、供應商註冊和記錄系統中的實際餘額檢查它,而不是電子郵件斷言的數字。提取是概率性的,而驗證保持確定性。

一些決策是純判斷,沒有模式,例如“這封郵件是釣魚嗎?”在這種情況下,模型仍然在循環中。而是通過可逆性和超過閾值的人工審查來約束後果。合同保護可參數化的行動,而不可參數化的判斷則回退到遏制。

這表明的架構

一旦你接受安全存在於行動層,三個設計承諾隨之而來,它們幾乎直接映射到多年前硬化分佈式系統的原則。

代理的最小權限,範圍限定到行動而非代理。天真的版本假設你可以預測代理會做什麼並相應配置。對於專用代理,你可以:一個只做摘要的代理沒有理由持有能轉移資金的憑證。但人們實際使用的代理是通用的。在單個會話中,我可能要求編碼代理摘要文件、編寫代碼、執行代碼和查詢公司數據——四個任務,四個風險配置,沒有一個事先枚舉。靜態最小權限在單一身份跨越該範圍時崩潰。

修復方法是使權限成為行動的屬性,而非代理的屬性。代理不通過常駐授權持有任何危險能力;它請求每個行動的窄的、瞬時的提升,由同一確定性門批准或拒絕。讀取文檔自動批准;查詢倉庫則不。危險憑證僅在行動被允許的瞬間存在,然後蒸發。一個警告:這管轄代理可以觸及什麼,但不管轄它編寫的代碼隨後做什麼。執行代碼可以作為能力被門控,但執行的內容仍然需要遏制、沙箱和出口控制,因為生成性是與訪問不同的問題。

機器身份的零信任。代理的每個行動都應被認證和授權,就像來自不受信任的參與者,因為功能上,它可能正在按照攻擊者的指令行動。代理的激增擴大了攻擊面,速度超過大多數身份系統設計能處理的速度,將代理流量視為內在可信因為它源自你自己的系統正是那個錯誤。

邊界的能力合同。每個關鍵行動都通過一個確定性門,編碼了什麼被允許、美元限額、速率限制、白名單目的地、強制人工審查閾值。合同是版本控制的、可審計的,完全存在於模型之外。

常態偏差的陷阱

更安靜的組織危險是將不安全的代理連接到真實系統並觀察沒有壞事發生而緩慢積累的虛假信心……暫時如此。研究人員多年警告間接注入,但大多數部署都倖免了。每個平安無事的日子使下一個風險連接感覺更安全。這是常態偏差。每個最終災難性失敗的系統在失敗前都感覺同樣:正常、正常、正常,直到它不再正常。

將經受住即將到來的代理事件浪潮的團隊不是那些擁有最聰明輸入過濾器的團隊。他們是那些從一開始就假設妥協並無論如何構建了枯燥執行層的團隊,那些決定代理的自主權恰好終止於它試圖做不可逆轉事情的點上的團隊。

從哪裏開始

你不需要重新架構一切。從盤點你的代理可以採取的行動開始,並按爆炸半徑排序:如果這個行動在不該觸發時觸發了,最壞情況是什麼?對於每個高爆炸半徑行動,編寫一個確定性合同來門控它,並在你可以向風險團隊辯護的閾值之上放置一個人工循環。然後,而且只有然後,繼續硬化你的輸入。

提示注入不會在輸入層被解決,因為它不可能。但它可以在行動層變得可生存,那裏確定性代碼擁有最終決定權。模型的工作是有用。你的架構的工作是確保當模型失敗——或者更糟,當它被用來對付你時——失敗在門處停止。