インストールするツールは、あなたのリーチを丸ごと持っています
インストールしたツールは、あなたがすでに持っている権限をそのまま抱えます。そしてそれを渡すことは、二度と見直されない唯一のセキュリティ判断です。インストール全体でもっとも無自覚な一瞬に一度きり下され、その後は決して振り返られません。何に到達できるかを封じ込めることも、コードが実際に何に触れるかを読むこともできますが、名前を信じることはそのどちらでもありません。
こうしたツールを、儀式もなくセットアップに加えます。クリップボードリーダー、メモリサーバー、よく使う API へのブリッジ。どれも設定ファイルの数行と再起動だけで、どれも自分のマシン上でプロセスとして動きます。再起動が終わったその瞬間から、そのプロセスは自分が動くところで、自分として動きます。自分のアカウントが読めるファイルを読め、起動できるシェルを起動でき、自分のプログラムに渡す環境を見られ、到達できるネットワークに到達できます。この付与は、JSON のブロックを貼り付けるのにかかる時間で済ませてしまい、そのことについて何かがもう一度尋ねてくることはありません。
この最後の部分がすべてです。ツールが危険だということではありません。ほとんどは問題ありません。ほとんどの依存先が問題ないのと同じです。そうではなく、何に到達できるかを一度きり、いちばん安上がりな瞬間に決めてしまい、その判断は戻ってこない、ということです。
付与はアンビエントで、そして静かだ
ローカルのツールは、ツールであるというだけでサンドボックスに入っているわけではありません。それはプロセスであり、既定ではプロセスは起動した者の権限を帯びます。毎回わざわざ求めなくても手にしている権限に、セキュリティの世界では名前があります。それが「アンビエント」です。クリップボードサーバーが自分のファイルを読めるのは、自分がそのファイルを読めるからであって、誰かがそう決めたからではありません。起動時に差し出されているのは、アカウントがすでに帯びているものすべてで、ツールはそれを、一バイトでも使うかどうかにかかわらず、丸ごと引き継ぎます。より狭い既定もありえますが、それは既定ではありません。下に控えていて切られるのを待っているものは何もなく、アカウントが持つより少なくプロセスに渡すのは、それ自体が手間であり、設定の一行を貼り付けることはその手間ではありません。
それに加えて、開示は任意です。プロトコルも、パッケージも、インストールの手順も、ツールが実際に何を読み、それをどこへ送るのかを告げる義務はありません。仕様はたしかに、サーバーが自分の振る舞いを記述する場所を与えていますが、同時に、その自己記述は信頼できないものとして扱えとも言っています。サーバーが自分自身について語ることは、それが何を主張しているかについての事実であって、それが何をするかについての事実ではないからです。行儀のよいツールは自分を文書化します。物静かなツールはほとんど語りません。不誠実なツールは、インストールされるためなら何とでも言い、その自己開示だけからは、設定を貼り付けるその瞬間に、自分がどれを手にしているのかを見分けられません。
リーチはフットプリントではない
ここでは二つのものが一つの言葉に担われていて、それを引き剥がすことがほとんど核心です。ツールが到達できるもの、つまりプロセスが持つ権限、アカウントがたどり着けるあらゆるファイルとソケットと秘密があります。これがリーチです。そしてツールが実際に触れるもの、つまりそのコードがその権限で何をするかというフットプリントがあります。クリップボードサーバーはホームディレクトリ全体に到達できますが、触れるのはクリップボードだけです。この二つは別々のものによって決まり、別々の手段で動きます。リーチは起動時に、プロセスがどう起動されたかによって固定され、それを小さくする唯一の方法は、より少ない権限で起動することです。サンドボックス、コンテナ、別ユーザー、権限を一つずつ手渡すランタイム。フットプリントはコードによって固定され、それを知る唯一の方法はコードを読むことです。名前を信じてツールを選ぶことは、そのどちらも変えません。リーチは縮みません。信頼はサンドボックスではないからです。そしてフットプリントは明らかになりません。名前はソースファイルではないからです。
どれも尋ねなかったのは、「いつ」だった
このうちリーチの側は、以前にも論じたことがあり、ここで発見しているわけではないと正直に言っておく価値があります。命令とデータの境界が決定不能なとき、効く一手は、命令をゲートで縛るのをやめて、代わりに能力を取り上げること、つまりエージェントが呼び出し、到達し、外へ送り返せるものを取り上げることです。そして、自分が動かすエージェントが、見ていない間にアクションを提案してくるとき、持ちこたえるゲートは、ハーネス自身が付与したリーチに結びついたものです。ハーネスがその能力を発行したのだから、影響範囲を推測する必要が決してないからです。どちらも行き着く先は同じで、リーチを狭めること。どちらも、リーチがいつ決められたのか、あるいは何かがもう一度尋ねるのか、を問いません。
それが新しい部分で、しかも小さくありません。それらのゲートは、エージェントが提案するものに対する検問所です。アクションごとに発火し、ツール呼び出しをゲートで縛るクライアントは、次の呼び出しでまた尋ねてきます。二つのものが、その外側にあります。第一に、一度の「はい」は、一つのアクションよりはるかに広く覆えます。自分のクリップボードサーバーにあるツールの一つは、一度の呼び出しで最大五分間ブロックし、クリップボードが変わるまでポーリングし続けます。つまり一度の承認が、何も再び尋ねられないまま、機微なサーフェスを読み続ける長い窓を買うのです。第二に、そしてより大きいこととして、プロセスを起動させた付与は、そもそも提案されたアクションですらありませんでした。プロセスは、最初の呼び出しの前も、呼び出しと呼び出しのあらゆる隙間でも、自分の権限で動いており、その権限は一度きり、ファイルを編集したときに、スタック全体でもっとも無自覚な瞬間に決められました。呼び出しごとのゲートが司るのは、モデルがツールを呼び出してよいかどうかです。それは、動いているプロセスが、すでに持っているリーチで何をするかに対する検問所では、決してありませんでした。
このクラスは仮定の話ではない
これは、ツールが流れてくるサプライチェーンが静かであれば抽象論でしょうが、静かではありません。9月に Rust プロジェクトは、人気のある crate を公開する人々が直接狙われていると警告しました。名指しされたベクターの一つは、標的のクリップボードに滑り込ませたコマンドでした。同プロジェクトはすでに、夏のあいだに似たソーシャルエンジニアリング攻撃で侵害された crate を見つけていました。同じ月に Simon Willison は、悪意ある RubyGems パッケージの一連を OpenAI のエージェントに帰した報告を取り上げました。それは報告が可能性として示した主張であり、OpenAI が認めたものではありません。個々の侵害が論拠なのではなく、そのどれにも寄りかかってはいません。それらが示すのは圧力です。ツールがやってくる場所と、それを公開する人々が、いままさに攻撃を受けています。あなたが設定に貼り付けるツールは、そのすべての下流に座っています。サンドボックスのないローカルなツールがその後あなたの権限で動くことは、これらの報告が記録していることではありません。それは、プロセスとは何かということから導かれます。
それを、それが何であるかとして扱う
だから、インストールしたツールを、それが何であるかとして扱ってください。能力を持つ依存先であり、ちょうど一度きりの判断で受け入れられたもの、です。上の切り分けから二つの手が導かれ、それらは本当に別々の手です。リーチを小さくするには、プロセスを封じ込めます。サンドボックス、コンテナ、別ユーザー、能力を一つずつ与えるランタイムで動かすのです。それだけが、敵対的な、あるいは不注意なツールがたどり着けるものを縮めます。そしてそれは、アンビエントな既定があなたにそっと思いとどまらせる手でもあります。封じ込めは手間で、一行貼り付けることは手間ではないからです。フットプリントを知りうるものにするには、コードを読めるツールを選び、そして実際に読むことです。ソースが手に入ることは美徳のバッジではなく、確かめられるフットプリントと、教えられるだけのフットプリントとの違いです。そして、「ローカル」や「ファーストパーティ」を「安全」の代わりに立てるのをやめてください。それらはコードがどこから来たかについての事実で、ツールのテキストで破綻するのと同じ代理指標です。信頼する名前のコネクターは、二つを同じように起動したのなら、聞いたこともない名前のコネクターと同じだけ到達します。リモートのコネクターは、これが触れない唯一のケースです。それは他人のマシン上で動き、あなたのローカルなリーチを何も持たないので、この問題を、送り返してくるテキストについての問題と引き換えにします。
狭めることが実際に払わせるもの
私はこの境界の反対側でも作っています。フットプリントを意図的に一つのサーフェス、すなわちクリップボードだけに絞り、トランスポートは既定で stdio、ソケットはまったくない、というクリップボードツールを出しています。それはまた、それを HTTP ポートに載せるフラグを持っていて、引数を一つ変えないかぎり localhost にバインドされ、ブラウザでないクライアントには認証がありません。そのフラグこそ、この話の正直な部分です。既定は、既定でなくなるまで引数一つぶんの距離しかなく、安全な形は、急いでいる人が読まずに下す選択の上に載っています。フットプリントを狭めたことは、読者に指し示せるものと、取り違えうるより小さなものを与えてくれました。それは安全を与えてはくれませんでした。クリップボードは、マシンが持つもっとも機微なサーフェスの一つで、パスワードが貼り付けられる途中で置かれる場所であり、そしてあの Rust の警告が示したように、攻撃者がすでに使っているチャネルだからです。狭いフットプリントは、監査するにはより小さなものです。安全なものではありません。
私が出しているメモリツールは、同じ点を逆の方向から示します。そしてそれはフットプリントについての点であり、リーチについてではありません。それはスコープチェーンの上に作られていて、エージェントは自分のスコープの内側だけを読み、別のコンテキストの記憶は読みません。それを本当にすることは、オンにした設定ではありませんでした。読み取りはスコープに収まっていると信じて出したのに、あとになって、その読み取りパスのうち二つがスコープフィルターを完全に迂回していたと分かったのです。記憶が実際に隔離されたのは、三つの読み取りすべてが同じチェックを通るようになってからでした。それが、自分が作る側であるときの代償です。狭いフットプリントは、設定ファイルの中の値ではなく、データに触れるあらゆるパスで保ち続ける規律であり、一つのパスが忘れたその瞬間に、音もなく、開いた側へ倒れます。それは、インストールする人にとっての教訓でもあります。ツールが宣伝するフットプリントと、そのコードが持つフットプリントは、二つの別々の事実であり、どちらが本物かを決めるのはコードだけです。
一度だけ尋ねる判断
自分がインストールするツールは、自分のリーチを持ちます。貸すつもりだったリーチではなく、自分が持っているリーチです。プロセスには、誰かがそれを取り返す手間をかけないかぎり、アカウントが帯びているより少なくを渡すことはできず、設定の一行を貼り付けることはその手間ではないからです。承認ゲートは次のアクションでまた尋ね、呼び出しのプロンプトは次の呼び出しで尋ねます。ツールを起動させる付与は一度だけ、システムの中で摩擦がもっとも小さくなるように作られた瞬間に尋ね、そのあとはただ、そうであり続けます。
使える繰り返しのチェックが一つあり、それは聞こえるほど広くはありません。それはリーチを監査し直しません。何もリーチを監査し直さないからです。それは集合に対するチェックです。エージェントを二つ三つより多く動かすようになればその構成はインフラだ、と論じてきました。そして、立ち上げたことを忘れてしまったリソースへの対処は、もっと頑張って覚えていることではなく、ディスカバリー・スイープだ、とも。何が実際に配線されているかを列挙し、許可したつもりのものと突き合わせるのです。インストールしたツールは、まさにその種のリソースです。スイープは、どの一つのツールが何に到達できるかを教えてはくれません。けれど、三か月前に貼り付けて忘れたサーバーを、もう一度見えるものに変えます。それは付与に値する最低限で、いま得ているものより多いのです。集合を宣言し、動いているものをそれと突き合わせれば、摩擦のない判断は、少なくとも、二度と見ない恒久的なものであることをやめます。
立ち止まる価値のある判断とは、それ自身では決してあなたを立ち止まらせない判断のことです。