Dev

Das Tool, das du installierst, hat deine Reichweite

Ein installiertes Tool hält jede Autorität, die du ohnehin schon hast, und sie herzugeben ist die eine Sicherheitsentscheidung, die keinen zweiten Blick bekommt: einmal getroffen, im unbedachtesten Moment der ganzen Installation, danach nie wieder angerührt. Du kannst eingrenzen, was es erreichen kann, oder lesen, was sein Code wirklich anfasst; dem Namen zu vertrauen tut keines von beidem.

Ich füge diese Tools meinem Setup ohne Zeremonie hinzu. Ein Clipboard-Reader, ein Memory-Server, eine Brücke zu einer API, die ich nutze. Jedes ist ein paar Zeilen in einer Konfigurationsdatei und ein Neustart, und jedes läuft als Prozess auf meiner eigenen Maschine. In dem Moment, in dem der Neustart fertig ist, läuft dieser Prozess dort, wo ich laufe, als ich selbst: Er kann die Dateien lesen, die mein Konto lesen kann, die Shell starten, die ich starten kann, die Umgebung sehen, die ich meinen eigenen Programmen übergebe, das Netzwerk erreichen, das ich erreichen kann. Ich habe diese Vergabe in der Zeit gemacht, die es brauchte, einen Block JSON einzufügen, und nichts wird mich je wieder danach fragen.

Dieser letzte Teil ist das Ganze. Nicht, dass das Tool gefährlich wäre. Die meisten sind in Ordnung, so wie die meisten Abhängigkeiten in Ordnung sind. Es ist, dass ich einmal entschieden habe, was es erreichen darf, im billigstmöglichen Moment, und die Entscheidung kommt nicht zurück.

Die Vergabe ist ambient, und sie ist still

Ein lokales Tool ist nicht dadurch in einer Sandbox, dass es ein Tool ist. Es ist ein Prozess, und standardmäßig trägt ein Prozess die Autorität dessen, der ihn gestartet hat. Sicherheitsleute haben einen Namen für die Autorität, die man hält, ohne jedes Mal danach fragen zu müssen: ambient. Der Clipboard-Server kann meine Dateien lesen, weil ich meine Dateien lesen kann, nicht weil jemand entschieden hätte, dass er es sollte. Was beim Start zur Verfügung steht, ist alles, was mein Konto ohnehin trägt, und das Tool erbt es als Ganzes, ob es auch nur ein Byte davon nutzt oder nicht. Ein engerer Standard ist möglich, aber er ist nicht der Standard. Nichts liegt darunter und wartet darauf, abgeschaltet zu werden, und dem Prozess weniger zu geben, als mein Konto hält, ist eigene Arbeit, und eine Konfigurationszeile einzufügen ist das nicht.

Hinzu kommt, dass Offenlegung optional ist. Nichts im Protokoll, im Paket oder im Installationsschritt ist verpflichtet, mir zu sagen, was ein Tool tatsächlich liest oder wohin es das schickt. Die Spezifikation gibt einem Server zwar einen Ort, sein eigenes Verhalten zu beschreiben, weist aber zugleich an, diese Selbstbeschreibung als nicht vertrauenswürdig zu behandeln, denn die Auskunft eines Servers über sich selbst ist eine Tatsache darüber, was er behauptet, nicht darüber, was er tut. Ein gut erzogenes Tool dokumentiert sich selbst. Ein stilles sagt wenig. Ein unehrliches sagt, was auch immer es installiert werden lässt, und aus seiner eigenen Offenlegung allein, in dem Moment, in dem ich die Konfiguration einfüge, kann ich nicht sagen, welches ich habe.

Reichweite ist nicht Fußabdruck

Zwei Dinge werden hier von einem Wort getragen, und sie auseinanderzunehmen ist fast der ganze Punkt. Da ist, was ein Tool erreichen kann: die Autorität, die der Prozess hält, jede Datei und jeder Socket und jedes Geheimnis, an das mein Konto herankommt. Und da ist, was das Tool tatsächlich anfasst: der Fußabdruck dessen, was sein Code mit dieser Autorität tut. Ein Clipboard-Server kann mein ganzes Home-Verzeichnis erreichen und fasst nur die Zwischenablage an. Die beiden werden von verschiedenen Dingen festgelegt und mit verschiedenen Mitteln bewegt. Reichweite steht beim Start fest, dadurch, wie der Prozess gestartet wurde, und der einzige Weg, sie kleiner zu machen, ist, ihn mit weniger zu starten: eine Sandbox, ein Container, ein separater Benutzer, eine Laufzeit, die Berechtigungen einzeln vergibt. Der Fußabdruck steht durch den Code fest, und der einzige Weg, ihn zu kennen, ist, den Code zu lesen. Ein Tool zu wählen, weil du dem Namen vertraust, ändert keines von beidem. Es verkleinert die Reichweite nicht, denn Vertrauen ist keine Sandbox, und es enthüllt den Fußabdruck nicht, denn ein Name ist keine Quelldatei.

Was nichts davon gefragt hat, war: wann

Die Reichweite-Hälfte davon habe ich schon einmal vertreten, und es gehört zur Ehrlichkeit zu sagen, dass ich sie hier nicht entdecke. Wenn die Grenze zwischen Anweisung und Daten unentscheidbar ist, besteht der Zug, der funktioniert darin, die Anweisung nicht mehr an eine Prüfung zu binden, sondern stattdessen die Berechtigung wegzunehmen: das, was der Agent aufrufen und erreichen und wieder nach außen schicken kann. Und wenn ein Agent, den ich betreibe, eine Aktion vorschlägt, während ich nicht zusehe, ist das Gate, das hält jenes, das an die Reichweite gebunden ist, die der Harness selbst gewährt hat, denn der Harness hat die Berechtigung ausgegeben und muss den Wirkungsradius deshalb nie erraten. Beides läuft hinaus auf: die Reichweite verengen. Keines von beiden fragt, wann die Reichweite entschieden wurde, oder ob je wieder etwas fragt.

Das ist der Teil, der neu ist, und er ist nicht klein. Jene Gates sind Kontrollpunkte für das, was der Agent vorschlägt; sie feuern Aktion für Aktion, und ein Client, der einen Tool-Aufruf an eine Prüfung bindet, fragt mich beim nächsten wieder. Zwei Dinge liegen außerhalb davon. Erstens kann ein einziges Ja weit mehr abdecken als eine einzige Aktion: Ein Tool in meinem eigenen Clipboard-Server blockiert bei einem Aufruf bis zu fünf Minuten lang und pollt die Zwischenablage, bis sie sich ändert, sodass eine Freigabe ein langes Fenster erkauft, in dem es weiter eine sensible Oberfläche liest, während nichts erneut gefragt wird. Zweitens, und größer, war die Vergabe, die den Prozess gestartet hat, überhaupt nie eine vorgeschlagene Aktion. Der Prozess läuft mit meiner Autorität vor dem ersten Aufruf und in jeder Lücke zwischen den Aufrufen, und diese Autorität wurde einmal entschieden, als ich eine Datei bearbeitet habe, im unbedachtesten Moment im ganzen Stack. Das Gate pro Aufruf regelt, ob das Modell ein Tool aufrufen darf. Es war nie ein Kontrollpunkt dafür, was ein laufender Prozess mit der Reichweite tut, die er bereits hält.

Die Klasse ist nicht hypothetisch

Das wäre abstrakt, wenn die Lieferkette, über die Tools zu uns kommen, ruhig wäre, und das ist sie nicht. Im September warnte das Rust-Projekt, dass die Leute, die beliebte Crates veröffentlichen, direkt ins Visier genommen werden, wobei einer der genannten Vektoren darin besteht, Befehle auf die Zwischenablage des Ziels zu schieben; es hatte bereits ein Crate gefunden, das über den Sommer durch einen ähnlichen Social-Engineering-Angriff kompromittiert worden war. Simon Willison hat im selben Monat einen Bericht aufgegriffen, der eine Serie bösartiger RubyGems-Pakete OpenAI-Agenten zuschrieb, eine Behauptung, die der Bericht als Wahrscheinlichkeit anbot und die OpenAI nicht bestätigt hat. Die einzelnen Vorfälle sind nicht das Argument, und ich stütze es auf keinen von ihnen. Was sie belegen, ist Druck: Die Orte, aus denen Tools kommen, und die Leute, die sie veröffentlichen, stehen gerade jetzt unter Angriff. Das Tool, das du in deine Konfiguration einfügst, sitzt flussabwärts von all dem. Dass ein lokales Tool ohne Sandbox dann mit deiner Autorität läuft, ist nichts, was diese Berichte dokumentieren; es folgt daraus, was ein Prozess ist.

Behandle es als das, was es ist

Behandle ein installiertes Tool also als das, was es ist: eine Abhängigkeit mit Berechtigungen, zugelassen durch eine Entscheidung, die du genau einmal triffst. Zwei Züge folgen aus der Trennung oben, und es sind wirklich verschiedene Züge. Um die Reichweite kleiner zu machen, dämme den Prozess ein: Betreibe ihn in einer Sandbox, einem Container, unter einem separaten Benutzer, auf einer Laufzeit, die Berechtigungen einzeln vergibt. Das ist das Einzige, was verkleinert, woran ein feindseliges oder nachlässiges Tool herankommt, und es ist der Zug, den der ambiente Standard dir leise ausredet, weil Eindämmung Arbeit ist und eine Zeile einzufügen nicht. Um den Fußabdruck kennbar zu machen, bevorzuge Tools, deren Code du lesen kannst, und lies ihn dann; quelloffen zu sein ist kein Tugendabzeichen, es ist der Unterschied zwischen einem Fußabdruck, den du prüfen kannst, und einem, von dem man dir erzählt. Und hör auf, „lokal“ und „first-party“ für „sicher“ stehen zu lassen. Das sind Tatsachen darüber, woher der Code kam, dieselben Stellvertreter, die beim Text eines Tools versagen: Ein Connector mit einem Namen, dem du vertraust, reicht so weit wie einer, von dem du nie gehört hast, wenn du die beiden gleich gestartet hast. Ein entfernter Connector ist der eine Fall, den das nicht berührt: Er läuft auf der Maschine eines anderen und hat nichts von deiner lokalen Reichweite, also tauscht er dieses Problem gegen das über den Text, den er zurückschickt.

Was Verengen wirklich kostet

Ich baue auch auf der anderen Seite dieser Grenze. Ich liefere ein Clipboard-Tool, dessen Fußabdruck bewusst eine einzige Oberfläche ist, die Zwischenablage und nichts sonst, und dessen Transport standardmäßig stdio ist, gar kein Socket. Es trägt außerdem ein Flag, das es auf einen HTTP-Port legt, an localhost gebunden, solange du nicht ein Argument änderst, ohne Authentifizierung für einen Nicht-Browser-Client. Dieses Flag ist der ehrliche Teil der Geschichte: Ein Standard ist ein Argument davon entfernt, keiner mehr zu sein, und die sichere Form ruht auf einer Wahl, die ein gehetzter Mensch trifft, ohne zu lesen. Den Fußabdruck zu verengen gab mir etwas, worauf ich einen Leser zeigen kann, und eine kleinere Sache, die man falsch machen kann. Es gab mir keine Sicherheit, denn die Zwischenablage ist eine der sensibelsten Oberflächen, die eine Maschine hat, der Ort, an dem ein Passwort sitzt, auf dem Weg dazu, eingefügt zu werden, und, wie jene Rust-Warnung zeigte, ein Kanal, den Angreifer bereits nutzen. Ein enger Fußabdruck ist eine kleinere Sache zum Auditieren. Er ist keine sichere.

Das Memory-Tool, das ich liefere, macht den Punkt von der anderen Richtung her, und es ist ein Punkt über den Fußabdruck, nicht über die Reichweite. Es ist auf Scope-Ketten gebaut, sodass ein Agent nur innerhalb seines eigenen Scopes liest und nicht im Gedächtnis eines anderen Kontexts. Das wahr zu machen war keine Einstellung, die ich eingeschaltet habe. Ich hatte es ausgeliefert im Glauben, die Lesezugriffe seien auf den Scope beschränkt, und fand später heraus, dass zwei seiner Lesepfade den Scope-Filter komplett umgingen; das Gedächtnis war nicht wirklich isoliert, bis alle drei Lesezugriffe durch dieselbe Prüfung gingen. Das ist der Preis, wenn du derjenige bist, der es baut: Ein enger Fußabdruck ist kein Wert in einer Konfigurationsdatei, er ist eine Disziplin, die du an jedem Pfad hältst, der die Daten berührt, und er fällt in den offenen Zustand, ohne einen Laut, in dem Moment, in dem ein Pfad es vergisst. Was ebenso die Lektion für den ist, der installiert. Der Fußabdruck, den ein Tool bewirbt, und der Fußabdruck, den sein Code hat, sind zwei verschiedene Tatsachen, und nur der Code entscheidet, welcher der echte ist.

Die Entscheidung, die einmal fragt

Das Tool, das ich installiere, hat meine Reichweite. Nicht die Reichweite, die ich ihm leihen wollte, die Reichweite, die ich habe, denn einem Prozess kann nicht weniger gegeben werden, als mein Konto trägt, es sei denn, jemand macht die Arbeit, sie zurückzunehmen, und eine Konfigurationszeile einzufügen ist diese Arbeit nicht. Das Freigabe-Gate fragt bei der nächsten Aktion wieder, der Aufruf-Prompt beim nächsten Aufruf. Die Vergabe, die das Tool startet, fragt einmal, in dem Moment, der so gebaut ist, dass er die geringste Reibung im System hat, und dann ist sie einfach wahr.

Es gibt eine wiederkehrende Prüfung, und sie ist enger, als sie klingt. Sie auditiert die Reichweite nicht erneut, denn nichts auditiert die Reichweite erneut. Sie ist eine Prüfung der Menge. Ich habe vertreten, dass, sobald du mehr als ein paar Agenten betreibst, ihre Konfiguration Infrastruktur ist, und dass die Lösung für die Ressource, von der du vergessen hast, dass du sie aufgesetzt hast, nicht ist, dich fester zu erinnern, sondern ein Discovery-Sweep: aufzulisten, was tatsächlich verdrahtet ist, und es gegen das abzugleichen, was du erlauben wolltest. Ein installiertes Tool ist genau diese Art von Ressource. Der Sweep wird dir nicht sagen, was irgendein einzelnes Tool erreichen kann. Aber er macht aus dem Server, den du vor drei Monaten eingefügt und vergessen hast, wieder etwas, das du sehen kannst, was das Mindeste ist, das die Vergabe verdient, und mehr, als sie derzeit bekommt. Deklariere die Menge, gleiche ab, was läuft, gegen sie, und die reibungslose Entscheidung hört wenigstens auf, eine dauerhafte zu sein, die du nie ansiehst.

Die Entscheidung, für die es sich lohnt, langsamer zu werden, ist die, die dich von sich aus nie langsamer machen wird.

Diskussion

Hier gibt es keine Kommentarspalte. Diskussionen laufen auf X.

Max Nardit

Max Nardit

@mnardit

Weitere Artikel

Die Kompaktierung ist eine nicht vertrauenswürdige Eingabe

Eingaben von außen bekommen eine Disziplin, die eigene Ausgabe des Agenten nicht. Also kommen die Zusammenfassung, die er schreibt, um einen Reset zu überleben, und die Erinnerung, die er abruft, als Anweisungen zurück, mit einem Rang, den nichts zurückgenommen hat. Der Autor, den die Harness für sie festhält, ist das Modell selbst, und genau das ist der Grund, warum die Prüfung sie durchlässt.

Ein Prompt ist keine Invariante

Eine Regel, die du in einen Agenten-Prompt oder eine CLAUDE.md schreibst, ist unverbindlich: Das Modell liest sie auf jedem Pfad, wägt sie aber nur ab, und Abwägen ist kein Verweigern. Also hält sie meistens, und meistens ist nicht das, wofür eine tragende Regel da ist. Damit eine wirklich hält, muss sie dorthin, wo Befolgung nicht optional ist: zu einer Prüfung, die die Harness selbst ausführt und durchsetzt, unabhängig davon, wie das Modell entschieden hat. Mit einer Grenze: Ein Gate bindet nur über die Pfade, die es abdeckt, und manche Regeln lassen sich an keinem Gate klären, weil ihr Verstoß in der Welt auftaucht und nicht in der Aktion, die es prüfen würde.

Deine Agent-Konfiguration ist jetzt Infrastruktur

Sobald du ein paar Agents betreibst, hören ihre Definitionen auf, Konfiguration zu sein, die du bearbeitest, und werden zu Infrastruktur. Das Problem mit Infrastruktur ist: Sobald du sie nicht mehr im Kopf behalten kannst, driften ihr deklarierter Zustand und ihr laufender Zustand von selbst auseinander, und nichts meldet es. Die Lösung ist die Disziplin, die wir bei Servern gelernt haben: Deklariere die Menge als Dateien, vergleiche sie mit der Realität, halte fest, was du angewandt hast, und verweigere das Anwenden über eine hinter deinem Rücken passierte Änderung hinweg, statt einfach darüber hinweg zu konvergieren. Mit einem Haken, der leicht zu übersehen ist. Ein Reconciler erfasst immer nur das, was du zu deklarieren daran gedacht hast.