Dev

あなたの承認ゲートは、いまや推測です

セキュリティ境界は、それを越えるために作られたただ一つのアクションで判定されます。そして類似性で判断するモデルは、まさにそこで最も弱い。無人での許可は、ハーネス自身が渡すリーチ、書き込みスコープ、ネットワーク、クレデンシャルに置かれるべきで、説明できないものは拒否します。モデルを境界として信頼すれば、プロンプトインジェクション検出が決して閉じられなかった継ぎ目を、あなたはもう一度作り直すことになります。

自分が運用しているコーディングエージェントを、ツリーへの実際の書き込み権限はあるが本番や外の世界への経路はない、サンドボックス化されたチェックアウトの中で作業させながら、もう何も尋ねて止まらないモードに切り替えました。エージェントはタスクを読み、アクションを取り、そして何かが、見ていない間にそのアクションを走らせても安全かどうかを、その都度判断して返します。かつては、書いておいたルールが、名指しされたアクションについてその判断を下していました。いま、ルールが名指ししないすべてについてそれを下すのは、分類器です。アクションを読み、それが安全に見えるかどうかを判断する 2 つ目のモデルです。かつて境界があった場所に、判断が据え付けられました。

ゲートは推測することを覚えた

それがリリースノートとドキュメントに到着するのを見て取れます。auto モードは決まった順序で動きます。まずあなたの明示的なルールが解決し、通常の読み取りとツリー内の編集は静的なチェックで通され、残りすべて、シェルコマンド、プッシュ、ネットワーク呼び出しは分類器へ行きます。分類器は別個のモデルです。保留中のアクションとその周りの会話を読み、アクションが安全に見えるかどうかの判定を返します。そして Claude Code はいま、それを形づくるルールを見て編集するためのタブを /permissions に備えています。インターフェースの先を読んでください。ルールがまだ名指ししていない、結果を伴うあらゆるアクションについて、モデルが決定を下し、アクションを、それが何に似ているかで判断します。モデルはアクションを安全だと証明しません。類似性から推測し、推測を返します。トリアージには、それが正しい道具です。攻撃者が越えようとしている一線に対しては、それは誤った道具であり、その誤りはデモには現れません。それを打ち破るために作られた、ただ一つのアクションで現れます。

境界は敵対的な入力で判定される

問題は、分類器が自分の仕事を下手にこなすことではありません。敵対的なアクションこそが、境界が存在する目的のすべてであり、そしてそこがまさに、類似性で判断するモデルが最も弱い場所だということです。通常の流れ、何千もの安全な読み取りと編集は簡単な部分です。モデルはそれをこなし、こなしながら正確だと感じます。攻撃者はその流れから汲みません。攻撃者の仕事は、安全だと読める言い回し、フレーミング、無害に見える包みを見つけることであり、類似性で一般化する判断者は探索可能です。たいていそうした言い回しは存在し、それを見つけることが営みのすべてなのです。

これについて私は一つのエッセイをまるまる書きましたが、それが両側を入れ替えて戻ってくるとは見えていませんでした。レビューでは抜け出せないインジェクションは、一つの行に依っていました。ある境界は決定可能で、パーサーが指させる文法の中に印づけられており、ある境界は意味論的で、文字列が何を意味するかの問題であって、意味にはパーサーがないため、信頼できる検出器は存在しない。プロンプトインジェクションは意味論的な側に住んでいます。あなたがそれをフィルタすれば、敵はフィルタを回り込むように書き換えます。「このアクションは無人で走らせて安全か」は、同じ種類の問いです。それを承認ゲートの中へ移しても、部屋を変えただけで決定可能になりはしません。作られたのは、あなた自身のエージェントのアクションに向けられたプロンプトインジェクション検出器であり、それはそのクラスを定義する性質を受け継ぎます。

なぜかを、より鋭く見る道があります。アクションがその判断者に届く頃には、エージェントにそれを提案させたものは何であれ、すでに起きています。エージェント自身のコンテキストの中で、ゲートより上流で。分類器が意味を持つのは、すでに何かがエージェントを操ったアクションにおいてだけ、つまりインジェクションがすでに仕事を終えた入力においてだけです。インジェクションのアクションを捕らえるために作られたゲートは、その言葉を捕らえられなかったのと同じ素材でできています。これらのどれも、特定の製品の実証されたバイパスではありません。判断でできた境界が何を約束でき、何を約束できないかについての、一つの論です。

それが置き換えた人間、そしてなぜその交換のほうが悪いのか

これの一つのバージョンは人間を経路に残していて、それについても私は書きました。一人の人間に一時間あたり何百ものアクションを承認するよう頼めば、その人は反射で承認します。ゲートは劇場になります。分類器は疲れません。それは治療のように聞こえますが、治療ではなく、そうでない理由は正確です。疲れた人間は信頼できませんが、ノイズがあります。攻撃者は、通されてしまう言い回しを前もって計算できません。同じ人間が、日によって違うものを通すからです。分類器は信頼できず、かつ再現可能です。同じアクションは同じ判定を引き、だから通る言い回しは一度見つければ再利用できます。分類器が疲れた人間より不正確だ、ということではありません。通常のトラフィックで測れば、むしろ正確でさえあるでしょう。それは、分類器が探索可能であり、人間は、あらゆる失態にもかかわらず、そうではない、ということです。

両方の下にある動きは、私が何度も出会うものです。エージェントの健全さを読むウォッチドッグは、仕事が残す永続的な痕跡ではなく、エージェントが自分について送り出す拍動を信頼するとき、失敗します。ゲートは、アクションが到達できるものではなく、アクションについてのモデルの読みを信頼するとき、失敗します。その非類似こそが、教えるところの多い部分です。ウォッチドッグは足跡を読みますが、それはある一歩がすでに終わったからこそ存在します。ゲートには読むべき足跡がありません。永続的な何かが存在する前に決めなければならないからです。だから、それぞれが最後に頼る硬い信号は、種類が違います。あちらではすでに観測された効果、こちらでは要求されている能力です。同じ反射、硬い信号が手の届くところにあるとき軟らかい信号を拒むという反射が、二つの異なる硬い信号に向けられているのです。

推測である必要のなかった境界

ここでは、承認ゲートはインジェクションのようには囚われていません。安全性の問いは意味論的なままで、あなたはそれに決して答えません。答えることを拒みます。代わりに、決着をつけられるより狭い問いを立て、それが晴らせないものはすべて拒否します。その狭い問いは「このアクションは安全か」ではなく、また、かつて私が書いたような、ハーネスがアクションを見て、それが不可逆だと分かるかどうか、でもありません。分かりません。任意のコマンドが何をするかを決めるのは、作業着を着た同じ決定不能の問題です。ハーネスが決着をつけられる問いは、意味ではなくリーチについてであり、決着をつけられるのは、リーチを渡す当事者がハーネス自身だからです。このアクションはサンドボックスの外に書き込む必要があるか、ネットワーク接続を開くか、クレデンシャルを使うか、本番に触れるか。オーケストレーターはそれをコマンドを読んで推し量るのではありません。知っています。それらの能力は、オーケストレーターを通してしか手に入らないからです。かつて私は、残す価値のある割り込みは不可逆なものとサンドボックスの外のものだと論じましたが、それらを残せるものにしているのはこれです。オーケストレーターがその能力を発行したのだから、爆発半径を推測する必要は決してありません。自分が与えたリーチをゲートし、ルールや能力チェックが晴らせないアクションを、文法が式ノードを削除するように拒否します。モデルはなく、言いくるめる相手もいません。

ハーネスには決定可能な層のための部品がありますが、それを先頭には置きません。ドキュメントが記す決定順序は、あなた自身の明示的なルールを最初に置き、読み取りとツリー内編集を静的チェックで通し、それ以外のすべてをモデルへ送ります。それ以外のすべてこそ、危険な形が住むところです。フォースプッシュ、ハードリセット、本番デプロイ、トランスクリプトに印字されたクレデンシャル。これらは既定で、その形によって拒否されるのではなく、分類器の判断によって止められます。決定可能な部分は本物ですが薄く、その最も広い切片は、あなた自身が書く deny ルールです。曖昧な残余をモデルに手渡すことは誤りではありません。残余は本当に曖昧な部分です。誤りは、推測を最も許容できないアクションについて、モデルの判定を、より硬い一線の下の提案としてではなく、境界として立たせてしまうことです。

ベンダーは同じことを、同じドキュメントの中で言っています。会話の中で述べた境界は、とベンダーは注記します、チェックのたびにトランスクリプトから読み直され、コンテキストが圧縮されて消えると失われうる。確かな保証のためには、代わりに deny ルールを足せ、と。それがベンダー自身の手による、論のすべてです。それはあなたに告げています。分類器は軟らかい部分であり、たまたまその窓に何が載っているかに左右される。そして境界が本当に持ちこたえなければならないとき手を伸ばす先は、モデルが下す判断ではなく、あなたが書いたルールだ、と。

落とし穴、そして修復

落とし穴があります。これのどれかが敵を生き延びるかどうかを決める落とし穴で、チェンジログがそれを手渡します。ハーネスは、あなたの作業を破棄しうるコマンドの前に git status を自分で走らせ、コミットされていない作業が懸かっているかどうかをモデルに伝えます。そして、リポジトリ自身の設定が status.showUntrackedFiles=no を立てていても、untracked なファイルを報告するように、という修正が入りました。それをゆっくり読んでください。リポジトリの自己申告を信頼していたチェックは、まさにそれが検査しているリポジトリによって、汚れたツリーを綺麗だと告げられかねませんでした。ワークスペースが信頼されない脅威モデルでは、そして auto モードが入っていれば信頼されないのですが、それは敵が制御する入力を読むチェックです。

しかし、誤った入力を読むチェックはモデルではなく、その違いこそがそれを選ぶ全理由です。誤った権威に問い合わせる決定的なチェックは、推測するから不健全なのではありません。誤った場所を見ているから不健全なのであり、誤った場所を見ることは修復可能です。あなたはそれを、敵が所有しない入力、リポジトリのものではなくツリーについてのハーネス自身の視界へと向け直し、それは直ったまま留まります。まさにそれが出荷されたものです。モデルの判断には、そのような修復がありません。ある言い回しがそれをすり抜けたとき、あなたはそれをより真実な入力へ狙い直すことはできません。あなたは再訓練し、表面はずれ、探索は新しい表面の上でまた始まります。そこから落ちてくる規則は狭い。自動許可が乗ってよいのは、ハーネスが自分の統べるものから計算する事実の上だけで、ワークスペースの自己申告の上では決してならず、それらの事実が積極的に晴らせないものはすべて、判断されるのではなく拒否されます。

それへの反論はコストであり、それは本物です。ハーネスが積極的に晴らせないものをすべて拒否すれば、エージェントが役に立つ多くを拒否することになります。任意のシェルコマンドは何も晴らさず、これこそが、そもそも分類器を魅力的にする圧力です。私は以前、過剰な拒否は安全側に倒れず、運用者がゲートを引きはがすほうへ倒れる、と論じました。答えは、晴らせないアクションの先を予測することではありません。答えは、それらのうちより多くを晴らせるようにすることです。ハーネスが仲介するものを広げ、アクションが必要とするリーチのより多くが、名指しで許可も拒否もできるチャネルを通るようにする。すると、どのチャネルも説明できない残余は、本当に曖昧なものへと縮んでいきます。モデルはなお居場所を得られます、その仕事をその残余に切り詰められた上で。すでに拒否されたものを順位づけさせなさい。人を起こす価値のある稀なものが最初に浮かび上がるように。走ることを許されるものの集合を、モデルに広げさせてはいけません。予測が、外にあるものを整序するのではなく境界を拡大している瞬間、あなたは軟らかいイエスの流れへと逆戻りしていて、それこそ、この設計全体があとにしようとしたものです。

一つの規則を、二つの継ぎ目で読む

それは一つの規則に行き着き、二つの継ぎ目で読まれます。境界が決定可能であるところ、あるいはアクションが必要とする能力を仲介することで決定可能にできるところでは、それを計算してそのクラスを拒否しなさい。経路に知能を入れずに。知能こそ、敵が取引する相手だからです。境界が意味論的であるところ、意味に住みパーサーを持たない安全性の問いのところでは、自信ありげなモデルをそれに取り付けることで、自動許可の権利を買うことはできません。アクションが必要とするであろう能力をゲートするか、人間を残すか、あるいは間違っても安いところにアクションを留めておくかです。承認ゲートの中のモデル、名指しされていないアクションを無人で通すものとして信頼されたモデルは、そのどれでもありません。それは決定不能な側の自動許可であり、これらのエッセイが描くアーキテクチャが禁じるために作られた、まさにその一手であって、それがいま、ルールタブ付きの機能として出荷されています。それは、解けた問題から人間を外すのではありません。解けなかったほうから、人間を外すのです。

エージェントは午後じゅう、何の事故もなく走りました。そしてそれこそが、信じてはならない部分であり、寄りかかる部分ではありません。一度も失敗するのを見たことがない境界は、失敗しえない境界ではありません。推測は、誰もそれを試していない日には毎日通ります。それがほとんどの日です。誰かが試すその日には、それは以前の千のアクションに対して読んだのと同じ「安全」を読むでしょう。類似性を読むことが、それのする唯一のことだからです。ゲートの中のより賢いモデルは、決して修正ではありませんでした。ゲートは、はじめから推測の居場所ではなかったのです。

ディスカッション

コメント欄はありません。議論は X で行っています。

Max Nardit

Max Nardit

@mnardit

ほかの記事

ウォッチドッグは忙しいエージェントを殺し、行き詰まったエージェントを信頼する

長時間動くエージェントがまだ存在するかどうかだけを見るヘルスチェックは、難しい 2 つのケースの両方を取り違えます。健全なエージェントが不在に見えるほど静かになった瞬間にそれを殺し、プロセスがまだ生きている凍結したエージェントをそのまま通してしまうのです。直すべきは、より鋭いプローブではなく別の信号、すなわちエージェントが仕事をすることによってのみ残す永続的な痕跡です。行き詰まったエージェントはそれを伸ばすのをやめます。伸ばすこと自体が仕事だからです。

あなたがフォークしたサブエージェントは、すでに知りすぎています

エージェントの履歴には、迷い込んだあらゆる行き止まりが残っていますが、そのうちどれをすでに手放したのかを示すものは、そこには何もありません。その履歴をサブタスクに委ねると、捨てられたはずの推測が、確定した事実とまったく同じ顔をして届きます。なぜ多くの場合まっさらから始めるほうが勝つのか、書かれた指示書が継承に勝るのはいつか、そして仕事が、どんな指示書にも収まらない生きたものであるのはいつか。

あなたの指示ファイルはアドレッシングであり、断片化ではありません

すべてのエージェント指示ファイルを共通の標準に統合するのは、不要な重複を削除するように見えますし、プロジェクトのセットアップに関しては実際にそのとおりです。しかしこれらのドキュメントが抱えるものの大半は、1 つのものが散らばったコピーではありません。どの行が誰に当てはまり、誰が書いてよいかで仕分けられた、別々のアドレスです。その境界の 1 つは信頼境界でもあり、だからこそ 1 つの万能ファイルという小綺麗な解決策は、リポジトリのテキストにあなた自身の常設ルールと同じ権限を、そっと手渡してしまうのです。