Wie ausgereift ist Ihre Sicherheit? Vergleichen Sie Ihre Organisation und sehen Sie, wo Sie stehen. Nehmen Sie jetzt an der Bewertung teil

Ressourcen­zentrumBlog
Ihr KI-Codierassistent leakt Geheimnisse

Ihr KI-Codierassistent leakt Geheimnisse

May 12, 2026

KI-Desktop-Assistenten und Programmierwerkzeuge benötigen Anmeldedaten, um auf externe Dienste zuzugreifen, und viele von ihnen speichern diese Anmeldedaten als Klartext-JSON an vorhersehbaren Pfaden im Benutzerverzeichnis. Diese Untersuchung behandelt, wie die Speicherung von Anmeldedaten bei 14 beliebten KI-Tools funktioniert, wo eine Integration des Betriebssystem-Schlüsselbunds vorhanden oder fehlend ist, und acht Angriffsszenarien, die diese Exposition in ein echtes Risiko verwandeln – von Malware-basiertem Diebstahl über das Hijacking von Remote-Sitzungen bis hin zur Kompromittierung der Lieferkette über MCP-Server.

Wie Claude, Copilot, Cursor und andere KI-Tools Anmeldeinformationen im Klartext speichern und 8 Beispiele, wie Angreifer diese ausnutzen

Das Problem

KI-Desktop-Anwendungen müssen sich bei externen Diensten authentifizieren. Claude Code benötigt Ihre OAuth-Token. GitHub Copilot benötigt Ihre GitHub-Authentifizierung. Continue.dev benötigt Ihre API-Schlüssel. MCP-Server benötigen Tokens für Azure DevOps, Slack, Datenbanken und alles andere, was Sie verbunden haben. Wohin gehen all diese Anmeldeinformationen? Meistens in Klartext-JSON-Dateien in Ihrem Home-Verzeichnis. Diese Dateien befinden sich an bekannten oder vorhersehbaren Orten, was sie mit Lesezugriff auf ein System leicht auffindbar macht.

Was ich gefunden habe

Ich habe 14 beliebte KI-Tools (siehe Referenz am Ende des Blogs) für Windows, macOS und Linux untersucht. Dies sind die Dinge, die mir am meisten aufgefallen sind.

Claude Code CLI

~/.claude/.credentials.json enthält Ihre OAuth-Zugangs- und Aktualisierungstoken im Klartext-JSON:

      { 
  "claudeAi": { 
    "type": "oauth", 
    "access": "sk-ant-oat01-...", 
    "refresh": "sk-ant-ort01-...", 
    "expires": 1776098433694 
  } 
} 
      

Unter Linux wird die Datei mit 0600 Berechtigungen (nur Lesen/Schreiben für den Eigentümer) erstellt. Unter macOS werden die Anmeldeinformationen im Schlüsselbund (Keychain) gespeichert. Unter WSL erbt die Windows-Seite der Datei jedoch die Standardberechtigungen 0777, wodurch Ihre Claude OAuth-Tokens für alle lesbar für jeden Prozess im System werden. Das Refresh-Token ist hier wirklich gefährlich. Es ist langlebig und kann unbegrenzt neue Zugriffstoken generieren. Ein Angreifer, der es erhält, hat persistenten Zugriff auf Ihr Claude-Konto, bis Sie es explizit widerrufen.

MCP-Serverkonfigurationen: das Aggregationsproblem

Model Context Protocol (MCP)-Server ermöglichen es KI-Assistenten, sich mit externen Tools zu verbinden. Jede Verbindung benötigt eine Authentifizierung, und diese Tokens landen typischerweise in einer einzigen Konfigurationsdatei wie dieser:

      { 
  "mcpServers": { 
    "github": { "env": { "GITHUB_TOKEN": "ghp_realToken..." } }, 
    "azure": { "env": { "ADO_MCP_AUTH_TOKEN": "eyJ0eX..." } }, 
    "slack": { "env": { "SLACK_BOT_TOKEN": "xoxb-..." } }, 
    "database": { "env": { "DB_PASSWORD": "prod_password" } } 
  } 
} 
      

Eine Datei. Mehrere Dienste. Eine Leseoperation kann sie alle kompromittieren. Trend Micro fand heraus, dass 48 % von 19.402 MCP-Server-Implementierungen die Speicherung von Anmeldeinformationen im Klartext empfehlen.

Continue.dev: API-Schlüssel im Klartext

Continue.dev speichert jeden konfigurierten API-Schlüssel direkt in ~/.continue/config.json:

      { 
  "models": [{ 
    "provider": "anthropic", 
    "apiKey": "sk-ant-api03-YOUR-ACTUAL-KEY" 
  }] 
} 
      

Die Community erkennt dies als Problem an (GitHub-Issue #1729). Die Substitution von Umgebungsvariablen wird unterstützt (${VAR_NAME}), ist aber nicht das Standardverhalten.

Cline: Anmeldedaten in der Cloud synchronisiert

Die MCP-Einstellungen von Cline befinden sich in einer unverschlüsselten JSON-Datei im globalStorage von VS Code. Das Problem ist, dass VS Code Settings Sync diese Datei automatisch auf GitHub hochlädt. Wenn Sie Settings Sync aktiviert haben, liegen Ihre MCP-Anmeldedaten in der GitHub-Cloud.

Die VS Code SecretStorage-Verwirrung

GitHub Copilot, Cline und andere VS Code-Erweiterungen verwenden die SecretStorage-API, die Geheimnisse in einer SQLite-Datenbank (state.vscdb) mit AES-128-CBC verschlüsselt. Das klingt sicher, bis man erkennt:

  • VS Code-Erweiterungen laufen ohne Sandboxing
  • Der Verschlüsselungsschlüssel befindet sich im OS-Schlüsselbund und ist für jeden Benutzerprozess zugänglich
  • Jede bösartige Erweiterung kann die Geheimnisse anderer Erweiterungen lesen
  • Das Erweiterungs-Identifikationssystem ist anfällig für Spoofing

Die Verschlüsselung bietet Schutz gegen Offline-Zugriff auf die Festplatte, jedoch nicht gegen Prozesse, die unter demselben Benutzer ausgeführt werden.

Beispiele für Angriffsflächen

Ich habe 8 reale Angriffsszenarien identifiziert, die ich hervorheben wollte und die durch die Offenlegung von KI-Zugangsdaten ermöglicht werden.

1. Diebstahl von Anmeldeinformationen durch Malware

Die Dateipfade sind über alle Installationen hinweg vorhersehbar und konsistent:

      ~/.claude/.credentials.json 
~/.continue/config.json 
~/.aws/credentials 
~/.config/gcloud/application_default_credentials.json 
~/Library/Application Support/Claude/claude_desktop_config.json 
~/.claude.json 
      

Infostealer-Malware zielt bereits auf Browser-Cookies, SSH-Schlüssel und Cloud-Anmeldedaten ab. Das Hinzufügen einiger KI-Tool-Pfade zur Zielliste ist trivial. Keine Privilegienerweiterung erforderlich; das Lesen von Dateien auf Standardbenutzerebene reicht aus.

Eine einzige Malware-Infektion könnte Claude OAuth-Tokens, alle API-Schlüssel in Continue.dev, jeden MCP-Server-Token und AWS-Anmeldeinformationen preisgeben. Die Pfade sind bei jeder Installation jedes Tools gleich.

Risiko: KRITISCH. Hohe Wahrscheinlichkeit, hohe Auswirkung.

2. Übernahme einer Claude Code-Fernsteuerungssitzung

Dies ist das Szenario, das Ihnen Angst machen sollte. Claude Code verfügt über eine Remote Control Funktion (claude remote-control), die es Benutzern ermöglicht, ihre lokale Claude Code-Sitzung von einem Telefon, Tablet oder Browser über claude.ai/code zu steuern. Die gesamte Codeausführung bleibt auf dem lokalen Gerät. Das entfernte Gerät ist nur eine Steueroberfläche.

Hier ist das Problem: die Remote-Verbindung erfordert keine erneute Authentifizierung. Sobald eine Sitzung aktiv ist, kann jeder mit der Sitzungs-URL Anweisungen senden. Und all diese Anweisungen werden lokal auf dem Rechner des Entwicklers ausgeführt.

Kombinieren Sie das jetzt mit --dangerously-skip-permissions.

Dieses Flag deaktiviert alle interaktiven Berechtigungsabfragen. Datei-Schreibvorgänge, Shell-Befehle, Netzwerk-Anfragen, MCP-Tool-Aufrufe – alles wird automatisch ausgeführt, ohne den Benutzer zu fragen. Es ist für isolierte CI/CD-Container gedacht, aber manchmal verwenden Benutzer es aus Bequemlichkeit auf ihren Arbeitsstationen. Es kann auch als persistenter Standard in settings.json über "defaultMode": "bypassPermissions".

Die Angriffskette:

  1. Angreifer stiehlt OAuth-Tokens von ~/.claude/.credentials.json (über Malware, SSRF oder jede Datei-Lese-Schwachstelle)
  2. Tokens sind portabel, sodass sie von jedem Gerät aus funktionieren
  3. Wenn das Opfer eine aktive Remote Control-Sitzung hat, verbindet sich der Angreifer und übernimmt die Kontrolle
  4. If the victim runs with --dangerously-skip-permissions, the attacker now has unrestricted shell access as the victim's user:
    • Jede Datei im System lesen/schreiben
    • Beliebige Befehle ausführen (curl, ssh, docker, Paketmanager usw.)
    • Hintertüren installieren, Daten exfiltrieren, auf andere Maschinen pivotieren
    • Greifen Sie auf SSH-Schlüssel, Cloud-Anmeldeinformationen und alle anderen Geheimnisse im System zu
    • Git-Repositories, CI/CD-Pipelines und Deployment-Konfigurationen ändern

Auch ohne --dangerously-skip-permissions, genehmigt Claude Code im acceptEdits Modus automatisch Dateiänderungen und gängige Dateisystembefehle. Dies kann dennoch gefährlich sein. Das Berechtigungsmodell wurde entwickelt, um vor versehentlichen Aktionen zu schützen, nicht vor einem böswilligen Akteur, der die Sitzung kontrolliert.

Risiko: KRITISCH (mit --dangerously-skip-permissions), HOCH (Standardberechtigungen).

3. Laterale Bewegung über Claude OAuth-Token

Ein Angreifer, der ein Claude OAuth-Aktualisierungstoken aus ~/.claude/.credentials.json erhält, kann:

  1. Generieren Sie neue Zugriffstoken aus der Ferne (Zugriffstoken verfallen in ca. 60 Minuten, aber das Aktualisierungstoken ist langlebig)
  2. Greifen Sie auf die Claude-Konversationen und Arbeitsbereichsdateien des Opfers zu
  3. Verwenden Sie alle MCP-Server, die das Opfer konfiguriert hat (Zugriff auf deren GitHub-Repositories, Azure DevOps-Projekte, Slack-Arbeitsbereiche und Datenbanken über den KI-Assistenten als Proxy)

Die Tokens sind portabel. Kopieren Sie die Anmeldeinformationen-Datei auf eine andere Maschine, und Claude Code wird sie verwenden. Anthropic implementiert eine Rotation der Refresh-Tokens, sodass die Verwendung eines gestohlenen Tokens das Original möglicherweise ungültig macht, aber die erste Verwendung erfolgreich ist und der Angreifer vor der Rotation Zugriff erhalten kann.

Risiko: HOCH. Mittel-hohe Wahrscheinlichkeit, hohe Auswirkung.

4. MCP-Token-Aggregation: laterale Bewegung

Eine einzelne MCP-Konfigurationsdatei fasst Tokens für mehrere externe Dienste zusammen. Zum Beispiel könnte eine Datei Folgendes liefern:

  • GITHUB_PERSONAL_ACCESS_TOKEN → Code-Repositories, PRs, CI/CD
  • ADO_MCP_AUTH_TOKEN → Azure DevOps-Projekte
  • SLACK_BOT_TOKEN → internes Slack-Arbeitsbereich
  • Datenbank-Passwörter → Produktionsdaten
  • JIRA_API_TOKEN → Projektmanagement, interne Tickets

Im Gegensatz zur verteilten Anmeldeinformationsspeicherung, bei der die Kompromittierung eines Kanals nur einen Teil der Anmeldeinformationen offenlegt, bedeutet das Aggregationsmuster von MCP, dass die Offenlegung einer einzigen Datei eine Kaskade zur Kompromittierung aller verbundenen Dienste auslöst.

Risiko: KRITISCH. Hohe Wahrscheinlichkeit, hohe Auswirkung.

5. Bösartige VS Code-Erweiterung: Anmeldeinformationen exfiltrieren

VS Code-Erweiterungen laufen ohne Sandbox. Alle Erweiterungen teilen sich die gleichen Prozessberechtigungen. Eine bösartige oder kompromittierte Erweiterung kann:

  1. Greifen Sie direkt auf die SQLite-Datenbank state.vscdb zu
  2. Rufen Sie den Verschlüsselungsschlüssel aus dem OS-Schlüsselbund ab (für jeden Benutzerprozess zugänglich)
  3. Alle Erweiterungsgeheimnisse entschlüsseln: Copilot-Token, Cline-API-Schlüssel, MCP-Anmeldeinformationen

Die Datei cline_mcp_settings.json benötigt nicht einmal eine Entschlüsselung. Es ist unverschlüsselter Klartext im globalStorage von VS Code und wird über Settings Sync in die Cloud synchronisiert.

Die Felder publisher und name in der package.json zur Identifikation von Erweiterungen sind anfällig für Spoofing, wodurch es möglich ist, legitime Erweiterungen zu imitieren.

Risiko: HOCH. Mittlere Wahrscheinlichkeit, hohe Auswirkung.

6. WSL-Berechtigungserweiterung

Entwickler, die WSL verwenden, werden von beiden Seiten getroffen. Unter Windows installierte KI-Tools speichern Anmeldeinformationen unter C:\Users\<you>\, das in WSL als /mnt/c/Users/<you>/ mit Berechtigungen 0777 standardmäßig gemountet wird. Dieselbe Anmeldeinformationsdatei, die auf der Windows-Seite durch NTFS geschützt ist, ist weltweit lesbar von der Linux-Seite aus.

In Multi-User-WSL-Umgebungen oder kompromittierten Containern ist dies leicht auszunutzen. Jeder Prozess, der auf dem WSL-System läuft, kann Claude OAuth-Tokens, MCP-Konfigurationen usw. lesen, die auf der Windows-Seite gespeichert sind.

Risiko: HOCH für WSL-Nutzer. Hohe Wahrscheinlichkeit, mittelhohe Auswirkung.

7. .mcp.json in git committet: crAnmeldeinformationen exfiltriert

Die Datei .mcp.json im Stammverzeichnis des Repositories ist so konzipiert, dass sie versioniert wird, damit Teams MCP-Serverkonfigurationen teilen können. Wenn ein Entwickler Inline-Tokens anstelle von Umgebungsvariablenreferenzen verwendet:

  1. Tokens erscheinen im Git-Verlauf
  2. Selbst nach der Entfernung zeigt git log -p .mcp.json sie an
  3. Automatisierte Scanner (TruffleHog, GitLeaks usw.) können sie in großem Umfang auf GitHub/GitLab finden

Die Partnerschaft für geheimes Scannen zwischen Anthropic und GitHub entdeckt einige exponierte API-Schlüssel, aber MCP-Konfigurationstoken für andere Dienste (Azure DevOps, Slack, Datenbanken) werden nicht durch automatisiertes Scannen abgedeckt. Es gibt kein GitHub-Geheimscanner-Muster für ADO_MCP_AUTH_TOKEN oder SLACK_BOT_TOKEN, die in JSON-Umgebungsblöcken eingebettet sind.

Risiko: MITTEL. Mittlere Wahrscheinlichkeit, mittelhohe Auswirkung.

8. Angriff auf die Lieferkette über MCP-Server

MCP-Server sind oft npm-Pakete. Das Risiko in der Lieferkette ist dasselbe wie bei jeder npm-Abhängigkeit, aber mit einem kritischen Unterschied: MCP-Server erhalten beim Start Anmeldeinformationen.

  1. Beliebtes MCP-Serverpaket auf npm ist kompromittiert (oder ein Typosquat wurde veröffentlicht)
  2. Benutzer konfigurieren es in ihrer claude_desktop_config.json mit echten Tokens im env Block
  3. Der MCP-Serverprozess hat Zugriff auf alle ihm übergebenen Umgebungsvariablen, einschließlich Tokens
  4. Kompromittierter Server exfiltriert Tokens zur Infrastruktur des Angreifers

Ohne ordnungsgemäße OAuth 2.1 Audience-Validierung (RFC 8707) könnte ein bösartiger MCP-Server auch Zugriffstoken erhalten und diese gegen andere Dienste erneut verwenden (Token-Passthrough-Angriff).

Die Statistik von 48 % Klartext-Anmeldeinformationen bedeutet, dass fast die Hälfte aller MCP-Server-Setups Anmeldeinformationen direkt beim Start an den Serverprozess übergibt. Wenn dieser Serverprozess kompromittiert wird, sind auch alle Benutzer, die ihn installiert haben, kompromittiert.

Risiko: MITTEL. Niedrige bis mittlere Wahrscheinlichkeit, hohe Auswirkung.

Bonus: CI/CD-Token-Diebstahl

Der Befehl claude setup-token erzeugt ein einjähriges OAuth-Token (CLAUDE_CODE_OAUTH_TOKEN) für CI/CD-Pipelines. Dies schafft ein einzigartiges Risiko:

  • Das Token funktioniert von jeder Maschine bis zu einem Jahr
  • CI/CD-Systeme haben oft eine schwache Geheimnisverwaltung und eine begrenzte Job-Isolierung
  • Build-Protokolle können versehentlich Werte von Umgebungsvariablen offenlegen
  • Ein kompromittierter CI/CD-Runner gewährt langanhaltenden Zugriff auf Claude mit den Berechtigungen, die die Pipeline ausführt

Wenn Ihre CI/CD-Pipeline Claude Code mit --dangerously-skip-permissions ausführt (wie viele für die Automatisierung), gewährt ein gestohlener CLAUDE_CODE_OAUTH_TOKEN uneingeschränkte Shell-Ausführung auf jedem Computer, auf dem das Token verwendet wird.

Risiko: HOCH. Mittlere Wahrscheinlichkeit, hohe Auswirkung.

Was sich ändern muss

Für Benutzer (jetzt gerade)

  • Führen Sie AIHound aus. Wissen Sie, was auf Ihrem Computer exponiert ist.
  • Berechtigungen korrigieren: chmod 600 für Anmeldeinformationsdateien.
  • Verwenden Sie niemals **--dangerously-skip-permissions** auf Maschinen mit echten Anmeldeinformationen oder Netzwerkzugang. Wenn Sie es benötigen, verwenden Sie es in einem isolierten Container ohne eingebundene Geheimnisse.
  • Verwenden Sie Umgebungsvariablen-Referenzen in MCP-Konfigurationen anstelle von Inline-Token:
      "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" } 
      
  • Tokens rotieren, die in weltweit lesbaren Dateien oder im Git-Verlauf waren.
  • Deaktivieren Sie die VS Code Einstellungen-Synchronisierung wenn Sie Cline mit MCP-Servern verwenden.
  • Behandle **CLAUDE_CODE_OAUTH_TOKEN** wie ein Root-Passwort. Drehe es regelmäßig, speichere es niemals in Build-Logs und beschränke CI/CD-Berechtigungen auf das notwendige Minimum.
  • Fügen Sie **.mcp.json** zu **.gitignore** hinzu, wenn es Inline-Geheimnisse enthält.

Für Werkzeugentwickler

  • Verwenden Sie Betriebssystem-Schlüsselbund. macOS Keychain, Windows Credential Manager und Linux libsecret existieren genau zu diesem Zweck. Speichern Sie niemals Anmeldedaten als Klartext-JSON.
  • Erstellen Sie Dateien mit **0600** Berechtigungen. Nicht 0644 oder 0777.
  • Benutzer warnen wenn Sie Inline-Geheimnisse in MCP-Konfigurationen erkennen.
  • Synchronisieren Sie keine Anmeldedaten in der Cloud über Einstellungssynchronisierungsmechanismen.
  • Implementieren Sie OAuth 2.1 mit ordnungsgemäßer Token-Audience-Validierung für entfernte MCP-Server.
  • Erfordern Sie eine erneute Authentifizierung für Remote Control-Sitzungen. Eine Sitzungs-URL sollte kein Bearer-Token für beliebige Codeausführung sein.
  • MCP-Serverpakete prüfen bevor die Installation erlaubt wird, und Server-Whitelist-Unterstützung.

Für das Ökosystem

Die OWASP MCP Top 10 listet „Token-Fehlverwaltung und Geheimnisoffenlegung“ als MCP01-2025 auf. Die Partnerschaft von Anthropic und GitHub zur automatischen API-Schlüssel-Erkennung auf GitHub ist ein guter Anfang, deckt jedoch nur Anthropic-Schlüssel in öffentlichen Repositories ab. MCP-Token für Azure DevOps, Slack, Datenbanken und andere Dienste haben keinen entsprechenden Schutz.

Wir brauchen:

  • Geheimnis-Scanning das MCP-Konfigurationsmuster abdeckt, nicht nur API-Schlüsselformate
  • Anmeldeinformationshelfer für MCP (ähnlich wie git-Anmeldeinformationshelfer), die Token zur Laufzeit aus sicherem Speicher abrufen
  • Pflichtintegration des OS-Schlüsselbunds als Standard
  • Sandboxing für VS Code-Erweiterungen
  • Token-begrenzte Fernsteuerung - Remote-Sitzungen sollten eine eigene Authentifizierung erfordern und nicht die vollen Fähigkeiten der lokalen Sitzung übernehmen

Das Fazit

Das AI-Tooling-Ökosystem hat sich schnell entwickelt, um Funktionen bereitzustellen, und hat die Sicherheit von Zugangsdaten etwas vernachlässigt. Fast die Hälfte der MCP-Server speichert Zugangsdaten im Klartext. AI-Assistenten speichern OAuth-Tokens in JSON-Dateien auf der Festplatte. Remote Control-Funktionen ermöglichen es, dass diese Tokens zur Remote-Code-Ausführung werden. Und --dangerously-skip-permissions verwandelt gestohlene Zugangsdaten in vollen Shell-Zugriff auf die Maschine eines anderen. Je mehr Tools Sie verbinden, desto größer wird Ihr Risiko. Viele AI-Zugangsdaten werden nicht sicher gespeichert, daher sollten Sie bewährte Methoden für die Speicherung von Zugangsdaten implementieren. Tools wie AIHound können Ihnen helfen, diese Klartext-Zugangsdaten in Ihren Systemen zu finden.

Speicherorte für Anmeldeinformationen von AI-Desktop-Anwendungen zur Referenz

Diese Referenz katalogisiert jeden Speicherort, an dem einige der beliebtesten KI-Desktop-Anwendungen, Programmierassistenten und CLI-Tools Anmeldeinformationen auf der Festplatte speichern.

Claude Code CLI

Entwickler: Anthropic Authentifizierungsmethode: OAuth 2.0 (Claude.ai-Abonnement) oder API-Schlüssel

Anmeldeinformationen-Dateien

Platform

Path

Format

Encryption

Contents

Linux

~/.claude/.credentials.json

JSON

Plaintext (mode 0600)

OAuth access/refresh tokens, multi-provider auth

macOS

Keychain: Claude Code-credentials

Keychain

OS Keychain (encrypted)

OAuth access/refresh tokens

Windows

%USERPROFILE%\.claude\.credentials.json

JSON

Plaintext (NTFS ACLs)

OAuth access/refresh tokens

WSL

Both Linux path AND /mnt/c/Users/<user>/.claude/.credentials.json

JSON

Plaintext (often 0777 via mount)

Same as above

Credential file structure

      { 
  "claudeAi": { 
    "type": "oauth", 
    "access": "sk-ant-oat01-...", 
    "refresh": "sk-ant-ort01-...", 
    "expires": 1776098433694 
  } 
} 
      

Every OAuth connection stores its own entry. The file contains credentials for Claude.ai, Claude API, Azure Auth, Bedrock Auth, and Vertex Auth depending on what the user has configured.

Key finding: On WSL, the Windows-side credential file inherits the mount's default permissions (0777), making it world-readable, which is a CRITICAL risk that doesn't exist on native Linux where the file is created with 0600.

Configuration files with potential secrets

Path

Contents

~/.claude.json

Global MCP server configurations (may contain inline tokens)

.mcp.json (repo root)

Project-scoped MCP server configs

~/.claude/settings.json

User preferences and permissions

Authentication precedence order

Claude Code checks credentials in this order (first match wins):

  1. Cloud provider env vars (CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX, CLAUDE_CODE_USE_FOUNDRY)
  2. ANTHROPIC_AUTH_TOKEN environment variable
  3. ANTHROPIC_API_KEY environment variable
  4. apiKeyHelper script output (for dynamic/rotating credentials)
  5. CLAUDE_CODE_OAUTH_TOKEN environment variable (long-lived, from claude setup-token)
  6. OAuth credentials from ~/.claude/.credentials.json or Keychain

Known bug

A documented bug (GitHub issue #36779) shows that OAuth credentials are not properly persisted to macOS Keychain. Only the mcpOAuth field is stored while the primary auth token is missing, forcing re-authentication in new sessions.

Claude Desktop

Developer: Anthropic

Platform

Paths

macOS

~/Library/Application Support/Cursor/, ~/.cursor/

Windows

%APPDATA%\Cursor\, %USERPROFILE%\.cursor\

Linux

~/.config/Cursor/, ~/.cursor/

Auth method: Claude.ai session (Keychain-backed on macOS)

Configuration files

Platform

Path

Format

Encryption

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

JSON

Plaintext (often 0644)

Windows

%APPDATA%\Claude\claude_desktop_config.json

JSON

Plaintext

Linux

~/.config/Claude/claude_desktop_config.json

JSON

Plaintext

MSIX virtualization issue (Windows)

On Windows, the MSIX installer creates filesystem virtualization. The "Edit Config" button opens %APPDATA%\Claude\claude_desktop_config.json, but the application may actually read from a virtualized path inside the MSIX container. This means:

  • Users may edit the wrong file
  • MCP server configurations are silently ignored
  • No error messages indicate the problem

Pre-MSIX installations are grandfathered and read from the real AppData path.

What's in the config

The config file primarily holds MCP server definitions:

      { 
  "mcpServers": { 
    "azure-devops": { 
      "command": "npx", 
      "args": ["-y", "@anthropic/azure-devops-mcp"], 
      "env": { 
        "ADO_MCP_AUTH_TOKEN": "actual-token-here" 
      } 
    } 
  } 
} 
      

The env block frequently contains plaintext tokens for external services.

GitHub Copilot

Developer: GitHub / Microsoft Auth method: GitHub OAuth

Credential storage

Platform

Location

Format

Encryption

macOS

Keychain: copilot-cli

Keychain

OS Keychain

Windows

Credential Manager

Credential Manager

DPAPI

Linux (with libsecret)

GNOME Keyring / KWallet

libsecret

OS-level

Linux (no libsecret)

~/.copilot/config.json

JSON

Plaintext (fallback)

VS Code extension storage

Platform

Path

Linux

~/.config/Code/User/globalStorage/state.vscdb

macOS

~/Library/Application Support/Code/User/globalStorage/state.vscdb

Windows

%APPDATA%\Code\User\globalStorage\state.vscdb

The state.vscdb file is a SQLite database encrypted with Electron's safeStorage API (AES-128-CBC). However, security research has shown this is vulnerable to malicious VS Code extensions. Any extension can access other extensions' secrets due to lack of sandboxing.

The encryption key is stored in the OS keychain (Code Safe Storage on macOS), accessible by any process with user permissions.

Token types

Prefix

Type

Supported

gho_

OAuth token (default via copilot login)

Yes

github_pat_

Fine-grained PAT (needs "Copilot Requests" permission)

Yes

ghu_

GitHub App user-to-server token

Yes (env var only)

ghp_

Classic PAT

Not supported

GitHub CLI auth (also used by Copilot)

Platform

Path

Format

Linux

~/.config/gh/hosts.yml

YAML

macOS

~/Library/Application Support/gh/hosts.yml

YAML

Windows

%APPDATA%\GitHub CLI\hosts.yml

YAML

Cursor IDE

Developer: Anysphere Auth method: Cursor account + optional API keys

Storage locations

Platform

Paths

macOS

~/Library/Application Support/Cursor/, ~/.cursor/

Windows

%APPDATA%\Cursor\, %USERPROFILE%\.cursor\

Linux

~/.config/Cursor/, ~/.cursor/

MCP configuration

~/.cursor/mcp.json, which follows the same mcpServers JSON structure as Claude Desktop. May contain inline auth tokens.

Known issues

Cursor stores conversation logs with world-readable permissions. These logs can contain credentials if users paste tokens into the chat interface.

Continue.dev

Developer: Continue (open source) Auth method: Direct API keys per provider

Configuration files

Platform

Path

Format

Encryption

All

~/.continue/config.json

JSON

Plaintext

All

~/.continue/config.yaml

YAML

Plaintext

Credential format

      { 
  "models": [ 
    { 
      "title": "Claude 3.5 Sonnet", 
      "provider": "anthropic", 
      "model": "claude-3-5-sonnet-20241022", 
      "apiKey": "sk-ant-api03-ACTUAL-KEY-HERE" 
    } 
  ] 
} 
      

All API keys are stored in plaintext at the user root. This is acknowledged by the Continue.dev community as a security concern (GitHub issue #1729).

Mitigation

Continue.dev supports environment variable substitution:

      "apiKey": "${CONTINUE_ANTHROPIC_API_KEY}" 
      

It checks .env files at the project root and custom locations specified via envFiles. However, the default behavior is plaintext if env vars aren't configured.

Cline (VS Code extension)

Developer: Saoud Rizwan Extension ID: saoudrizwan.claude-dev

MCP settings (plaintext)

Platform

Path

macOS

~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json

Windows

%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json

Linux

~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json

Critical: These files are plaintext JSON and are automatically synced to the cloud through VS Code Settings Sync. This means API keys and MCP credentials get uploaded to GitHub if sync is enabled.

API key storage

Cline stores API keys through VS Code's SecretStorage API (the same AES-128-CBC encrypted state.vscdb used by Copilot). Subject to the same malicious extension vulnerability.

Windsurf / Codeium

Developer: Codeium Auth method: Codeium account

Storage locations

Platform

Path

All

~/.codeium/windsurf/

Look for config.json, auth.json, credentials.json within this directory.

MCP configuration

~/.codeium/windsurf/mcp_config.json with the same mcpServers structure.

Credential details are not well-documented publicly. Authentication appears to go through Codeium's centralized backend rather than local token storage in many cases.

ChatGPT Desktop

Developer: OpenAI Auth method: OpenAI account session

Storage locations

Platform

Path

Encryption

macOS

~/Library/Application Support/ChatGPT/

Keychain for session

macOS

~/Library/Application Support/com.openai.chat/

Keychain for session

Windows

%APPDATA%\OpenAI\ChatGPT\

Credential Manager

Windows

%APPDATA%\com.openai.chat\

Credential Manager

ChatGPT Desktop primarily uses OS credential stores (Keychain on macOS, Credential Manager on Windows) for session tokens. JSON config files in the app data directory may also contain session data.

Amazon Q Developer / AWS

Developer: Amazon Web Services Auth method: IAM Identity Center / AWS Builder ID / IAM credentials

Credential files

Path

Format

Contents

~/.aws/credentials

INI

Plaintext access key ID, secret access key, session token (per profile)

~/.aws/config

INI

Region, output format, SSO configuration

~/.aws/sso/cache/*.json

JSON

Plaintext SSO access tokens (cached)

Credential file structure

      [default] 
aws_access_key_id = AKIAIOSFODNN7EXAMPLE 
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 
aws_session_token = FwoGZXIvYXdzEBY... 
      

Notes

  • Amazon Q itself authenticates through IAM Identity Center or Builder ID, not through local file storage
  • Default SSO session duration is 90 days (for setups created after April 2024)
  • Static credentials in ~/.aws/credentials are the primary risk. Consider using SSO/IAM Identity Center instead

Google Gemini CLI / GCloud

Developer: Google Auth method: Google account OAuth, API key, or service account

API key storage

Location

Format

Contents

$GEMINI_API_KEY env var

Environment variable

Gemini API key

$GOOGLE_API_KEY env var

Environment variable

Google API key

~/.gemini/.env

Dotenv

API keys

~/.env

Dotenv

API keys

Application default credentials (ADC)

Platform

Path

Format

Linux

~/.config/gcloud/application_default_credentials.json

JSON

macOS

~/Library/Application Support/gcloud/application_default_credentials.json

JSON

macOS (alt)

~/.config/gcloud/application_default_credentials.json

JSON

Windows

%APPDATA%\gcloud\application_default_credentials.json

JSON

ADC files contain client_secret, refresh_token, and potentially private_key (for service accounts) in plaintext JSON.

Authentication methods

Method

How

Local Storage

Sign in with Google

gemini auth login (browser flow)

Cached locally for future sessions

Gemini API Key

GEMINI_API_KEY env var

Environment or .env file

Service Account

GOOGLE_APPLICATION_CREDENTIALS env var pointing to key file

JSON key file on disk

ADC via gcloud

gcloud auth application-default login

application_default_credentials.json

Cloud Shell

Automatic (metadata server)

No local storage

OpenClaw

Developer: OpenClaw (open source) Auth method: OAuth 2.0 per provider, API keys, channel-specific tokens

Overview

OpenClaw is a local-first AI agent platform that connects to 20+ messaging channels (WhatsApp, Telegram, Slack, Discord) and executes tools on the local machine. It stores credentials for both LLM providers and messaging channels.

Credential files

Path

Format

Encryption

Contents

~/.openclaw/agents/<agentId>/agent/auth-profiles.json

JSON

Plaintext (0600)

OAuth access/refresh tokens + API keys per LLM provider

~/.openclaw/credentials/whatsapp/<accountId>/creds.json

JSON

Plaintext

WhatsApp Baileys auth state

~/.openclaw/credentials/oauth.json

JSON

Plaintext

Legacy OAuth tokens (migration file)

~/.openclaw/credentials/<channel>-allowFrom.json

JSON

Plaintext

Channel pairing allowlists

~/.openclaw/secrets.json

JSON

Plaintext

Optional secrets payload for SecretRef resolution

~/.openclaw/openclaw.json

JSON5

Plaintext

Main config with gateway auth token, channel tokens, agent API keys

~/.openclaw/.env

Dotenv

Plaintext

Environment variable overrides (may contain API keys)

Auth profile structure

Each agent has its own auth-profiles.json containing provider credentials:

      { 
  "anthropic": { 
    "accessToken": "sk-ant-...", 
    "refreshToken": "sk-ant-ort01-...", 
    "expiresAt": 1776098433694 
  }, 
  "openai": { 
    "apiKey": "sk-proj-..." 
  } 
} 
      

All tokens are stored in plaintext JSON by default. No OS keychain integration.

SecretRef system (opt-in)

OpenClaw supports an opt-in SecretRef system that replaces plaintext values with references to external sources:

Provider

Example

Description

env

env:ANTHROPIC_API_KEY

Reads from environment variable

file

file:~/.secrets/api-key.txt

Reads from file (JSON pointer or single value)

exec

exec:pass show openclaw/anthropic

Runs vault-like executable

Users must run openclaw secrets configure to scrub existing plaintext values and migrate to SecretRefs. The default behavior is plaintext storage.

Gateway authentication

The gateway uses a token for local access control:

      { 
  "gateway": { 
    "auth": { 
      "mode": "token", 
      "token": "long-random-string-here" 
    } 
  } 
} 
      

This token can be a SecretRef but is commonly hardcoded in openclaw.json.

Known security issues

Issue

Severity

Details

Plaintext credential storage

HIGH

OAuth tokens and API keys in auth-profiles.json with no keychain

Agent tool bypass

HIGH

Agents with filesystem/exec tools can cat credential files, bypassing config.get redaction (GitHub #11829)

Tailscale exposure

MEDIUM

Remote access via Tailscale could expose the local gateway if token auth isn't configured

OAuth refresh failures

MEDIUM

Silent token refresh failures, Anthropic token truncation bugs

Session persistence

LOW

WhatsApp sessions not always persisted across restarts

Credential locations summary

All files live under ~/.openclaw/ on all platforms (Linux, macOS, Windows). On WSL, both Linux-native and Windows-mounted paths should be checked.

MCP server configurations

Config file locations

Tool

Path

Scope

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Application

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Application

Claude Code (local)

~/.claude.json

User (private)

Claude Code (project)

.mcp.json

Repository (shared)

Cursor

~/.cursor/mcp.json

User

VS Code

.vscode/mcp.json

Workspace

Cline

cline_mcp_settings.json in VS Code globalStorage

Extension

Common MCP auth environment variables

Variable

Service

ADO_MCP_AUTH_TOKEN

Azure DevOps

GITHUB_PERSONAL_ACCESS_TOKEN

GitHub

GITHUB_TOKEN

GitHub

SLACK_BOT_TOKEN

Slack

JIRA_API_TOKEN

Atlassian Jira

NOTION_API_KEY

Notion

LINEAR_API_KEY

Linear

Environment variables

The following environment variables are commonly set by users or tools and contain AI-related secrets:

Anthropic / Claude

Variable

Description

ANTHROPIC_API_KEY

Anthropic API key (sk-ant-api03-...)

ANTHROPIC_AUTH_TOKEN

Bearer auth token

CLAUDE_CODE_OAUTH_TOKEN

Long-lived OAuth token (from claude setup-token, valid ~1 year)

OpenAI

Variable

Description

OPENAI_API_KEY

OpenAI API key (sk-...)

OPENAI_ORG_ID

Organization identifier

Google

Variable

Description

GEMINI_API_KEY

Gemini API key

GOOGLE_API_KEY

Google API key (AIza...)

GOOGLE_APPLICATION_CREDENTIALS

Path to service account JSON key file

GitHub

Variable

Description

GITHUB_TOKEN

GitHub token

GH_TOKEN

GitHub CLI token

GITHUB_PERSONAL_ACCESS_TOKEN

GitHub PAT

COPILOT_GITHUB_TOKEN

Copilot-specific token

AWS

Variable

Description

AWS_ACCESS_KEY_ID

AWS access key (AKIA...)

AWS_SECRET_ACCESS_KEY

AWS secret key

AWS_SESSION_TOKEN

Temporary session token

Azure

Variable

Description

ADO_MCP_AUTH_TOKEN

Azure DevOps MCP token

AZURE_OPENAI_API_KEY

Azure OpenAI key

Other AI providers

Variable

Description

HF_TOKEN / HUGGING_FACE_HUB_TOKEN

Hugging Face

COHERE_API_KEY

Cohere

REPLICATE_API_TOKEN

Replicate

TOGETHER_API_KEY

Together AI

GROQ_API_KEY

Groq

MISTRAL_API_KEY

Mistral AI

DEEPSEEK_API_KEY

DeepSeek

XAI_API_KEY

xAI / Grok

PERPLEXITY_API_KEY

Perplexity

FIREWORKS_API_KEY

Fireworks AI

Teilen auf

Erfahren Sie mehr

Über den Autor

Portrt von darryl baker

Darryl Baker

Senior Security Researcher

Darryl G. Baker ist Senior Staff Security Researcher bei Netwrix und eine anerkannte Autorität im Bereich Identity und Active Directory Sicherheit. Mit über einem Jahrzehnt Erfahrung in Identitätssystemen hat er Unternehmenssicherheitsbewertungen, Schulungen zur Identitätssicherheit und Bedrohungsimulationen mit Fokus auf Active Directory, Entra ID und Azure-Umgebungen geleitet. Darryl hat hoch bewertete Schulungen und Demos bei BlueTeamCon, BSidesCT, The Experts Conference und Wild Wild West Hackin’ Fest gehalten. Er ist der Architekt zahlreicher praxisorientierter Angriffsemulationslabore, die aktuelle Red-Team- und Blue-Team-Tools nutzen, um Verteidigern zu helfen, alles von Angriffspfadanalyse bis Bedrohungsjagd zu meistern. In seinen Sitzungen verbindet Darryl tiefgehende technische Einblicke mit realen Fallstudien und befähigt Blue-Team-Profis, ihre Identity-Sicherheitslage zu stärken und sich gegen sich entwickelnde Angreifertechniken zu verteidigen.