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:
- Angreifer stiehlt OAuth-Tokens von
~/.claude/.credentials.json(über Malware, SSRF oder jede Datei-Lese-Schwachstelle) - Tokens sind portabel, sodass sie von jedem Gerät aus funktionieren
- Wenn das Opfer eine aktive Remote Control-Sitzung hat, verbindet sich der Angreifer und übernimmt die Kontrolle
- 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:
- Generieren Sie neue Zugriffstoken aus der Ferne (Zugriffstoken verfallen in ca. 60 Minuten, aber das Aktualisierungstoken ist langlebig)
- Greifen Sie auf die Claude-Konversationen und Arbeitsbereichsdateien des Opfers zu
- 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/CDADO_MCP_AUTH_TOKEN→ Azure DevOps-ProjekteSLACK_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:
- Greifen Sie direkt auf die SQLite-Datenbank
state.vscdbzu - Rufen Sie den Verschlüsselungsschlüssel aus dem OS-Schlüsselbund ab (für jeden Benutzerprozess zugänglich)
- 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:
- Tokens erscheinen im Git-Verlauf
- Selbst nach der Entfernung zeigt
git log -p .mcp.jsonsie an - 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.
- Beliebtes MCP-Serverpaket auf npm ist kompromittiert (oder ein Typosquat wurde veröffentlicht)
- Benutzer konfigurieren es in ihrer
claude_desktop_config.jsonmit echten Tokens imenvBlock - Der MCP-Serverprozess hat Zugriff auf alle ihm übergebenen Umgebungsvariablen, einschließlich Tokens
- 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 600fü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. Nicht0644oder0777. - 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 |
|
JSON
|
Plaintext (mode 0600) |
OAuth access/refresh tokens, multi-provider auth |
|
macOS |
Keychain: |
Keychain |
OS Keychain (encrypted) |
OAuth access/refresh tokens |
|
Windows |
|
JSON
|
Plaintext (NTFS ACLs) |
OAuth access/refresh tokens |
|
WSL |
Both Linux path AND |
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 |
|---|---|
|
|
Global MCP server configurations (may contain inline tokens) |
|
|
Project-scoped MCP server configs |
|
|
User preferences and permissions |
Authentication precedence order
Claude Code checks credentials in this order (first match wins):
- Cloud provider env vars (
CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX,CLAUDE_CODE_USE_FOUNDRY) ANTHROPIC_AUTH_TOKENenvironment variableANTHROPIC_API_KEYenvironment variableapiKeyHelperscript output (for dynamic/rotating credentials)CLAUDE_CODE_OAUTH_TOKENenvironment variable (long-lived, fromclaude setup-token)- OAuth credentials from
~/.claude/.credentials.jsonor 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 |
|
|
Windows |
|
|
Linux |
|
Auth method: Claude.ai session (Keychain-backed on macOS)
Configuration files
Platform | Path | Format | Encryption |
|---|---|---|---|
|
macOS |
|
JSON |
Plaintext (often 0644) |
|
Windows |
|
JSON
|
Plaintext |
|
Linux |
|
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: |
Keychain |
OS Keychain |
|
Windows |
Credential Manager |
Credential Manager |
DPAPI |
|
Linux (with libsecret) |
GNOME Keyring / KWallet |
libsecret |
OS-level |
|
Linux (no libsecret) |
|
JSON |
Plaintext (fallback) |
VS Code extension storage
Platform | Path |
|---|---|
|
Linux |
|
|
macOS |
|
|
Windows |
|
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 |
|---|---|---|
|
|
OAuth token (default via |
Yes |
|
|
Fine-grained PAT (needs "Copilot Requests" permission) |
Yes |
|
|
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 |
|
YAML |
|
macOS |
|
YAML |
|
Windows |
|
YAML |
Cursor IDE
Developer: Anysphere Auth method: Cursor account + optional API keys
Storage locations
Platform | Paths |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
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 |
|
JSON
|
Plaintext |
|
All |
|
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 |
|
|
Windows |
|
|
Linux |
|
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 |
|
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 |
|
Keychain for session |
|
macOS |
|
Keychain for session |
|
Windows |
|
Credential Manager |
|
Windows |
|
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 |
|---|---|---|
|
|
INI
|
Plaintext access key ID, secret access key, session token (per profile) |
|
|
INI |
Region, output format, SSO configuration |
|
|
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/credentialsare 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 |
|---|---|---|
|
|
Environment variable |
Gemini API key |
|
|
Environment variable |
Google API key |
|
|
Dotenv |
API keys |
|
|
Dotenv |
API keys |
Application default credentials (ADC)
Platform | Path | Format |
|---|---|---|
|
Linux |
|
JSON |
|
macOS |
|
JSON |
|
macOS (alt) |
|
JSON |
|
Windows |
|
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 |
|
Cached locally for future sessions |
|
Gemini API Key |
|
Environment or |
|
Service Account |
|
JSON key file on disk |
|
ADC via gcloud |
|
|
|
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 |
|---|---|---|---|
|
|
JSON
|
Plaintext (0600) |
OAuth access/refresh tokens + API keys per LLM provider |
|
|
JSON
|
Plaintext |
WhatsApp Baileys auth state |
|
|
JSON
|
Plaintext |
Legacy OAuth tokens (migration file) |
|
|
JSON |
Plaintext |
Channel pairing allowlists |
|
|
JSON
|
Plaintext |
Optional secrets payload for SecretRef resolution |
|
|
JSON5
|
Plaintext |
Main config with gateway auth token, channel tokens, agent API keys |
|
|
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 |
|---|---|---|
|
|
|
Reads from environment variable |
|
|
|
Reads from file (JSON pointer or single value) |
|
|
|
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
|
|
Agent tool bypass |
HIGH |
Agents with filesystem/exec tools can |
|
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) |
|
Application |
|
Claude Desktop (Windows) |
|
Application |
|
Claude Code (local) |
|
User (private) |
|
Claude Code (project) |
|
Repository (shared) |
|
Cursor |
|
User |
|
VS Code |
|
Workspace |
|
Cline |
|
Extension |
Common MCP auth environment variables
Variable | Service |
|---|---|
|
|
Azure DevOps |
|
|
GitHub |
|
|
GitHub |
|
|
Slack |
|
|
Atlassian Jira |
|
|
Notion |
|
|
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 ( |
|
|
Bearer auth token |
|
|
Long-lived OAuth token (from |
OpenAI
Variable | Description |
|---|---|
|
|
OpenAI API key ( |
|
|
Organization identifier |
Variable | Description |
|---|---|
|
|
Gemini API key |
|
|
Google API key ( |
|
|
Path to service account JSON key file |
GitHub
Variable | Description |
|---|---|
|
|
GitHub token |
|
|
GitHub CLI token |
|
|
GitHub PAT |
|
|
Copilot-specific token |
AWS
Variable | Description |
|---|---|
|
|
AWS access key ( |
|
|
AWS secret key |
|
|
Temporary session token |
Azure
Variable | Description |
|---|---|
|
|
Azure DevOps MCP token |
|
|
Azure OpenAI key |
Other AI providers
Variable | Description |
|---|---|
|
|
Hugging Face |
|
|
Cohere |
|
|
Replicate |
|
|
Together AI |
|
|
Groq |
|
|
Mistral AI |
|
|
DeepSeek |
|
|
xAI / Grok |
|
|
Perplexity |
|
|
Fireworks AI |
Teilen auf
Erfahren Sie mehr
Über den Autor
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.