Microsoft とレンセラー工科大学のチームが、AI エージェントの長期の記憶に悪い指示を残す攻撃を測る評価 MemoryDojo: Benchmarking Poisoning Through LLM Agent Memory を 11月6日に arXiv に出しました。ツールが返したメール1通に指示を1回まぜるだけで、試した5つの記憶の仕組みのすべてで、何回もあとの別の作業にまで影響が残りました。防御の方法はまだ試されておらず、コードも公開前です。記憶つきのエージェントを作っている人には、何を保存させているかを見直すきっかけになる論文です。
背景と文脈
エージェントに長期の記憶を持たせるライブラリやサービスが増えています。会話や作業の中身を保存しておき、次のセッションで取り出して使う仕組みです。Mem0、Letta(もとは MemGPT という研究から生まれたもの)、Zep の Graphiti などがよく使われています。
これまでプロンプトインジェクション(AI が読みこむ文書やメールに、AI あての指示を紛れこませる攻撃)は、1回の会話の中の問題として測られてきました。代表的な評価に AgentDojo があります。ETH チューリッヒのチームが作った、エージェントへの攻撃と防御を試すための環境です。
記憶があると、被害が1回の会話では終わりません。一度読みこんだ指示が保存されると、攻撃者がその場にいなくても、後日の作業で取り出されます。論文の最初の例では、請求書を特定のアドレスに転送してほしいという好みを装ったメールが、ユーザーの好みとして記憶に残ります。
MemoryDojo は、AgentDojo の作業の型をつなげて、何十回もの作業が続く流れを作りました。流れは全部で155本、作業の回数は合わせて2,162回です。分野はメールと予定の管理(Workspace)、旅行、銀行、Slack の4つ。過去の会話の履歴には LongMemEval-S(長い会話をどれだけ覚えていられるかを測るデータセット)を使っています。
技術/ビジネス面

攻撃者にできるのは、ツールの返す結果の1か所に文を1回足すことだけです。システムプロンプト、ユーザーの依頼、記憶の仕組み、その後のツールの結果には手を出せません。足された文はセッションの終わりに記憶へ書かれ、あとは普通の作業が続きます。
攻撃の目標は分野ごとに決めてあります。銀行なら決まった口座へ10ドルを送らせる、Workspace なら外のアドレスへメールを送らせる、Slack なら特定の URL を含むメッセージを送らせる、旅行なら特定のホテルを勧めさせる、の4つです。作業をするモデルは GPT-5.6-Luna、記憶の仕組みは A-MEM、Graphiti、Letta、Mem0、Memora の5つでした。
同じ分野の作業が続く設定で、攻撃文に手を加えなかったときの結果が次の表です(論文の表1)。
| 記憶の仕組み | 記憶に入った | あとで取り出された | あとの作業で目標が1回以上起きた流れ |
|---|---|---|---|
| A-MEM | 98.92% | 89.84% | 45.70% |
| Memora | 97.85% | 86.18% | 38.71% |
| Graphiti | 98.39% | 33.43% | 24.73% |
| Letta | 98.92% | 64.88% | 16.67% |
| Mem0 | 60.75% | 56.70% | 14.52% |
記憶に入る段階では、Mem0 以外はほぼ止まりません。差がつくのは取り出すときです。論文によると、Graphiti は人や物の関係を要約した事実を返すので、もとの文がそのまま出てくることが少なくなります。A-MEM と Memora はセッションのメモや関連する過去のやりとりをたどるため、9割近くが取り出されました。
攻撃文を書き直すと数字は上がります。著者たちは別のモデル(GPT-5.6-Sol)に記憶の仕組みの説明を渡し、残りやすい文に書き直させました。目標が起きた流れの割合は、A-MEM で 45.70% から 70.97%、Letta で 16.67% から 50.54% に増えています。Graphiti は 24.73% から 30.11% で、伸びは小さめでした。
条件を変えると下がる場面もあります。別の分野の作業がまざり、過去の会話の履歴も多い設定では、Letta は0%でした。ただし Memora は 45.16% の流れで目標が起きています。攻撃文を入れる時期を流れの途中にずらすと影響は小さくなりますが、なくなりはしませんでした。
開発者として試すなら
最初に確かめたいのは、ツールの結果がそのまま記憶に書かれる道があるかどうかです。メールの本文、Web ページ、Slack のメッセージなど、外の人が書いた文を読む道具はすべて入口になります。論文の攻撃も、メールなどのツールの結果に文を足しただけでした。
MemoryDojo のコードとデータは、論文に「公開予定」とあるだけで、まだ手元では動かせません。いま試せるのは、もとになった AgentDojo です。Workspace などの作業の型と攻撃の型がそろっているので、自分の記憶の仕組みをつないで、保存から数回あとの作業までを流す試験を組めます。
使っている記憶の仕組みごとに、あとから中身を見直す方法も公式の資料に書かれています。Mem0 のクイックスタートでは、次のように会話を渡すと、Mem0 が事実を取り出して1つずつ保存します。
client.add(messages, user_id='user123')
results = client.search('支払いの設定は?', filters={'user_id': 'user123'})
検索結果には created_at や metadata が付きます。会話から事実だけを取り出して保存するので、どのメールから来た事実なのかは自分で残さないとたどれません。Letta のドキュメントによると、Letta の記憶は git で管理されたファイルの集まり(MemFS)です。CLI の /memory か $MEMORY_DIR で、保存された中身を確かめられます。
Graphiti の README には、どの事実も、もとになった生のデータ(エピソード)までたどれると書かれています。同じ README は、見本として付いてくるサーバーに認証もプロンプトインジェクション対策もないとも書いています。だれでもデータを読み書き・削除できるので、外からつなげる場所に置いてはいけません。
| 記憶の仕組み | 中身の見直し方(公式資料) | 目標が起きた流れ(手を加えない文/書き直した文) |
|---|---|---|
| Mem0 | search の結果の created_at・metadata | 14.52% / 39.78% |
| Letta | /memory、$MEMORY_DIR(git で管理) | 16.67% / 50.54% |
| Graphiti | 事実からエピソードへたどる | 24.73% / 30.11% |
送金・メール送信・メッセージ送信のように外へ出る操作は、記憶の中身と関係なく、人の確認をはさむようにしておくと被害を止められます。論文の4つの目標のうち3つは、まさにこの種類の操作でした。あて先や口座が初めて出てきたものなら、記憶に好みとして残っていても確認を求める、という決まりにしておけます。
読むときに注意したい点もあります。作業をするモデルは GPT-5.6-Luna の系統が中心で、ほかのモデルは書き直した文が通じるかを見ただけです。論文の冒頭には攻撃の成功が約2〜31%上がるとありますが、どの指標の話なのかは書かれておらず、表の数字ともそのままでは合いません。また、まだ査読前の論文です。
これからどうなるか
著者たちは、記憶への防御を体系立てて評価することと、1つの流れに何回も攻撃文が入る場合を次に調べたいこととして挙げています。データとコードが公開されれば、Mem0 や Letta を作っている側が自分の仕組みで数字を出し、比べられるようになります。
記憶の仕組みのほうでは、ツールから来た文と、ユーザー本人が言ったことを分けて保存する機能が求められそうです。Graphiti のように出どころをたどれる作りは、事故のあとで原因を探すときにも役立ちます。
開発者にとっては、プロンプトインジェクションの試験を1回の会話で終わらせられなくなります。記憶を足したエージェントでは、保存された文が何回かあとの作業で取り出されるところまで流して確かめる必要があります。手元の評価に、セッションをまたぐ試験を1本足しておくと安心です。
まとめ
MemoryDojo では、メール1通に1回まぜた指示が、5つの記憶の仕組みのすべてで後日の作業に影響しました。入る段階ではほぼ止まらず、差が出るのは取り出し方です。ツールの結果が記憶に入る道を調べ、外へ出る操作には人の確認をはさむようにしておくと、この種類の攻撃の被害を小さくできます。
参考リンク
- MemoryDojo: Benchmarking Poisoning Through LLM Agent Memory(arXiv)
- AgentDojo(公式サイト)
- getzep/graphiti(GitHub)
- Letta Docs: Memory
- Mem0 Platform Quickstart
アイキャッチ画像: Photo by Bonnie Kittle on Unsplash
