語義事務:在作業系統邊界保護不可信的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成本而截斷]