Standardmäßig fragt Claude Code vor der Ausführung der meisten Shell-Befehle nach. Wählt der Nutzer „Ja, und nicht mehr fragen", legt das Werkzeug laut seiner Berechtigungsdokumentation eine Erlaubnisregel in .claude/settings.local.json im Projektverzeichnis ab; passende Befehle laufen in späteren Sitzungen ohne Rückfrage. Die Regel deckt genau das ab, was die Abfrage angeboten hat: mal ein Muster wie npm test *, mal einen exakten Einzelbefehl. Im zweiten Fall landet jedes darin getippte Passwort und jeder Token im Klartext in der Datei. In öffentlichen Dateien fanden die Forscher gespeicherte Befehle mit noch enthaltenem Geheimnis und reproduzierten das Verhalten mit den aktuellen Modellen Opus 5.5 und Fable 5.1.

Claude Code versucht, die Datei aus Git herauszuhalten: Beim ersten Schreiben in einem Git-Repository trägt es sie laut Einstellungsdokumentation in die globalen Git-Excludes des Nutzers ein, womit Git sie auf diesem Rechner in allen Repositories ignoriert. Dieser Schutz bleibt aber an die Git-Konfiguration eines Nutzers auf einem Rechner gebunden und greift nicht für eine bereits eingecheckte Datei. In die projekteigene .gitignore trägt Claude Code die Datei nie ein, der Schutz wandert also nicht mit dem Projekt mit. In 539 der 1.105 nachverfolgten Repositories wurde die Datei durch einen Commit geändert, der Claude als Mitautor ausweist – für die Forscher ein Hinweis darauf, dass Claude die Datei häufig selbst committet.

Insgesamt fand Apiiro auf öffentlichem GitHub 104.185 Kopien der Datei in 103.617 Repositories. Rund 1,1 Prozent davon enthalten mindestens ein Geheimnis. Als Geheimnis zählte ein Wert, wenn er einem bekannten Schlüsselformat entsprach oder wenn ein Passwort beziehungsweise Token neben der Adresse eines öffentlich erreichbaren Servers stand; zusätzlich musste eine KI-Prüfinstanz zustimmen. Ob jemand diese Geheimnisse genutzt hat, sagen die Forscher nicht.

Mehr als ein Drittel der Funde öffnet direkt eine Datenbank, darunter 379 Datenbankpasswörter. Hinzu kommen:

  • 43 SSH-Zugänge zu öffentlich erreichbaren Servern
  • 42 Tokens für GitHub, GitLab und npm
  • 23 AWS-Schlüssel

Unter den Eigentümern der Dateien sind 63 Organisationen, überwiegend Softwarefirmen jeder Größe. Zu den gravierendsten Fällen zählen laut den Forschern ein Cloud-Schlüssel mit Administratorrechten eines Datenbankanbieters sowie das Eigentümerpasswort einer Patientenakten-Datenbank.

Zum Stand Montag lag jede Datei mit einem Geheimnis weiterhin im Standardzweig ihres Repositories; in der Hälfte dieser Repositories bereits seit mindestens 217 Tagen. Ältere Versionen der Datei enthalten weitere 734 Geheimnisse in 509 Repositories, die in keiner aktuellen Kopie mehr vorkommen – meist, weil die Datei gelöscht wurde. Forks verbreiten das Problem zusätzlich: 211 Forks von 74 Repositories tragen dieselben Geheimnisse wie die Originale. Auch in 298 von 76.011 Kopien der gemeinsam genutzten Datei .claude/settings.json, die Teams bewusst einchecken, stecken Geheimnisse, überwiegend innerhalb von Erlaubnisregeln. Rechnet man diese, die älteren Versionen und gespeicherte Chat-Protokolle der Agenten hinzu, kommt Apiiro auf 2.539 Geheimnisse in 1.994 Repositories.

Von 16 Programmier-Agenten, deren Dokumentation die Forscher verglichen, ist Claude Code der einzige, für den bestätigt ist, dass er den vollständigen freigegebenen Befehl standardmäßig in einer Projektdatei speichert.

Das bloße Löschen der Datei behebt das Leck nicht, da ältere Versionen in der Git-Historie und in Forks bestehen bleiben. Die Forscher raten deshalb, zuerst zu rotieren und erst danach aufzuräumen. Für Entwickler empfehlen sie:

  • die eigene GitHub-Organisation nach .claude/settings.local.json und .claude/settings.json durchsuchen und die Git-Historie jedes Repositories prüfen, auch wo die Dateien verschwunden sind
  • jedes Passwort, Token und jeden Schlüssel wechseln, den die Dateien jemals enthalten haben, bevor aufgeräumt wird
  • die lokale Datei mit git rm --cached .claude/settings.local.json aus der Versionsverwaltung nehmen und in die projekteigene .gitignore eintragen
  • die Datei auf dem eigenen Rechner öffnen – auch wenn sie nie eingecheckt wurde – und jede Regel löschen, die ein Geheimnis enthält
  • Geheimnisse aus Befehlen heraushalten und stattdessen Variablen aus einem Secrets-Manager verwenden, etwa $DB_URL, sodass die gespeicherte Regel nur den Variablennamen enthält
  • Muster freigeben wie Bash(npm run:*) statt einzelner Befehle

Auch Kopien, die nie auf GitHub landen, sind relevant: Die Datei ist einfaches JSON im Projektordner und kann ebenso in einem npm-Paket, einem Docker-Image, einem ZIP-Archiv oder einem synchronisierten Ordner stecken. Dass Schadsoftware gezielt auf Entwicklerrechnern nach Geheimnissen sucht, ist bekannt – im September 2025 ließ der Wurm Shai-Hulud den Scanner TruffleHog über infizierte Rechner laufen, der mehr als die Hälfte der Dateien als geheimnishaltig markierte.

Gängige Scanner übersehen allerdings viele dieser Dateien. Die Forscher ließen gitleaks und TruffleHog ohne deren Verifikationsschritt über jede Kopie laufen: Von den 1.122 Dateien mit Geheimnis markierte gitleaks 564, TruffleHog 643; 215 erkannte keines der beiden Werkzeuge. Die meisten übersehenen Fälle sind Passwörter innerhalb von Befehlen – Scanner suchen nach bekannten Schlüsselformaten, und ein Passwort hinter PGPASSWORD=, sshpass -p oder mysql -p wirkt wie ein gewöhnliches Wort in einer gewöhnlichen Kommandozeile.

Sicherheitsteams empfehlen die Forscher, Agentenordner wie .claude/, .cursor/, .gemini/ und .specstory/ sowie Speicherdateien der Agenten wie .env-Dateien zu behandeln – auf Laptops ebenso wie in Repositories –, sie in Pre-Commit- und CI-Scans einschließlich Git-Historie aufzunehmen, dabei auf Passwörter in Befehlen und nicht nur auf bekannte Schlüsselformate zu achten, .claude/settings.local.json in die .gitignore-Vorlagen der Organisation aufzunehmen und zuerst jene Zugangsdaten zu prüfen, die mit einem öffentlich erreichbaren Server gepaart sind.

Auf das Verhalten hingewiesen hatten Nutzer schon zuvor: Ein Fehlerbericht vom 11. August 2025 beschrieb, dass freigegebene Befehle mit API-Schlüsseln und Tokens wortwörtlich in settings.local.json gespeichert werden. Ein automatischer Bot schloss diesen Bericht am 3. Januar nach 60 Tagen ohne Aktivität als „nicht geplant". Alle vier von den Forschern angeführten verwandten Berichte wurden inzwischen von demselben Bot geschlossen, der jüngste gestern. Eine Antwort von Anthropic erhielt nach ihren Angaben keiner davon.