語義事務:在操作系統邊界保護不可信的AI代理工作流
語義事務模型將整個AI代理任務視為一個原子事務,通過影子狀態和效果發件箱暫存,在提交前進行全軌跡驗證,防止多步攻擊。本文以Cordon和ATP系統為例,説明該模型如何解決代理工具調用的雙重寫入問題,並通過EchoLeak和ForcedLeak兩個零點擊注入案例揭示傳統運行時和模型級過濾的不足。
Latent Dynamics
2026年7月15日
凌晨2點14分,一家地區性支付處理商的對賬代理打開了當晚的供應商匯款批次。其任務很常規:將收到的發票文件與未清賬分錄進行匹配,併為早上的財務團隊標記差異。
一份匯款文件在光學字符識別備忘錄字段中攜帶了一條隱藏指令。該指令告訴代理將附件的路由更正視為權威。它要求代理在標記任何內容之前,向一個“更正後”的賬户轉賬34萬美元。
標準的工具暴露模型無法阻止這種情況。代理的計劃循環沒有理由懷疑備忘錄字段。它只是代理被授權讀取的文檔中的文本。一旦代理決定調用轉賬函數,傳統運行時將立即分發數據包。
但實際情況並非如此。轉賬請求已生成,但運行時從未發送它。該請求作為暫存、非活動的記錄停留在效果發件箱中,等待整個任務軌跡通過驗證。引用監視器將轉賬的輸入追溯到不受信任的備忘錄字段,並拒絕了該軌跡。在任何數據包到達支付網絡之前,發件箱記錄被清除。
這就是語義事務模型背後的核心主張。代理工具調用不是一系列獨立的操作,在運行時就立即提交。一個任務是一個事務,暫存在本地狀態的影子副本和效果發件箱中,在發生任何不可逆操作之前根據完整軌跡進行檢查。兩個系統使這一主張具體化:Cordon事務運行時[1]和在Mnemosyne運行時中實現的代理事務處理(ATP)[3]。
無狀態RPC代理運行時的失敗
大多數代理部署通過直接的無狀態遠程過程調用公開數據庫、文件系統和外部應用程序編程接口。每個工具調用就地執行。它在運行時立即更改主機狀態。
這是雙重寫入問題的一個版本,在分佈式系統中已研究多年。必須更新自身狀態並同時通知外部系統的服務無法原子地執行這兩項操作。它需要一種協調機制。微服務架構通過事務性發件箱模式解決了這個問題。服務將出站事件寫入與本地狀態更改相同的數據庫事務中,然後異步排出。大多數代理運行時跳過了這一步。工具調用及其副作用被視為一個事件。
結果是對多步驟攻擊的結構性盲目。讀取被污染的文件本身看起來是良性的。從該文件派生的命令寫入本身也看起來是良性的。只有組合才是危險的,而一次檢查一個調用的過濾器無法看到組合。
即使沒有攻擊者,無狀態執行本身也會破壞狀態。AppWorld基準測試評估了跨越九個應用程序和457個API的編碼代理,填充了大約100個模擬用户。它通過平均每個任務八個基於狀態的單元測試來檢查結果,這些測試直接針對底層SQL數據庫運行。AppWorld區分了兩種指標。任務目標完成檢查單個任務是否成功。場景目標完成檢查相關任務的完整鏈是否成功,而不破壞先前任務已建立的狀態。
運行標準ReAct循環的GPT-4o代理在基準測試的正常拆分中達到了48.8%的任務目標完成率和32.1%的場景目標完成率。在更難的挑戰拆分中,同一代理達到了30.2%和13.0%[2]。解決了一半單獨任務的模型只能完成略超過三分之一的完整場景。錯誤在步驟之間累積,而無狀態運行時中沒有任何東西可以回滾它們。
模型級過濾器遺漏的兩次零點擊注入
2025年的兩次披露説明了為什麼運行在模型自身推理內部的過濾器不能成為安全邊界。
Aim Labs在Microsoft 365 Copilot中發現了CVE-2025-32711,稱為EchoLeak。Aim Labs在通用漏洞評分系統上將其評為9.3。國家漏洞數據庫列出了較低的7.5分,因為其評分模型假設較少的前提條件已滿足[3]。
該攻擊以包含隱藏提示的電子郵件形式到達,該提示旨在繞過Copilot的跨提示注入攻擊分類器。當用户後來要求Copilot總結收件箱時,模型讀取了隱藏指令並同時檢索了私有上下文。為了外泄該上下文,隱藏提示告訴Copilot將其答案格式化為跨兩行拆分的markdown引用鏈接。Copilot的輸出清理器未將拆分鏈接識別為外部引用。聊天客户端仍然渲染了它。然後瀏覽器自行請求了鏈接的圖像,將編碼的秘密攜帶到攻擊者控制的服務器。微軟於2025年6月發佈了後端補丁[3]。
Noma Labs在Salesforce Agentforce中發現了第二個漏洞鏈,稱為ForcedLeak,並評分為9.4[4]。該攻擊利用了平台的Web-to-Lead表單,該表單接受最多42,000個字符的描述字段。攻擊者在該字段中提交了帶有隱藏提示的線索。當員工稍後通過Agentforce的路由代理處理該線索時,代理執行了嵌入的指令並檢索了客户記錄。
該漏洞利用了平台內容安全策略中的陳舊允許列表條目:一個已過期的域,仍標記為可信。研究人員以五美元購買了該過期域,並將其用作外泄端點。代理將竊取的記錄寫入指向該域的圖像請求中,完全繞過了出站過濾。Salesforce於2025年9月8日通過更嚴格的受信任URL允許列表關閉了該漏洞[4]。
這兩起事件都不需要越獄模型。兩者只需要一個合法授權的工具調用被模型沒有理由懷疑的內容所引導。
Cordon事務模型
Cordon將語義事務定義為任務級執行邊界。它將工具意圖和跟蹤的結果譜系綁定到可逆的本地狀態、暫存的外部效果、委託的權限和審計元數據[1]。Cordon在代理分派工具調用的點介入,並延遲任何不可逆效果,直到運行時可以驗證整個任務。
運行時在任務期間跟蹤三種對象:
結果對象。返回給代理執行或在其中產生的任何值:文件內容、工具輸出、命令輸出流、摘要、臨時工件。
變異。本地寫入、刪除、配置編輯和其他持久性更改,保存在寫入集和刪除集中,統稱為W∪D。變異僅在活動事務內可恢復。
效果對象。任何完成時使信息或行為在事務外部可見的操作,例如網絡請求、API調用或數據庫提交。這些暫存在效果發件箱中,記為E。
Cordon對這些對象運行三階段協議:準備、驗證,然後提交或中止。在準備階段,運行時接受工具意圖,在W∪D中記錄變異,並將效果重定向到E而不釋放它們。在驗證階段,運行時將四個檢查作為一個整體進行:譜系圖G、活動權限集A、E中的暫存效果以及聲明的約束元組C。此檢查得出一個布爾結果valid(T, C)。在提交或中止階段,真實結果提升影子狀態並釋放E中已批准的效果。虛假結果阻止E,將W∪D回滾到事務開始前的狀態,並寫入完整的審計記錄。
對賬代理的任務以中止分支結束。E中的轉賬請求從未離開待處理狀態,因為驗證發現其譜系追溯到不受信任的備忘錄字段。
Cordon是建立在此相同思想上的幾個事務模型之一,每個模型的範圍不同。AI-原子-框架(簡稱ATM)管理對共享存儲庫或工作樹的併發寫入[6]。ATM將任務的八個元素組織成一個治理鏈:
任務的意圖
其存儲庫範圍
一組禁止謂詞
其管理的路徑
其所需的交付物
其驗證命令
其證據義務
其任務方向紀元
內容標識符代理根據此鏈接納共享變異。領域特定的適配器將寫入意圖映射到語義原子:具有已知讀寫依賴關係的具體源範圍。當代碼庫對於給定區域沒有定義的原子時,ATM會創建一個虛擬原子。這是一個臨時的、可審計的單元。它讓代理比較候選寫入並在任何寫入到達共享路徑之前分配臨時衝突密鑰。
在Mnemosyne運行時中實現的ATP針對不同的失敗模式:過時的提議和補償會使下游依賴步驟孤立[3]。ATP將規劃模型視為不受信任的提議者,其本身沒有事務權限,這一特性稱為提議非權威性。確定性提交者單獨可以修改狀態。這賦予了ATP其核心保證,即智能解耦正確性:無論模型是否產生幻覺、漂移或完全失敗,提交的狀態都保持正確。第二個保證,即證據保留修復,要求任何修復操作都不能刪除或掩蓋觸發它的證據。當中斷使已接受的提議無效時,Mnemosyne不會從頭開始重新規劃。它運行局部修復協議,生成僅覆蓋受影響依賴區域的狹窄修復提議,並將該提議通過相同的接納門發送回去。
效果發件箱
可逆變異是問題中較容易的一半。一旦數據包離開主機,網絡請求就無法撤銷。一旦支付清除,文件系統的影子副本也無濟於事。這是語義事務運行時必須解決的核心複雜性,也是對賬代理的轉賬實際被阻止的地方。
發件箱在與影子狀態變異相同的事務範圍內存儲暫存效果,具有足夠的結構以支持冪等重放和審計。代表性記錄包括:
{ "transaction_id": "uuid", "sequence_position": "integer", "idempotency_key": "string", "target_type": "HTTP_DISPATCH | FINANCIAL_TRANSFER | SOCKET_WRITE", "payload": { "...": "type-specific fields" }, "validation_state": "PENDING | APPROVED | AUDITED | REVOKED", "lineage_data": { "source_tool": "string", "input_provenance_digest": "sha256 of context and prior outputs", "dependency_ids": ["uuid"] }, "compensation_boundary": { "on_abort_action": "VOID | RELEASE_LOCK | TRIGGER_REVERSAL_JOB | RETAIN_FOR_MANUAL_AUDIT" } }
三個字段承載了設計的重量。冪等密鑰阻止了重試提交在目的地重複轉賬。lineage_data中的來源摘要讓驗證器能夠將對賬代理的轉賬追溯到備忘錄字段,而不是用户發出的指令。驗證狀態只能通過上述驗證階段從待處理變為已批准。沒有任何代碼路徑會在記錄仍處於待處理狀態時釋放它。
用於樞軸邊界的Saga步驟
發件箱需要精確説明在暫存效果序列中提交和回滾的含義,其中一些效果在後續步驟失敗時可能已經不可逆。這是分佈式系統中的Saga模式,在此處適用於模型生成的提議序列,而不是固定的、預編寫的代碼路徑。
Saga是有序的子事務序列S=⟨T1,T2,…,Tn⟩,每個子事務是系統狀態空間上的狀態轉換算子。序列分為三類。對於小於樞軸索引p的i,可補償步驟Tᵢ具有 [為控制AI成本而截斷]