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.
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.
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.