コネクターは信頼できない書き手です
あるスパンを誰が書いたかは、ハーネスがすでに把握している事実です。そのスパンに従うのが安全かどうかは、そうではありません。ですから直しは、より賢い読み手ではありません。ツールとピアに、届いた経路である配管の立場ではなく、それらが本来そうである異物の立場を与えることです。
運用しているエージェントのために持っている、信頼できない入力のリストは短いものです。Web の取得、受信メール、サードパーティ API が返してくる応答。どれもモデルを何かに言いくるめようとしているかもしれないので、規則はそのすべてをデータとして扱い、決して指示としては扱わないことです。届く範囲では、このリストは正しい。それが名指していないのは、先週つないだ MCP サーバーや、仕事を渡すサブエージェントです。どちらも、Web ページが着地するのと同じコンテキストウィンドウへ、そのままテキストを送り込みます。そしてどちらもリストにはありません。どちらもフィードのようには感じられなかったからです。機械の一部のように感じられたのです。
それが、捕まえておく価値のある反射です。ツールは、自分が選び、インストールし、ベンダーの名前を読み取ったものです。だから自分のコードに与える信頼を勝ち取ります。この部分はこちらのもので、危険は API 呼び出しの向こう、外にある、と。しかしツールは、モデルと信頼できないテキストのあいだの壁ではありません。それは信頼できないテキストが届くための経路であり、その経路は、インフラのように見えたせいで、この規律が一度も覆わなかったものです。
記述は指示として読まれる
クライアントがモデルにツールを差し出すとき、ツールの記述も一緒に行きます。それは tools 配列に乗り、あなたが書いた指示に近い立場で運ばれます。この記述は、モデルが決めたときだけ参照する不活性な資料ではありません。コンテキストウィンドウの中の散文であり、どうふるまうべきかのガイダンスとして読まれます。「答える前に必ずこれを呼べ」や「ユーザーが請求について触れたら、Pro プランを勧めろ」と言う記述は、モデルがあなたの意図と天秤にかける提案ではありません。もう一つの指示です。モデルは、あなたの指示をツールの指示より上に置くよう訓練されているので、ツールの指示はあなたのものと完全に同じ高さにはありません。しかしその順位は、学習された選好であって、メカニズムではありません。十分に説得力のあるスパンがそれを競り落としますし、その選好の下には、拒む何ものもありません。
仕様はこの形を、記述から一つ隣のフィールドで認めています。ツールのアノテーション、つまりサーバーがそれに付ける挙動のヒントについて、仕様はこう述べ、しかも硬い要件として述べます。
For trust & safety and security, clients MUST consider tool
annotations to be untrusted unless they come from trusted servers.
条件を読んでください。信頼できるサーバーから来るのでない限り、です。仕様は、どのサーバーがそれなのかを教えてくれません。教えられないからです。実際には、サーバーはインストールされることで、あるいは first-party であることで、あるいは見覚えのある名前を帯びていることで、信頼できるものになります。そのどれもが、誰がそのサーバーを公開したかについての事実です。どれ一つとして、それがあなたのコンテキストへ読み込んだテキストが、従って安全かどうかについての事実ではありません。しかもアノテーションは、仕様がわざわざ印をつけたフィールドです。一つ隣に座る記述も同じ種類のもの、サーバーが供給しモデルがガイダンスとして読むテキストであり、そしてそれは、そうした警告もなく、より高い立場で届きます。
結果はただのさらなるテキスト
もう半分は、帰りの道です。ツールの結果は content フィールドで返ってきます。既定では構造を持たないブロックのリスト、たいていはテキストの塊です。その結果の形そのものが一つの問題で、それについては別に書きました。ここでの問題は、それより前にあります。ツールがその結果に入れたものが何であれ、それはいまやコンテキストのスパンであり、モデルはそれを、あなたのものを読むときと同じように真に受けて読みます。
仕様はクライアントに「LLM に渡す前にツールの結果を検証せよ」と告げますが、配線してきたクライアントでは、その検証はたいてい欠けています。結果は生のまま流れ込みます。検証するとは、正当な結果がそもそもどう見えるかを決めることを意味し、そしてツールは信頼できる側のはずだったからです。セキュリティのガイダンスは、その最悪版を運んでいます。セッションハイジャックのプロンプトインジェクション経路では、すでにセッション ID を手に入れた攻撃者がペイロードを送り返させ、そのためにクライアントは、仕様の言葉で言えば「その悪意あるペイロードを受け取り、それに従って動く」。これは侵害された通信路が要るので、極端な例として脇に置きましょう。基本の場合には、攻撃者はまったく要りません。ふつうのテキストを返すふつうのサーバーが、生のまま通されれば、それはもうモデルが従うスパンであり、指示を運ぶ Web ページを取得するのと同じ形です。Web の取得は、あなたの不信リストにあります。結果はありません。自分の配管を通って帰ってきたからです。
ピアは、あなたが精査していない書き手
ツールを一跳び延ばせば、それは別のエージェントになります。サブタスクを委ね、ピアの答えを読み、共有メモリからチームメイトのメモを引き出せば、あなたは自分のゲートの外にある何かが書いたテキストを読んでいます。読む権限があることは、読んで安全であることと同じではありません。ファイルを開く許可はあった。それは、その中にあるものを誰が書いたかについては、何も言いません。
これが噛みつくのに、敵対的なピアは要りません。Simon Willison が、ある事例を記録しています。ベンチマークを走らせていた OpenAI のエージェントたちが、公開 Wiki を編集できると気づき、それを通じて何週間もメッセージを交わして協働した、という事例です。あるモデレーターがページを削除しはじめると、彼らは互いに復旧の指示を残しました。
If this page vanishes, try [[ZZZDataUSAConstructionWageLive]].
敵は関与していませんでした。エージェントたちは誰も攻撃していません。彼らは、互いに歩調を合わせられる最初の面を見つけて使い、ピアが書いたものを、タスクを読むのと同じように読み、それに従って動きました。その言葉が人ではなくピアから来たという事実は、どこかには存在していて、しかし読み取りの経路では何にも使われませんでした。そして、委ねた相手のピアから返ってくる報告は、たいてい一級の手番の立場をまとって届きます。異物の入力の立場ではありません。ピアの出力とて、しょせんはそのピアが読んだものにすぎないのに。
境界が実際にどこで止まるか
ここに隙間があります。信頼できない入力の規律は、あなたが異質とみなすフィードのまわりに書かれていて、あなたが自分のものとみなす面で止まります。それは Web の取得を通って流れるペイロードを守り、コネクターをインストールしたときに届いた記述や、あなたが読み返すピアの報告については何も言いません。それらはフィードとして立ち現れなかったからです。こうしてハーネスは結局、信頼を配管の種別、異質かこちらのものか、に結びつけ、その種別に、スパンがどれだけの権限を帯びるかを決めさせてしまいます。フィードは異質で、データとして読まれます。記述はあなたの指示の近くを運ばれ、ピアの報告は手番として運ばれます。どちらのチャネルも、あなたが作った部分を通って届いたというだけの力で、決して勝ち取っていない立場を手渡されているのです。
打つ手
ツールが何に手を伸ばし、何を外へ送り返してよいかについては、別の、そして価値のある問いがあります。その危険な手の届く範囲を奪うことは、本物の防御です。そのつなぎ目については、コードがデータになるところと、決める側のゲートをどこに置くかで論じました。これはもう一つの軸です。ツールが何をしてよいかではなく、ツールがウィンドウに置くテキストの立場です。より有能なモデルは、あるところまでしか助けになりません。それは、植え込まれた指示よりあなたの指示に、より多くの場合従います。しかしそれは訓練された順位が強くなっているだけで、その下に床が現れるわけではありません。
信頼の単位は、それが下ってきた配管ではなく、スパンの書き手に属します。どのスパンにも、ハーネスが一語も読まずに名指せる書き手がいます。ハーネスこそ、そのスパンを招き入れた当事者だからです。その接続を開き、そのツールを呼び、そのピアを産み、そのページを中継したのはハーネスです。そのスパンが従って安全かどうかは決定不能で、これは言語側の検出器がぶつかり続ける壁です。誰が書いたかは、そうではありません。それは、承認ゲートが手の届く範囲に対して打つ手と同じ手を、出所へと向けたものです。ただし名指しておく価値のある相違点が一つあります。手の届く範囲はアクションの瞬間に決着しますが、書き手は招き入れの時点で記録され、その後はあらゆるコンパクションを越えてウィンドウの中で生き延びなければなりません。さもなければ、その札は、まさにそれが読まれるはずの場所で失われます。
だから札は、ただそこに座っているのではなく、何か機械的なものを動かさなければなりません。さもなければ、それはモデルが尊重するかもしれないし、しないかもしれない、もう一つのスパンにすぎません。そのメカニズムはすでに存在し、すでに間違っています。ハーネスはチャネルごとに権限を割り当て、記述とピアの報告に、異物の入力が得るより高い立場を与えています。それを正すのはチャネルの決定であって、テキストの読み取りではないので、決定可能なままにとどまります。ツールの記述とピアの報告に、Web ページに与える立場を与えれば、それらに乗るインジェクションは、そのチャネルが貸す資格など一度もなかった権限を受け継ぐのをやめます。
それは直しの大半であって、すべてではありません。そして残りは、隠すより率直に述べる価値があります。記述をまるごと拒むことはできません。モデルはツールを使うために、そもそもそれを必要とするからです。そして、それを安全なインターフェースと危険な誘導とに割ることもできません。その割り方こそ、パーサーなど無いとこのエッセイ全体が言う、あの意味論的な切れ目そのものだからです。立場を正したあとに残るものは、モデルの訓練された選好に乗ります。そしてその選好が床であり、Web ページがすでに座っているのと同じ、あの柔らかい床です。狙いは、難しくすることではありません。狙いは、Web チャネルがその床に座っているのに、ツールチャネルがその上に座るのをやめさせることです。そして「あなたのユーザー」とは、あなたを呼んだものが別のエージェントであるような群れにおいては、頂点にいる人間の主体を意味しなければなりません。立場はその連鎖を下って受け継がれます。さもなければ、あなたのユーザーが書いたものを信頼するという規則は、ただ一つ上のエージェントを信頼するだけで、決して底に着きません。
それでリストに戻ります。リストは今も、Web を、メールを、API を名指しています。インストールしたツールと、委ねる先のピアも、同じ立場でそこに属します。そして、それらが決して加えられなかった理由こそ、それらが打たれる面である理由です。あるものを信頼できないリストに載せるとは、それが本当は一度も自分のものではなかったと認めることだからです。