AI News HubLIVE
サイト内リライト8 分で読了

セマンティックトランザクション:OS境界での信頼できないAIエージェントワークフローの保護

セマンティックトランザクションモデルは、AIエージェントのタスク全体を単一のアトミックトランザクションとして扱い、シャドウ状態とエフェクトアウトボックスでステージングし、コミット前に全軌跡の検証を行います。本記事では、CordonとATPを例に、このモデルがエージェントツール呼び出しの二重書き込み問題を解決する仕組みを説明し、EchoLeakとForcedLeakの2つのゼロクリックインジェクション攻撃を通じて、ステートレスランタイムとモデル内フィルターの限界を明らかにします。

ソースHacker News AI著者: Ayauho

Latent Dynamics

2026年7月15日

午前2時14分、地域の支払い処理業者の調整エージェントが夜間のベンダー送金バッチを開きました。そのタスクは日常的なものでした。受信した請求書ファイルを未払いの元帳エントリと照合し、朝の財務チームに不一致をフラグ付けすることです。

1つの送金ファイルには、光学文字認識メモフィールド内に隠された指示が含まれていました。その指示は、添付のルーティング修正を信頼できるものとして扱うようエージェントに指示しました。エージェントは、何かをフラグする前に、「修正された」口座に34万ドルの送金を発行するよう求められました。

標準的なツール公開モデルではこれを止める方法がありません。エージェントの計画ループはメモフィールドを疑う理由がありません。それはエージェントが読み取りを許可されたドキュメント内の単なるテキストです。エージェントが送金関数を呼び出すことを決定すると、古典的なランタイムはすぐにパケットをディスパッチします。

しかし、実際にはそうはなりませんでした。送金要求は生成されましたが、ランタイムはそれを送信しませんでした。要求は、ステージングされた非アクティブなレコードとしてエフェクトアウトボックスに格納され、タスク全体の軌跡が検証を通過するのを待っていました。リファレンスモニターは送金の入力を信頼できないメモフィールドまで追跡し、軌跡を拒否しました。アウトボックスレコードは、どのパケットも支払いネットワークに到達する前に消去されました。

これがセマンティックトランザクションモデルの背後にある動作の主張です。エージェントのツール呼び出しは、実行時にコミットする一連の独立した操作ではありません。タスクは1つのトランザクションであり、ローカル状態のシャドウコピーとエフェクトアウトボックスにステージングされ、不可逆的なことが起こる前に完全なトレースに対してチェックされます。2つのシステムがこの主張を具体化しています。Cordonトランザクションランタイム[1]と、Mnemosyneランタイムに実装されたエージェンティックトランザクションプロセッシング(ATP)[3]です。

ステートレスRPCエージェントランタイムの失敗

ほとんどのエージェントデプロイメントは、データベース、ファイルシステム、外部アプリケーションプログラミングインターフェースを、直接的なステートレスリモートプロシージャコールを通じて公開します。各ツール呼び出しはその場で実行されます。実行と同時にホストの状態を変更します。

これは、分散システムで長年研究されてきた二重書き込み問題の一形態です。自身の状態を更新し、同時に外部システムに通知しなければならないサービスは、両方をアトミックに実行できません。調整メカニズムが必要です。マイクロサービスアーキテクチャは、トランザクショナルアウトボックスパターンでこれを解決しました。サービスは、ローカル状態変更と同じデータベーストランザクション内にアウトバウンドイベントを書き込み、非同期的に排出します。ほとんどのエージェントランタイムはこのステップをスキップします。ツール呼び出しとその副作用は1つのイベントです。

その結果、マルチステップ攻撃に対する構造的な盲目が生じます。感染したファイルを読むことはそれ自体無害に見えます。そのファイルから派生したコマンドを書き込むこともそれ自体無害に見えます。組み合わせだけが危険であり、一度に1つの呼び出しをチェックするフィルターはその組み合わせを見ることができません。

攻撃者がいなくても、ステートレス実行はそれ自体で状態を破壊します。AppWorldベンチマークは、約100のシミュレートユーザーがいる9つのアプリケーションと457のAPIにわたってコーディングエージェントを評価します。タスクごとに平均8つの状態ベースの単体テストで結果をチェックし、基盤となるSQLデータベースに対して直接実行します。AppWorldは2つのメトリクスを区別します。タスク目標達成は1つのタスクが成功するかどうかをチェックします。シナリオ目標達成は、関連タスクの完全なチェーンが成功するかどうかをチェックし、以前のタスクがすでに確立した状態を壊さないようにします。

標準的なReActループを実行するGPT-4oエージェントは、ベンチマークの通常分割で48.8%のタスク目標達成率と32.1%のシナリオ目標達成率に達します。より難しいチャレンジ分割では、同じエージェントは30.2%と13.0%に達します[2]。個々のタスクの半分を解決するモデルは、完全なシナリオの約3分の1しか完了しません。エラーはステップ間で蓄積され、ステートレスランタイムでは何もロールバックしません。

モデルレベルのフィルターが見逃した2つのゼロクリックインジェクション

2025年の2つの開示は、モデル自身の推論内部で実行されるフィルターがセキュリティ境界になり得ない理由を示しています。

Aim Labsは、Microsoft 365 CopilotでCVE-2025-32711(EchoLeakとして知られる)を発見しました。Aim Labsは共通脆弱性評価システムで9.3と評価しました。国家脆弱性データベースは7.5の低いスコアをリストしています。これは、そのスコアリングモデルがより少ない前提条件がすでに満たされていると想定しているためです[3]。

攻撃は、Copilotのクロスプロンプトインジェクション攻撃分類器をバイパスするように書かれた隠されたプロンプトを含む電子メールとして到着しました。ユーザーが後でCopilotに受信トレイを要約するよう依頼すると、モデルは隠された指示を読み取り、それとともにプライベートコンテキストを取得しました。そのコンテキストを外部に漏洩するために、隠されたプロンプトはCopilotに回答を2行に分割されたマークダウン参照リンクとしてフォーマットするよう指示しました。Copilotの出力サニタイザーは分割されたリンクを外部参照として認識しませんでした。チャットクライアントはそれでもレンダリングしました。ブラウザはリンクされた画像を独自に要求し、エンコードされた秘密を攻撃者が制御するサーバーに運びました。マイクロソフトは2025年6月にバックエンドパッチを出荷しました[3]。

Noma Labsは、Salesforce Agentforceで2番目の脆弱性チェーン(ForcedLeakと呼ばれる)を発見し、9.4と評価しました[4]。この攻撃は、最大42,000文字の説明フィールドを受け入れるプラットフォームのWeb-to-Leadフォームを利用しました。攻撃者はそのフィールド内に隠されたプロンプトを含むリードを送信しました。従業員が後でAgentforceのルーティングエージェントを通じてリードを処理すると、エージェントは埋め込まれた指示を実行し、顧客レコードを取得しました。

このエクスプロイトは、プラットフォームのコンテンツセキュリティポリシー内の古い許可リストエントリ(まだ信頼できるとマークされている期限切れのドメイン)に依存していました。研究者は期限切れのドメインを5ドルで購入し、それを漏洩エンドポイントとして使用しました。エージェントは盗んだレコードをそのドメインを指す画像リクエストに書き込み、アウトバウンドフィルタリングを完全にバイパスしました。Salesforceは2025年9月8日に、より厳格な信頼済みURL許可リストでこのギャップを閉じました[4]。

どちらのインシデントも脱獄モデルを必要としませんでした。どちらも、合法に承認されたツール呼び出しが、モデルが不信感を抱く理由のないコンテンツによって誘導されることだけを必要としました。

Cordonトランザクションモデル

Cordonはセマンティックトランザクションをタスクレベルの実行境界として定義します。これは、ツールの意図と追跡された結果の系統を、可逆的なローカル状態、ステージングされた外部効果、委任された権限、および監査メタデータに結び付けます[1]。Cordonはエージェントがツール呼び出しをディスパッチするポイントに介入し、ランタイムがタスク全体を検証できるまで不可逆的な効果を遅延させます。

ランタイムはタスク中に3種類のオブジェクトを追跡します:

結果オブジェクト。エージェント実行に返されるか、またはエージェント実行内で生成される任意の値:ファイル内容、ツール出力、コマンド出力ストリーム、要約、一時的なアーティファクト。

ミューテーション。ローカル書き込み、削除、構成編集、その他の永続性変更は、書き込みセットと削除セットに保持され、W∪Dとしてまとめて書き込まれます。ミューテーションはアクティブなトランザクション内でのみ回復可能です。

効果オブジェクト。完了時に情報または動作をトランザクション外部で可視にする任意のアクション(ネットワークリクエスト、API呼び出し、データベースコミットなど)。これらは効果アウトボックスにステージングされ、Eとして書き込まれます。

Cordonはこれらのオブジェクトに対して3フェーズプロトコルを実行します:準備、検証、そしてコミットまたはアボート。準備フェーズでは、ランタイムはツールの意図を受け入れ、W∪Dにミューテーションを記録し、効果をEにリダイレクトして解放しません。検証フェーズでは、ランタイムは4つのチェックを1つの単位としてまとめて実行します:系統グラフG、アクティブな権限セットA、E内のステージングされた効果、および宣言された制約タプルC。このチェックは単一のブール結果valid(T, C)を導き出します。コミットまたはアボートフェーズでは、trueの結果がシャドウ状態を昇格させ、E内の承認された効果を解放します。falseの結果はEをブロックし、W∪Dをトランザクション開始前の状態にロールバックし、完全な監査レコードを書き込みます。

調整エージェントのタスクはアボートブランチで終了しました。E内の送金要求は保留状態を離れることはありませんでした。検証により、その系統が信頼できないメモフィールドにまで遡ることが判明したためです。

Cordonは、同じアイデアに基づいて構築されたいくつかのトランザクションモデルの1つであり、それぞれ範囲が異なります。AI-Atomic-Framework(略称ATM)は、共有リポジトリまたはワークツリーへの同時書き込みを管理します[6]。ATMはタスクの8つの要素を1つのガバナンスチェーンに編成します:

タスクの意図

そのリポジトリスコープ

禁止述語のセット

それが管理するパス

必要な成果物

検証コマンド

証拠義務

タスク方向のエポック

コンテンツ識別子ブローカーは、このチェーンに対して共有ミューテーションを承認します。ドメイン固有のアダプターは、書き込み意図をセマンティックアトム(既知の読み取りおよび書き込み依存関係を持つ具体的なソース範囲)にマッピングします。コードベースに特定の領域に対して定義されたアトムがない場合、ATMは代わりに仮想アトムを作成します。これは一時的で監査可能なユニットです。これにより、ブローカーは候補書き込みを比較し、書き込みが共有パスに到達する前に暫定的な競合キーを割り当てることができます。

Mnemosyneランタイムに実装されたATPは、異なる障害モードを対象としています:下流の依存ステップを孤立させる古い提案と補償[3]。ATPは計画モデルを、それ自体にはトランザクション権限のない信頼できない提案者として扱います。これは提案非権限と呼ばれる特性です。決定的なコミッターのみが状態を変更できます。これによりATPはその中心的な保証、すなわち知能切り離し正しさを得ます:モデルが幻覚を起こしても、ドリフトしても、完全に失敗しても、コミットされた状態は正しいままです。2番目の保証である証拠保存修復は、修復アクションがそれをトリガーした証拠を削除または隠蔽できないことを要求します。中断により既に承認された提案が無効になった場合、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" } }

3つのフィールドが設計の重みを担っています。冪等キーは、再試行されたコミットが宛先で送金を重複させるのを防ぎます。lineage_data内の来歴ダイジェストにより、バリデーターは調整エージェントの送金をユーザー発行の指示ではなくメモフィールドまで追跡できました。検証状態は、上記の検証フェーズを経てのみ保留から承認に移行できます。レコードがまだ保留中にそれを解放するコードパスはありません。

ピボット境界のためのSagaステップ

アウトボックスは、後続のステップが失敗したときにすでに不可逆的である可能性がある、ステージングされた効果のシーケンス全体でコミットとロールバックが何を意味するかを正確に説明する必要があります。これは分散システムからのSagaパターンであり、固定された事前作成コードパスではなく、モデルが生成する一連の提案に適応されています。

Sagaは順序付けられたサブトランザクションのシーケンスS=⟨T1​,T2​,…,Tn​⟩であり、各サブトランザクションはシステムの状態空間に対する状態遷移演算子です。シーケンスは3つのクラスに分割されます。ピボットインデックスpより小さいiに対する補償可能なステップTᵢは、 [AIコスト管理のため切り捨て]