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

git status hat ihren Code ausgeführt

Am 2. September 2026 hat Manifold Security GitSpawn offengelegt: acht Schwachstellen in sieben Kommandozeilen-Coding-Agenten, bei denen die eigene .git/config eines Repositorys einen Befehl auf dem Rechner der Entwicklerin ausführt. Der Agent ruft git status auf, um den Branch zu ermitteln, git aktualisiert seinen Index, und der vom Repository gewählte Befehl läuft mit den Rechten des angemeldeten Benutzers, außerhalb der Sandbox, vor der Vertrauensabfrage und bei einem Werkzeug sogar vor dem Login. Keine Eingabe, kein Tool-Call, kein Modell-Turn. Bromure Agentic Coding patcht diesen Pfad nicht. Es verlegt die Maschine, zu der der Pfad führt.

Sie haben nichts getippt und nichts genehmigt. Der Agent war noch nicht fertig gestartet, und bei einem dieser Werkzeuge waren Sie nicht einmal angemeldet. Ein Ordner, den Ihnen jemand geschickt hat, hat einen Befehl in Ihrem Namen ausgeführt, und git war es, das ihn ausgeführt hat.

Ein Auftragnehmer schließt ein Stück Arbeit ab und schickt Ihnen ein ZIP des Projektverzeichnisses in einem geteilten Ordner. Sie entpacken es, gehen mit cd hinein und starten Ihren Coding-Agenten, um sich zu orientieren. Der Agent beginnt damit, git zu fragen, welcher Branch das ist und was verändert wurde. Das ist der ganze Exploit.

Am 2. September 2026 hat The Hacker News über eine Offenlegung von Manifold Security berichtet, die acht Schwachstellen in sieben Kommandozeilen-Coding-Agenten umfasst, veröffentlicht unter dem Namen GitSpawn. Zusammen tragen die betroffenen Werkzeuge fast eine halbe Million GitHub-Sterne, und Claude Code allein ist über 77 Millionen npm-Downloads pro Monat hinaus. Vier der acht führten noch immer vom Repository gelieferte Befehle aus, als Manifold sie am 1. September erneut testete.

Eine Performance-Einstellung, deren Wert ein Befehl ist

core.fsmonitor ist eine git-Option für Leute mit riesigen Repositorys. Statt den ganzen Baum zu durchlaufen, um Änderungen zu finden, kann git ein externes Hilfsprogramm aufrufen und es fragen. Der Wert der Einstellung ist der Befehl. Git liest ihn aus der .git/config des Repositorys selbst und führt ihn jedes Mal aus, wenn es seinen Index aktualisiert, also bei git status, bei git diff, bei der Plumbing-Ebene, auf die sich jedes Werkzeug stützt.

Fast jeder von Manifold untersuchte Agent sammelt Projektkontext, indem er diese Befehle beim Start ausführt, und keiner von ihnen sah vorher in die .git/config. Also benennt das Repository den Befehl und git führt ihn aus. In den Worten der Forscher läuft er „mit den vollen Rechten des angemeldeten Benutzers, außerhalb der Sandbox“. OpenAI schrieb in seinem eigenen Advisory zur Codex-Variante, das Hilfsprogramm laufe „außerhalb der Befehls-Sandbox von Codex und ohne Genehmigungsabfrage beim Benutzer“.

Ein git clone trägt nichts davon mit. Der Clone überträgt Objekte und Refs, und die lokale Konfiguration des Quell-Repositorys bleibt zu Hause. Das vergiftete Projekt muss Sie also als Dateien erreichen, mit intaktem .git-Verzeichnis: ein ZIP-Archiv, ein Netzlaufwerk, ein synchronisierter Ordner, ein USB-Stick. Manifolds Liste beschreibt, wie Berater, Kunden und Kollegen Arbeit übergeben, und es ist der eine Lieferweg ohne jeden Pull Request. Gits eigener Schutz gegen feindliche Repositorys, safe.directory, prüft, ob das Repository jemand anderem gehört. Sie haben es entpackt, also gehört es Ihnen, und der Schutz hat nichts zu sagen.

Das Timing setzt den jeweils eigenen Schutz jedes Agenten einen Schritt zu spät an. Bei Claude Code und Hermes Agent feuert die Nutzlast vor der Workspace-Vertrauensabfrage, jenem Dialog, der genau dafür da ist zu fragen, ob Sie diesem Verzeichnis vertrauen. Bei Qwen Code feuert sie, bevor sich der Benutzer authentifiziert hat, und bei Grok Build feuert sie beim ersten Tastendruck.

GitSpawn — von der Übergabe zur Shellder Ordner trifft einZIP, Netzlaufwerk,Sync-Ordner, USB —.git/config intaktder Agent startetsammelt Kontext:git status · git diffgit aktualisiert den Indexliest die Repo-Configcore.fsmonitor = …<ihr Befehl>Ihr User, Ihre Umgebung,Ihr Home-VerzeichnisWas noch nicht passiert wardie VertrauensabfrageClaude Code,Hermes Agentdas AnmeldenQwen Code feuert vorder Authentifizierungirgendetwas tippenGrok Build feuert beimersten Tastendruckdas Modellkein Tool-Call, kein Turn,nichts zu protokollierenJede Schranke in der Reihe oben ist ein Schritt im Start des Agenten. Der Befehl lief, bevor die Sequenz sie erreichte.
Die ganze Kette und die vier Dinge, die noch nicht passiert waren, als sie fertig war. Die .git/config eines Repositorys benennt einen Befehl in core.fsmonitor; der Agent ruft git status auf, um seinen Branch zu ermitteln; git aktualisiert den Index und ruft das Hilfsprogramm auf. Es läuft als angemeldeter Benutzer, vor der Vertrauensabfrage bei Claude Code und Hermes Agent, vor der Authentifizierung bei Qwen Code und beim ersten Tastendruck bei Grok Build, ohne Tool-Call und ohne Modell-Turn an irgendeiner Stelle der Sequenz.

Acht Befunde, sieben Agenten, vier davon noch offen

Die Hälfte ist behoben. goose 1.44.0 enthält den Fix für CVE-2026-72718, bewertet mit CVSS 7.0. OpenAI hat Codex CLI 0.131.0 und die Desktop-Builds 26.519.x für CVE-2026-19592 ausgeliefert. Cursor hat seine Variante gepatcht. Manifold hat den core.fsmonitor-Pfad von Claude Code in 2.1.193 bestätigt, und Anthropic hat ihn in 2.1.196 geschlossen, ohne ein Advisory zu veröffentlichen: Manifold merkt an, dass keiner der beiden Claude-Code-Befunde in den Advisory-Einträgen von npm auftaucht.

Die andere Hälfte hat sich nicht bewegt. Hermes Agent hat eine CVE (CVE-2026-71963) und ein privates Advisory, das nach sechs Kontaktversuchen immer noch nicht triagiert ist. Die Maintainer von Qwen Code haben den Bericht am 7. Juli angenommen, und 0.22.3 führt den Befehl weiterhin aus. Grok Build führt ihn weiterhin aus. Und Claude Code hat einen zweiten Pfad, über seinen ultrareview-Befehl, der einen anderen git-Konfigurationsschlüssel missbraucht und in 2.1.252 noch aktiv war. Manifold hat den Namen dieses Schlüssels zurückgehalten, statt eine wiederverwendbare Angriffsvorlage zu verteilen.

Anthropic hat den ersten Pfad in drei Tagen gepatcht. Die Schwachstellenklasse ist über einen anderen Schlüssel darum herumgelaufen, in derselben Datei, im selben Produkt.

Das ist die Ausführungsfläche von git, geerbt von jedem Werkzeug, das an git delegiert, und git hat mehr als eine Einstellung, deren Wert ein Befehl ist, den es für Sie ausführt. Pager, Editoren, SSH-Befehle, Hook-Pfade, Diff- und Filter-Driver und Aliase, die mit einem Shell-Escape beginnen, nehmen alle Befehlswerte an. Jeder Anbieter muss nun Schlüssel für Schlüssel herausfinden, welche davon ein Repository aus seinem Startpfad erreichen kann, gegen ein Konfigurationsschema, das mit der Zeit Schlüssel dazugewinnt. Manifolds empfohlener Fix, die git-Konfiguration während der Kontextoperationen im Hintergrund zu bereinigen und core.fsmonitor zu deaktivieren, ist eine Sperrliste, gepflegt gegen einen Namensraum. Die Forscher haben das Muster in mehr Agenten gefunden, als der Bericht nennt.

Die Kontrollen, die das gefangen hätten, liegen stromabwärts davon

Stellen Sie zusammen, was ein sorgfältiges Team heute über einem Coding-Agenten hat: Berechtigungsabfragen bei der Tool-Nutzung, Workspace-Vertrauen, Hooks, die einen Befehl vor der Ausführung prüfen, die Transkript-Endpunkte, die eine Sitzung an ein Compliance-Backend schicken, und OpenTelemetry für Berechtigungsentscheidungen und Bypässe.

Sie alle verankern sich in der eigenen Schleife des Agenten, also in einem Tool-Call, den der Agent zu machen beschlossen hat, oder in einem Turn, den das Modell genommen hat. GitSpawn erzeugt keines von beidem. Der Prozess, der die Nutzlast ausführt, ist git, aufgerufen vom Agenten für seine eigene Haushaltsführung, und der Befehl kommt aus einer Datei, die der Agent nie gelesen hat. Es gibt keinen Tool-Call zum Genehmigen und keinen Hook zum Auslösen. Ein Team, das Agenten-Transkripte in seinem SIEM landen sieht, sieht eine Sitzung, die normal startet und nichts zeigt, denselben blinden Fleck, über den wir geschrieben haben, als Anthropic seine Compliance API auslieferte: ein Log, das an dem verankert ist, was das Modell erreicht hat, kann nicht sehen, was lief, bevor das Modell befragt wurde.

Der Befehl wird laufen. Die Frage, die es zu beantworten lohnt, ist, was er findet.

Ins Home-Verzeichnis entpacktgit status → core.fsmonitor-Helfervom Ordner gewählt, als Sie ausgeführtwas ein Verzeichnis entfernt liegt~/.ssh/id_ed25519ANTHROPIC_API_KEY, AWS_SECRET_ACCESS_KEY~/.git-credentials, ~/.aws, ~/.kube/config~/.zshrc — Persistenz für den nächsten Loginausgehend: eine normale Verbindung einesnormalen Entwicklerwerkzeugs, normaler Portdas Log des Agenten hat dafür keine ZeileDer Ordner war nicht vertrauenswürdig. Das Konto schon.In einem Bromure-Workspace geöffnetgit status → core.fsmonitor-Helferläuft trotzdem — als ubuntu, im Gastkurzlebige Linux-VM · vor dem Ordner gestartetkeine privaten Schlüsselbytes — der Host-ssh-agent signiertEnv- und Config-Zugangsdaten sind Köder (brm_…):80 und :443 in den Host-Proxy umgeleitet, nicht abschaltbarEgress-Firewall: Default Deny → keine zweite Stufeein Köder verlässt seinen Scope → 451, VM pausiert,Workspace markiert, Wipe nötig zum Neustartjede Anfrage bekommt eine Zeile, egal welcher ProzessDer Befehl läuft trotzdem. Nur an einem Ort, der dafür gebaut ist.
Derselbe Ordner, dasselbe git status, zwei verschiedene Maschinen. Auf Ihrem Laptop läuft das Hilfsprogramm als Sie, ein Verzeichnis von Ihren SSH-Schlüsseln und Ihren Cloud-Zugangsdaten entfernt, und seine ausgehende Verbindung ist eine gewöhnliche Verbindung eines gewöhnlichen Entwicklerwerkzeugs. In einem Bromure-Workspace läuft es als ubuntu in einer VM, die gestartet wurde, bevor der Ordner existierte: keine privaten Schlüsselbytes zum Stehlen, Köder dort, wo die Zugangsdaten sein sollten, und jedes ausgehende Byte auf einer Leitung, die der Host besitzt und aufzeichnet.

Lassen Sie ihn laufen und sehen Sie, was er findet

Bromure Agentic Coding gibt jedem Workspace seine eigene Ubuntu-VM unter Apples Hypervisor. Der Agent, sein git, sein Paketmanager und alles, was diese drei starten, leben im Gast. Legen Sie das ZIP des Auftragnehmers in einen Workspace, lassen Sie das Hilfsprogramm feuern und gewähren Sie dem Angreifer alles: vor dem Vertrauen, vor der Authentifizierung, root im Gast, wenn Sie wollen.

Die SSH-Schlüssel lesen. Es gibt keine zu lesen. Die privaten Schlüssel eines Workspaces bleiben auf Ihrem Mac; die VM bekommt einen SSH_AUTH_SOCK, der über vsock zu einem host-seitigen Agenten gebrückt ist. Dieses Protokoll hat eine Anfrage, die „signiere diese Challenge“ bedeutet, und keine Anfrage, die „gib mir den Schlüssel“ bedeutet.

Die Umgebung nach Zugangsdaten durchsuchen. Sie sind alle da, in genau der Form, die Validatoren erwarten, und alle sind Köder. ANTHROPIC_API_KEY enthält eine gefälschte sk-ant-api03-brm-…, und dasselbe gilt für ~/.git-credentials, ~/.aws/config, ~/.kube/config und ~/.docker/config.json. Ihre echten Werte liegen verschlüsselt auf Ihrem Mac, und der Proxy setzt sie auf der Leitung ein, nachdem die Anfrage die VM verlassen hat, und nur dann, wenn sie für den Host bestimmt ist, für den dieses Zugangsdatum geprägt wurde. Kein Schalter stellt das ab. So funktionieren Zugangsdaten in der App.

Die zweite Stufe herunterladen. Das Hilfsprogramm ist ein Loader, ein paar hundert Bytes, deren Aufgabe es ist, die eigentliche Nutzlast zu holen. Dieser Abruf läuft in die Egress-Firewall des Workspaces. Setzen Sie Nicht zugeordneter Verkehr auf Deny, und die VM erreicht die von Ihnen gelisteten Hosts und sonst nichts, durchgesetzt an zwei Stellen: der virtuelle Switch prüft nach Ziel-IP und per DNS mitgelesenem Hostnamen über alle Protokolle hinweg, und der Proxy prüft erneut nach TLS-Servernamen und, bei web-Regeln, nach HTTP-Methode. Ein Loader, der stattdessen nach einer Paket-Registry greift, trifft auf die Supply-Chain-Pipeline, in der die Altersschranke Versionen ablehnt, die jünger als der Stichtag sind. Eine gestern veröffentlichte Nutzlast kann diese Hürde nicht nehmen.

Ausschleusen, was es gefunden hat. Jetzt muss etwas eine Leitung überqueren, die Ihrem Mac gehört. Der Proxy prüft jede ausgehende Anfrage gegen die für den Workspace geprägten Köder, Header und Body, mit einem Aho-Corasick-Automaten. Ein Köder, adressiert an einen Host außerhalb des Scopes, für den er geprägt wurde, ist die Signatur einer Maschine, die etwas hinausschickt, das sie nicht wissen sollte. Der Proxy blockt mit HTTP 451, bevor ein Byte das Ziel erreicht, hält die VM an und löst einen Alarm aus, der das Zugangsdatum und beide Hosts benennt. Bromure markiert den Workspace daraufhin als kompromittiert, und er startet nicht wieder, bis Sie seine Disk und sein Home löschen.

Persistenz hinterlassen. Eine veränderte .bashrc im Gast hält so lange, wie Sie die VM halten lassen. Home löschen setzt /home/ubuntu zurück, Disk zurücksetzen klont die System-Disk aus dem signierten Basis-Image neu, und bromure-cli vm run --rm gibt Ihnen einen Workspace, der sich selbst löscht, wenn die VM stoppt.

Die Abhörstelle hat keine Umgebungsvariable zum Abschalten

Ein Proxy, für den sich der Gast entscheidet, ist ein Proxy, den der Gast ablehnen kann. Bromures virtueller Switch leitet die Port-80- und Port-443-Flüsse der VM selbst in den Host-Proxy um: kein HTTPS_PROXY zum Abschalten, nichts im Gast, das ihn ausstellt, und einfaches HTTP wird so inspiziert wie HTTPS. Der Prozess, der hier die Anfrage stellt, hat die Konfiguration des Agenten nie gelesen und ist nicht der Agent. Es ist eine Hilfs-Binärdatei, die git gestartet hat, und sie fährt auf derselben Leitung wie alles andere.

Die Zeile existiert, obwohl kein Tool-Call existiert

Der Host-Proxy schreibt einen Metadatensatz für jede Anfrage aus der VM, welcher Prozess sie auch gestellt hat: Zeit, Host, Port, Methode, Pfad, Status, Latenz und Bytes, gemessen vor dem Austausch der Zugangsdaten. Firewall-Urteile, Supply-Chain-Entscheidungen und die Vermittlung von Zugangsdaten landen in der Security Timeline (Fenster → Security Timeline…), und auf einem eingebundenen Mac gehen sie als egress.firewall, supply_chain.fetch und credential.exfiltration in den Ereignisstrom der Organisation. Ein agentenseitiges Transkript dieses Angriffs ist leer, während das der Leitung die Anfrage trägt.

Der Gast erreicht genau eine Sache auf Ihrem Mac. Ein geteilter Ordner ist ein lebendiges, schreibbares Fenster in Ihr echtes Dateisystem, und der Kompromittierungs-Wipe lässt ihn bewusst in Ruhe. Teilen Sie das Projektverzeichnis statt Ihres Home-Verzeichnisses, und das find des Hilfsprogramms nach *.pem läuft durch ein Linux-Home voller Checkouts und Paket-Caches statt durch Ihre schlüsselbund-gestützten Logins.

Die Grenze, die kein Schritt in der Sequenz ist

Lesen Sie die vier Timing-Details von GitSpawn zusammen — vor der Vertrauensabfrage, vor der Authentifizierung, vor dem ersten Tastendruck, vor jedem Modell-Turn — und sie sagen eine Sache. Jeder Schutz ist ein Schritt in einer Startsequenz, und jedes neue Feature fügt einen Schritt davor ein. Cursor hat das 2025 mit einer vom Repository gelieferten mcp.json gelernt und erneut im Juli mit einem Worktree-Setup-Befehl, der vor der eigenen Vertrauensabfrage lief. Jetzt ist git an der Reihe, in sieben Produkten gleichzeitig, über einen Konfigurationsschlüssel, den es in git seit Jahren gibt.

Ein Hypervisor ist kein Schritt in dieser Sequenz. Er liest die .git/config nicht. Kein Refactoring ordnet ihn um, und kein Codepfad nimmt sich von ihm aus, weil er nicht im selben Programm läuft wie die Abfrage. Die VM lief schon, bevor das ZIP fertig heruntergeladen war, und ihre zwei Garantien — keine echten Geheimnisse hier drin und keine unvermittelte Route hinaus — halten in 2.1.193 genauso wie in 2.1.196.

Prüfen Sie Ihre .git/config, bevor Sie einen Ordner öffnen, den Ihnen jemand geschickt hat. Manifold hat recht damit. Sie werden es auch zwei Wochen lang tun und es dann beim dritten ZIP eines vollen Nachmittags überspringen, und das ist die Haltbarkeit der meisten Anweisungen, die mit „bevor Sie es öffnen“ enden. Installieren Sie Bromure Agentic Coding, geben Sie dem unbekannten Ordner seine eigene Maschine, und lassen Sie die Config ausführen, was sie will, in einem Raum, in dem Ausführen alles ist, was sie tun darf.