„Doing the right thing does not protect you." Der Satz steht im Blog von AIR Security, und er ist der Kern der Sache: Wer nur geprüfte Plugins installiert, wer jede Version auf eine feste Prüfsumme festnagelt, wer also alles richtig macht, der war bei Claude Code, OpenAI Codex, GitHub Copilot und Gemini CLI trotzdem angreifbar. Die Lücke heißt Plugin4Shell, und drei Forscher haben sie am 17. September öffentlich gemacht.

Kurz gesagt: Alle vier großen KI-Coding-Agenten holen Plugins per Git und prüfen nicht, ob wirklich der freigegebene Stand gelandet ist. Ein Angreifer mit Zugriff auf ein Plugin-Repository kann so Code auf deinem Rechner ausführen, bei aktivem Auto-Update ohne einen Klick von dir. Claude Code ist ab 2.1.179 dicht, Codex ab 0.146.0. GitHub Copilot hat keinen Fix, Gemini CLI bekommt keinen mehr.
Statuskarte zu Plugin4Shell: Claude Code ab 2.1.179 und OpenAI Codex ab 0.146.0 gepatcht; GitHub Copilot ohne Fix, Gemini CLI eingestellt
Zwei von vier Agenten sind dicht. Bei den anderen beiden bleibt nur, den Angriffsweg zu verengen.

Der Trick hinter Plugin4Shell: ein Branch, der wie eine Prüfsumme heißt

Ein Plugin-Marketplace ist für Coding-Agenten das, was der App-Store fürs Handy ist: eine Liste von Erweiterungen, aus der du dir Werkzeuge nachinstallierst. Damit dir dabei niemand etwas unterschiebt, merkt sich der Marketplace zu jedem Plugin eine Prüfsumme, den Commit-Hash. Das nennt sich SHA-Pinning.

SHA-Pinning? Jeder Stand eines Git-Projekts hat einen 40-stelligen Fingerabdruck, den Commit-Hash. Pinning heißt: „Installiere genau diesen Stand, keinen anderen." Wie eine Seriennummer auf dem Lieferschein. Nur dass hier keiner das Paket mit dem Lieferschein vergleicht.

Der Agent macht beim Installieren zwei Dinge: git clone, dann git checkout <hash>. Und hier sitzt der Fehler. Git löst einen Namen zuerst als Branch auf, erst danach als Commit. Legt der Betreiber des Plugin-Repositorys also einen Branch an, der genau so heißt wie der gepinnte Hash, und macht ihn zum Standard-Branch, dann landet beim Checkout der Branch, samt dem Code, den der Angreifer hineingelegt hat. Der Agent meldet Erfolg, weil der Befehl ja durchgelaufen ist. Ob der Inhalt zur Prüfsumme passt, sieht keiner nach. Das ist die ganze Lücke, und sie ist so simpel, dass man zweimal hinschaut.

Bei Gemini CLI läuft es leicht anders: Dort heißt der Angriffs-Branch FETCH_HEAD, ein interner Git-Name, den der Agent nach dem Herunterladen auscheckt. Das Ergebnis ist dasselbe.

Eine Einschränkung, die AIR selbst nennt: GitHub verbietet Branch-Namen, die wie ein Commit-Hash aussehen. Der Trick funktioniert also nur mit Plugins, die auf Bitbucket oder einem selbst gehosteten Git-Server liegen. Beides sind offizielle Optionen für Marketplaces. Ob dein Gitea oder Forgejo im Homelab solche Namen durchlässt, habe ich nicht geprüft; nachsehen kannst du in einer Minute, indem du einen Branch mit vierzig Hex-Zeichen anlegst.

Warum „Zero-Click": das Auto-Update erledigt den Rest

Beim ersten Installieren müsstest du das Plugin wenigstens selbst auswählen. Claude Code und Codex halten Plugins aber standardmäßig automatisch aktuell. Der Ablauf, den AIR beschreibt: Ein Plugin wird sauber eingereicht und geprüft. Später bekommt es ein harmloses Update, der Marketplace pinnt den neuen Hash. Erst dann legt der Angreifer den gleichnamigen Branch an. Beim nächsten Auto-Update zieht dein Agent den Schadcode, und du hast nichts angeklickt.

Das trifft auch Leute, die Plugins nie selbst schreiben. Es reicht, dass jemand ein bestehendes Plugin-Repository kapert. Wie gut das skaliert, hat dieselbe Firma in zwei früheren Untersuchungen gezeigt: Nach eigenen Angaben erreichte sie mit einem Test-Plugin über 26.000 Agenten, und über übernommene Repositorys kam sie an 925 Plugins mit 134.000 Agenten dahinter. Wer die Geschichte der verseuchten Chrome-Erweiterungen gelesen hat, kennt das Muster: Vertrauen wird einmal erworben und dann verkauft.

Wer gepatcht hat und wer nicht

AIR hat die Lücke im Mai gefunden und im Juni allen vier Herstellern gemeldet. Die Antworten fallen unterschiedlich aus:

AgentStandSichere Version
Claude Code (Anthropic)gepatcht, bestätigt am 17. Juniab 2.1.179
Codex (OpenAI)gepatcht, von AIR am 12. August verifiziertab 0.146.0
GitHub Copilot (Microsoft)kein Fix, laut AIR keine Reaktion seit Junikeine
Gemini CLI (Google)kein Fix, Produkt eingestelltkeine, Google verweist auf Antigravity

Anthropic hat den Fix innerhalb eines Monats geliefert — das gönne ich ihnen. Was mich stört: In den Release-Notes zu 2.1.179 steht davon kein Wort, dort geht es um Mausrad-Scrolling und einen Umfrage-Bug. Wer sich nur die Changelogs ansieht, hätte nie erfahren, dass ein Update sicherheitsrelevant war. OpenAI schreibt bei 0.146.0 immerhin „Verify Git plugin SHA checkouts", knapp, aber es steht drin.

Bei Microsoft lese ich in den drei Berichten, die ich geöffnet habe, nur eine Aussage von GitHub: Die Plattform blocke solche Branch-Namen ja. Das stimmt, hilft aber nur, solange das Plugin auf GitHub liegt, und Copilot erlaubt ausdrücklich andere Quellen. Zum Agenten selbst, also zu dem Code, der die Prüfsumme nicht vergleicht, kam laut AIR und The Register nichts. Google hat Gemini CLI eingestellt und verweist auf den Nachfolger. Wer das Werkzeug weiter nutzt, nutzt ein Werkzeug ohne Patches, und da kenne ich nur eine Empfehlung.

Was du jetzt prüfst

Für Claude Code und Codex ist es ein Zweizeiler. Version anzeigen, mit der Tabelle vergleichen, bei Bedarf aktualisieren:

claude --version
claude update

codex --version
npm install -g @openai/codex@latest

Realistisch bist du bei beiden längst durch: Der Fix ist drei Monate alt, und beide Tools aktualisieren sich von selbst. Claude Code steht inzwischen bei 2.1.278. Wer die Selbst-Aktualisierung abgeschaltet hat oder eine alte Version eingefroren hat, weil „sie läuft", schaut jetzt nach.

Bei Copilot und Gemini CLI gibt es keine sichere Version, also bleibt nur, den Angriffsweg zu verengen. Drei Dinge halte ich für vernünftig:

  • Plugin-Quellen ansehen. Welche Marketplaces hast du eingebunden, und wo liegen die Plugins? Alles, was auf GitHub liegt, ist über die Branch-Sperre geschützt. Bitbucket und eigene Git-Server sind es nicht.
  • Auto-Update für Plugins aus, wo der Agent es anbietet. Ein Update, das du selbst anstößt, ist immer noch angreifbar, aber wenigstens kein Zero-Click mehr.
  • Gemini CLI ersetzen. Google selbst sagt, es kommt kein Fix. Ein Agent mit Shell-Zugriff und bekannter Lücke gehört nicht auf einen Rechner, an dem SSH-Schlüssel und Cloud-Tokens liegen.

Zur Einordnung: Nach Angaben von The Register gibt es bis heute weder eine CVE-Nummer noch einen bekannten Angriff. Das ist kein Grund zur Entwarnung, aber ein Grund, ruhig zu bleiben. Die Lücke ist öffentlich, die Anleitung ist öffentlich, und der Aufwand für einen Angreifer ist ein Branch-Name. Ich rechne damit, dass jemand es ausprobiert.

Was mir am Ende bleibt, ist die Ironie der Sache: Wir hatten mit dem Bericht über die 688 KI-Agenten bei Hugging Face schon den Fall, dass Agenten anderswo einbrechen. Diesmal ist der Agent auf deinem Rechner die Tür. Und der Riegel, auf den alle vertraut haben, war eine Prüfsumme, die keiner nachgerechnet hat.

Welche Plugins hast du in deinem Coding-Agenten laufen, und weißt du, wo sie gehostet sind? Schreib's in die Kommentare, mich interessiert vor allem, ob jemand eigene Marketplaces auf Gitea oder Forgejo betreibt.

Wer solche Meldungen lieber gebündelt bekommt: Der Newsletter fasst jeden Sonntag zusammen, was in der Woche wichtig war, ohne Panik und ohne Werbung.

Quellen