Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

你的 AI 代码编写助手正在泄露敏感信息

你的 AI 代码编写助手正在泄露敏感信息

May 12, 2026

AI 桌面助手和代码编写工具需要凭据才能访问外部服务,而其中许多工具会在用户主目录中的可预测路径下,将这些凭据以明文(plaintext)JSON 的形式存储。 本研究涵盖 14 款受欢迎的 AI 工具中凭据存储的工作方式,说明在存在或缺失 OS 密钥链(keychain)集成的情况下各会如何,以及八个将这种暴露转化为真实风险的攻击场景:从基于恶意软件的窃取,到远程会话劫持,再到通过 MCP 服务器造成的供应链(supply-chain)受损。

Claude、Copilot、Cursor 和其他 AI 工具如何以明文(plaintext)存储凭据,以及攻击者如何利用它们的 8 个案例

问题

AI 桌面应用程序需要与外部服务进行身份验证。Claude Code 需要你的 OAuth 令牌。GitHub Copilot 需要你的 GitHub 授权信息。Continue.dev 需要你的 API 密钥。MCP 服务器需要用于 Azure DevOps、Slack、数据库以及你所连接的其他一切服务的令牌。这些凭据最终会被放到哪里?大多会进入你主目录里的明文 JSON 文件。这些文件位于广为人知或可预测的位置,因此只要具备对系统的读取权限,就很容易找到它们。

我发现了什么

我在 Windows、macOS 和 Linux 上探索了 14 款受欢迎的 AI 工具(请参阅博客末尾的参考资料)。以下是让我印象最深的几点。

Claude Code CLI

~/.claude/.credentials.json 会以 明文 JSON 的形式包含你的 OAuth 访问令牌和刷新令牌:

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

在 Linux 上,该文件会以 0600 权限(仅所有者可读/写)创建。在 macOS 上,凭据会存放到 Keychain。 但在 WSL 上,Windows 侧的文件会继承挂载点的默认 0777 权限,从而使你的 Claude OAuth 令牌 对系统中的所有进程都可读取 。这里真正危险的是刷新令牌。它的有效期很长,并且可以无限期地生成新的访问令牌。攻击者一旦获得它,就能在你明确撤销之前持续访问你的 Claude 账户。

MCP 服务器配置:聚合问题

Model Context Protocol (MCP) 服务器允许 AI 助手连接到外部工具。每次连接都需要身份验证,而这些令牌通常会最终集中在一个配置文件中,例如:

      { 
  "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" } } 
  } 
} 
      

一个文件,多个服务。一次读取操作就可能让它们全部遭到破坏。 Trend Micro 发现 在 19,402 个 MCP 服务器实现中,有 48% 建议使用明文凭据存储。

Continue.dev:API 密钥以明文形式存在

Continue.dev 会将每个已配置的 API 密钥直接存储在 ~/.continue/config.json

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

社区承认这是一 个问题(GitHub issue #1729)。支持使用环境变量替换(${VAR_NAME}),但这并不是默认行为。

Cline:凭据会与云端同步

Cline 的 MCP 设置保存在 VS Code 的 globalStorage 中的未加密 JSON 文件里。问题在于,VS Code Settings Sync 会自动将该文件上传到 GitHub 如果启用了 Settings Sync,你的 MCP 凭据就会存放在 GitHub 的云端。

VS Code SecretStorage 的混淆

GitHub Copilot、Cline 以及其他 VS Code 扩展使用 SecretStorage API:该 API 会将机密加密到一个 SQLite 数据库中(state.vscdb),并使用 AES-128-CBC 进行加密。听起来很安全,直到你意识到:

  • VS Code 扩展在没有沙箱的情况下运行
  • 加密密钥存放在操作系统的密钥串(keychain)中,任何用户级进程都可以访问
  • 任何恶意扩展都可以读取其他扩展的机密
  • 扩展识别系统容易受到欺骗(spoofing)的攻击

加密可以防御对离线磁盘的访问,但无法防御以同一用户身份运行的任何进程。

攻击面示例

我识别出了 8 个真实世界的攻击场景,这些场景之所以能够实现,是因为发生了 AI 凭证泄露。

1. 通过恶意软件窃取凭证

文件路径在所有安装中都具有可预测性且保持一致:

      ~/.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)恶意软件已经瞄准浏览器 Cookie、SSH 密钥和云凭据。将少量 AI 工具路径加入目标列表非常简单。不需要权限提升;读取普通用户级别的文件就足够了。

一次恶意软件感染可能会获取 Claude OAuth 令牌、Continue.dev 中的所有 API 密钥、每一个 MCP 服务器令牌以及 AWS 凭据。每个工具的每次安装中,路径都是相同的。

风险:CRITICAL。 可能性高,影响大。

2. 劫持 Claude Code 远程控制会话

这是一个应该让你感到害怕的场景。Claude Code 具有 Remote Control 功能(claude remote-control),允许用户通过 claude.ai/code 从手机、平板或浏览器控制他们本地的 Claude Code 会话。所有代码执行都保持在本地机器上。远程设备只是一个控制界面。

问题在于:远程连接不需要重新认证。 一旦会话处于激活状态,任何知道会话 URL 的人都可以发送指令。而这些指令都会在开发者的机器上本地执行。

现在再把它与 --dangerously-skip-permissions.

该标志会禁用所有交互式权限提示。文件写入、Shell 命令、网络请求、MCP 工具调用——所有操作都会在不向用户询问的情况下自动执行。它本用于隔离的 CI/CD 容器,但有时用户为了方便会在工作站上使用它。还可以在 settings.json 中通过 "defaultMode": "bypassPermissions" 设置为持久的默认值。

攻击链:

  1. 攻击者从以下位置窃取 OAuth 令牌:~/.claude/.credentials.json(通过恶意软件、SSRF 或任何文件读取漏洞)
  2. 令牌可以携带,因此可在任意机器上使用
  3. 如果受害者存在处于活动状态的远程控制会话,攻击者将进行连接并接管控制权
  4. 如果受害者以 --dangerously-skip-permissions 运行,那么攻击者现在拥有 以受害者用户身份进行不受限制的 shell 访问
    • 读取/写入系统上的任何文件
    • 执行任意命令(curlsshdocker,以及包管理器等)
    • 安装后门、窃取数据、并转向其他机器
    • 访问 SSH 密钥、云凭据以及系统中的其他所有机密信息
    • 修改 Git 仓库、CI/CD 管道以及部署配置

即使不使用 --dangerously-skip-permissions,在 acceptEdits 模式下,Claude Code 会自动批准文件编辑和常见的文件系统命令。 这仍然可能很危险。权限模型的设计目的是防止意外操作,而不是防范控制会话的恶意行为者。

风险:CRITICAL(使用 --dangerously-skip-permissions),HIGH(默认权限)。

3. 通过 Claude OAuth 令牌进行横向移动

攻击者如果从 ~/.claude/.credentials.json 获取到 Claude OAuth 刷新令牌,则可以:

  1. 远程生成新的访问令牌(访问令牌约在 60 分钟后过期,但刷新令牌的有效期较长)。
  2. 访问受害者的 Claude 对话和工作区文件。
  3. 使用受害者已配置的任何 MCP 服务器(通过 AI 助手充当代理来访问他们的 GitHub 代码库、Azure DevOps 项目、Slack 工作区和数据库)

这些令牌是可移植的。将凭据文件复制到另一台机器上,Claude Code 就会使用它。Anthropic 实现了刷新令牌轮换,因此使用被盗令牌可能最终会使原令牌失效;但初始使用会成功,攻击者可能会在轮换生效之前获得访问权限。

风险:高。 中高的可能性,高的影响。

4. MCP 令牌聚合:横向移动

单个 MCP 配置文件会汇总用于 多个 外部服务的令牌。例如,一个文件可能产生:

  • GITHUB_PERSONAL_ACCESS_TOKEN → 代码仓库、PR、CI/CD
  • ADO_MCP_AUTH_TOKEN → Azure DevOps 项目
  • SLACK_BOT_TOKEN → 内部 Slack 工作区
  • 数据库密码 → 生产数据
  • JIRA_API_TOKEN → 项目管理、内部工单

与分布式凭据存储不同:在分布式凭据存储中,攻破一个通道通常只会暴露部分凭据;而 MCP 的聚合模式意味着一旦发生单个文件泄露,就会连锁导致所有已连接的服务被攻破。

风险:CRITICAL。 发生可能性高,影响大。

5. 恶意 VS Code 扩展:凭据窃取(exfiltration)

VS Code 扩展在没有沙箱(sandboxing)的情况下运行。所有扩展共享相同的进程权限。恶意或已被入侵的扩展可能会:

  1. 直接访问 state.vscdb SQLite 数据库
  2. 从操作系统密钥链中检索加密密钥(任何用户级进程都可访问)
  3. 解密所有扩展程序的机密信息:Copilot 令牌、Cline API 密钥、MCP 凭证

Cline 的 cline_mcp_settings.json 甚至不需要解密。它以未加密的明文形式存放在 VS Code 的 globalStorage 中,并通过 Settings Sync 同步到云端。

用于标识扩展的 package.json 中的 publisher 和 name 字段易受欺骗(伪造)攻击,从而可以冒充合法的扩展程序。

风险:高。 发生可能性中等,影响较大。

6. WSL 权限提升

使用 WSL 的开发者会同时从两方面遭到打击。Windows 上安装的 AI 工具会将凭据存储在 C:\Users\<you>\ 下,该路径在 WSL 中以 /mnt/c/Users/<you>/ 挂载,并默认使用 0777 权限。Windows 侧受 NTFS 保护的同一个凭据文件,在 Linux 侧会变成 world-readable

在多用户 WSL 环境或被入侵的容器中,这一点很容易被利用。在 WSL 系统上运行的任何进程都可以读取存储在 Windows 侧的 Claude OAuth tokens、MCP 配置等。

风险:高(HIGH) 适用于 WSL 用户。可能性高,影响中等偏高。

7. .mcp.json 提交到 git:凭据泄露(credential exfiltration)

仓库根目录下的 Claude Code 的 .mcp.json 设计为进行版本控制,以便团队可以共享 MCP 服务器配置。如果开发者在内联令牌而不是 env var 引用中包含了令牌:

  1. 令牌会出现在 git 历史记录中
  2. 即使移除之后,git log -p .mcp.json 仍会暴露它们
  3. 自动化扫描器(TruffleHog、GitLeaks 等)可以在 GitHub/GitLab 上大规模发现它们

Anthropic 与 GitHub 的 secret scanning 合作能够捕获一些暴露的 API 密钥,但用于其他服务(Azure DevOps、Slack、数据库)的 MCP 配置令牌 not 不包含在自动化扫描的覆盖范围内。GitHub secret scanner 并没有用于 ADO_MCP_AUTH_TOKENSLACK_BOT_TOKEN 嵌入在 JSON env 块中的模式。

风险:MEDIUM。 发生可能性中等,影响中等偏高。

8. 通过 MCP 服务器进行供应链攻击

MCP 服务器通常是 npm 包。供应链风险与任何 npm 依赖相同,但有一个关键区别: MCP 服务器在启动时会接收凭据。

  1. npm 上的热门 MCP 服务器包被入侵(或发布了仿冒拼写的包)
  2. 用户会在自己的 claude_desktop_config.json 中,以真实的令牌填写到 env 块里。
  3. MCP 服务器进程可访问传递给它的所有环境变量,包括令牌(tokens)。
  4. 被攻陷的服务器会将令牌(tokens)外传到攻击者的基础设施。

在没有进行正确的 OAuth 2.1 audience 验证(RFC 8707)的情况下,恶意的 MCP 服务器还可能接收访问令牌,并将其重放到其他服务中(令牌转发/直通攻击,token passthrough attack)。

48% 使用明文凭据(plaintext credential)的统计意味着:几乎一半的 MCP 服务器部署在启动时会将凭据直接交给服务器进程。若该服务器进程被攻陷,则安装它的每一位用户都会同样被攻陷。

风险:MEDIUM。 可能性低至中等,影响较大。

加分项:CI/CD 令牌(token)被盗

命令 claude setup-token 会生成一个 为期一年的 OAuth 令牌(token)(CLAUDE_CODE_OAUTH_TOKEN),用于 CI/CD 流水线。这会带来一种独特的风险:

  • 该令牌可从 任意机器 使用,最长达一年
  • CI/CD 系统往往存在机密(secrets)管理薄弱以及作业(job)隔离能力有限的问题。
  • 构建日志可能会意外暴露环境变量的值。
  • 被攻破的 CI/CD runner 会以管道运行时拥有的任意权限,获得对 Claude 的长期访问权限

如果你的 CI/CD 管道在使用 --dangerously-skip-permissions 运行 Claude Code(许多人会为了自动化这么做),那么被盗的 CLAUDE_CODE_OAUTH_TOKEN 会在令牌被使用的任何机器上授予不受限制的 shell 执行权限。

风险:高。 发生可能性中等,影响较大。

需要变更的内容

面向用户(立即)

  • 运行 AIHound 了解你的机器上暴露了什么。
  • 修复权限: chmod 600 用于凭据文件。
  • 切勿在 **--dangerously-skip-permissions** 存在真实凭据或具有网络访问权限的机器上使用。 如果确实需要,请在没有挂载任何敏感信息(secrets)的隔离容器内使用。
  • 在 MCP 配置中使用环境变量引用,而不是直接写入的令牌:
      "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" } 
      
  • 轮换已泄露/可被所有人读取的令牌——这些令牌曾存在于所有人可读的文件或 git 历史记录中。
  • 禁用 VS Code 设置同步(Settings Sync) 如果你使用 Cline 连接 MCP 服务器。
  • **CLAUDE_CODE_OAUTH_TOKEN** 当作 root 密码来处理。定期轮换,绝不要放进构建日志,并将 CI/CD 权限控制在满足需求的最低范围。
  • **.mcp.json** 添加到 **.gitignore**,如果它包含内联敏感信息(inline secrets)。

面向工具开发者

  • 使用操作系统密钥链(keychains)。 macOS Keychain、Windows Credential Manager 和 Linux libsecret 正是为此而存在。切勿将凭据以明文 JSON 的形式存储。
  • 创建权限为 **0600** 的文件 不要使用 0644 或 0777
  • 在检测到 MCP 配置中的内联密钥(inline secrets)时,提醒用户。
  • 不要通过设置同步机制将凭据同步到云端。
  • 实施 OAuth 2.1,并为远程 MCP 服务器进行正确的令牌 audience(受众)验证。
  • 要求远程控制(Remote Control)会话进行重新认证。 会话 URL 不应作为用于任意代码执行的 bearer token。
  • 审计 MCP 服务器软件包 ,在允许安装之前执行,并支持服务器白名单(allowlisting)。

面向整个生态系统

OWASP MCP Top 10 将“Token Mismanagement and Secret Exposure”列为 MCP01-2025。Anthropic 与 GitHub 之间在 GitHub 上实现自动 API 密钥检测的合作是一个很好的开端,但它仅覆盖公共仓库中的 Anthropic 密钥。用于 Azure DevOps、Slack、数据库以及其他服务的 MCP 令牌没有等效的保护。

我们需要:

  • 密钥/敏感信息扫描(Secret scanning) ,覆盖 MCP 配置模式,而不仅仅是 API 密钥格式。
  • 凭据助手 用于 MCP(类似于 git 凭据助手),在运行时从安全存储中获取令牌
  • 强制集成操作系统钥匙串 作为默认设置
  • 为 VS Code 扩展提供沙箱隔离
  • 基于令牌作用域的远程控制 - 远程会话应要求其自身的认证,而不是继承本地会话的全部能力

结论

AI 工具生态系统推进得很快,忙着上新功能,却把凭据安全几乎当作“顺便考虑”的事情。几乎一半的 MCP 服务器会以明文(plaintext)存储凭据。AI 助手会把 OAuth 令牌保存在磁盘上的 JSON 文件中。远程控制(Remote Control)功能还能让这些令牌变成远程代码执行(remote code execution)。而 --dangerously-skip-permissions 会把被盗的凭据变成他人机器上的完整 Shell 访问权限。你连接的工具越多,风险就越大。很多 AI 凭据并没有以安全方式存储,因此请务必落实凭据存储的最佳实践。像 AIHound 这样的工具可以帮助你在系统中发现这些明文凭据。

供参考:AI 桌面应用的凭据存储位置

本参考资料汇总了部分最受欢迎的 AI 桌面应用、代码辅助工具以及 CLI 工具中所有的凭据位置。

Claude Code CLI

开发者: Anthropic 认证方式: OAuth 2.0(Claude.ai 订阅)或 API 密钥

凭据文件

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

凭据文件结构

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

每个 OAuth 连接都会存储一条自己的记录。该文件包含与用户已配置内容相对应的 Claude.ai、Claude API、Azure Auth、Bedrock Auth 和 Vertex Auth 的凭据。

关键发现: 在 WSL 上,Windows 侧的凭据文件会继承挂载点的默认权限(0777),从而变为所有人都可读取,这是一项 CRITICAL 的风险;而在原生 Linux 中不存在这种情况,因为该文件是在 0600 权限下创建的。

可能包含敏感信息的配置文件

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

身份验证优先级顺序

Claude Code 按以下顺序检查凭据(首次匹配即生效):

  1. 云提供商环境变量(CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEXCLAUDE_CODE_USE_FOUNDRY
  2. ANTHROPIC_AUTH_TOKEN 环境变量
  3. ANTHROPIC_API_KEY 环境变量
  4. apiKeyHelper 脚本输出(用于动态/轮换的凭据)
  5. CLAUDE_CODE_OAUTH_TOKEN 环境变量(长效,从 claude setup-token 获取)
  6. 来自以下位置的 OAuth 凭据:~/.claude/.credentials.json 或 Keychain

已知缺陷

一项已记录的缺陷(GitHub issue #36779)表明:OAuth 凭据没有正确持久化到 macOS Keychain。只有 mcpOAuth 字段会被存储,而主认证令牌缺失,导致在新会话中必须重新进行身份验证。

Claude Desktop

开发者: Anthropic 认证方式: Claude.ai 会话(macOS 上由 Keychain 支持备份)

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)

配置文件

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 虚拟化问题(Windows)

在 Windows 上,MSIX 安装程序会创建文件系统虚拟化。单击“Edit Config”按钮会打开 %APPDATA%\Claude\claude_desktop_config.json,但应用程序可能实际上会从 MSIX 容器内的虚拟化路径读取。这意味着:

  • 用户可能会编辑错误的文件
  • MCP 服务器配置会被静默忽略
  • 没有错误消息能够提示问题

Pre-MSIX 安装会被“祖父条款”豁免,并从真实的 AppData 路径读取。

配置中包含什么

配置文件主要存储 MCP 服务器定义:

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

env 块通常包含用于外部服务的 明文令牌

GitHub Copilot

开发者: GitHub / Microsoft 认证方式: GitHub OAuth

凭据存储

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 扩展存储

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

state.vscdb 文件是一个使用 Electron 的 safeStorage API(AES-128-CBC)加密的 SQLite 数据库。不过,安全研究表明这会 容易受到恶意的 VS Code 扩展的攻击。由于缺少沙盒机制,任何扩展都可以访问其他扩展的密钥/机密信息(secrets)。

加密密钥存储在操作系统的密钥串(keychain)中(Code Safe Storage,在 macOS 上),任何具备用户权限的进程都可以访问。

令牌类型

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 认证(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

开发者: Anysphere 认证方式: Cursor 账户 + 可选的 API 密钥

存储位置

Platform

Paths

macOS

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

Windows

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

Linux

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

MCP 配置

~/.cursor/mcp.json,其遵循与 mcpServers 相同的 JSON 结构,类似于 Claude Desktop。可能包含内联认证令牌。

已知问题

Cursor 会以所有人可读取的权限保存对话日志。如果用户将令牌粘贴到聊天界面中,这些日志可能包含凭据。

Continue.dev

开发者: Continue(开源) 认证方式: 按提供商分别使用直接的 API 密钥

配置文件

Platform

Path

Format

Encryption

All

~/.continue/config.json

JSON

Plaintext

All

~/.continue/config.yaml

YAML

Plaintext

凭据格式

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

所有 API 密钥都以明文形式存储在用户根目录中。 Continue.dev 社区已将此问题视为安全隐患(GitHub issue #1729)。

缓解措施

Continue.dev 支持环境变量替换:

      "apiKey": "${CONTINUE_ANTHROPIC_API_KEY}" 
      

它会检查 .env 文件位于项目根目录,以及通过 envFiles 指定的自定义位置。不过,如果未配置 默认行为是明文(plaintext)

Cline(VS Code 扩展)

开发者: Saoud Rizwan 扩展 ID: saoudrizwan.claude-dev

MCP 设置(明文(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

关键: 这些文件是 明文(plaintext)JSON,并且会 通过 VS Code Settings Sync 自动同步到云端。这意味着:如果启用了同步,API 密钥和 MCP 凭据将被上传到 GitHub。

API 密钥存储

Cline 通过 VS Code 的 SecretStorage API 存储 API 密钥(与 Copilot 使用的相同 AES-128-CBC 加密 state.vscdb )。同样受到恶意扩展程序漏洞的影响。

Windsurf / Codeium

开发者: Codeium 认证方式: Codeium 账户

存储位置

Platform

Path

All

~/.codeium/windsurf/

在此目录中查找 config.jsonauth.jsoncredentials.json

MCP 配置

~/.codeium/windsurf/mcp_config.json 并使用相同的 mcpServers 结构。

凭据的详细信息并没有得到充分的公开文档说明。在许多情况下,身份验证似乎是通过 Codeium 的集中式后端进行的,而不是通过本地令牌存储。

ChatGPT Desktop

开发者: OpenAI 认证方式: OpenAI 账户会话

存储位置

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 主要使用操作系统的凭据存储来保存会话令牌(macOS 上为 Keychain,Windows 上为 Credential Manager)。应用数据目录中的 JSON 配置文件也可能包含会话数据。

Amazon Q Developer / AWS

开发者: Amazon Web Services 认证方式: IAM Identity Center / AWS Builder ID / IAM 凭据

凭证文件

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)

凭证文件结构

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

备注

  • Amazon Q 本身通过 IAM Identity Center 或 Builder ID 进行身份验证,而不是通过本地文件存储
  • 默认 SSO 会话持续时间为 90 天(适用于 2024 年 4 月之后创建的设置)
  • 位于 之中的静态凭据 ~/.aws/credentials 是主要风险。请考虑改用 SSO/IAM Identity Center

Google Gemini CLI / GCloud

开发者: Google 认证方式: Google 账号 OAuth、API 密钥或服务账号

API 密钥存储

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

应用默认凭据(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 文件包含 client_secretrefresh_token,以及可能还有 private_key(用于服务账号)以 plaintext JSON 的形式存在。

身份验证方法

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

开发者: OpenClaw(开源) 身份验证方法: 每个提供商的 OAuth 2.0、API 密钥、特定于渠道的令牌

概览

OpenClaw 是一种本地优先(local-first)的 AI 代理平台,可连接 20+ 个消息渠道(WhatsApp、Telegram、Slack、Discord),并在本地机器上执行工具。它会为 LLM 提供商和消息渠道分别存储凭据。

凭据文件

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-profiles.json,其中包含提供商凭据:

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

所有令牌默认都存储在 plaintext JSON 中。不提供与操作系统密钥链(keychain)的集成。

SecretRef 系统(选择加入)

OpenClaw 支持选择加入 SecretRef 系统:将纯文本值替换为对外部源的引用:

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

用户必须运行 openclaw secrets configure 来清除现有的纯文本值,并迁移到 SecretRefs。 默认行为是纯文本存储。

网关认证

网关使用令牌进行本地访问控制:

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

该令牌可以是 SecretRef,但通常会在 openclaw.json中进行硬编码。

已知的安全问题

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

凭据位置汇总

所有文件都位于所有平台(Linux、macOS、Windows)的 ~/.openclaw/ 下。在 WSL 中,应检查 Linux 原生路径和 Windows 挂载路径。

MCP 服务器配置

配置文件位置

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

常见的 MCP 认证环境变量

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

环境变量

以下环境变量通常由用户或工具设置,并包含与 AI 相关的机密信息:

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

其他 AI 提供商

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

包含 oauth_token 字段(明文 YAML)。

分享到

了解更多

关于作者

Darryl baker

Darryl Baker

高级安全研究员

Darryl G. Baker 是 Netwrix 的高级安全研究员,并在 Identity 与 Active Directory 安全领域享有广泛认可的权威地位。凭借十余年的身份系统经验,他领导并开展了面向 Active Directory、Entra ID 和 Azure 环境的企业安全评估、身份安全培训以及以威胁仿真(threat emulations)为重点的工作。Darryl 曾在 BlueTeamCon、BSidesCT、The Experts Conference 以及 Wild Wild West Hackin’ Fest 上提供备受好评的培训与演示。他是众多“动手”攻击仿真实验室背后的设计者——借助当前的红队与蓝队工具,帮助防御方从攻击路径分析到威胁狩猎(threat hunting)全面掌握所需技能。在他的课程中,Darryl 将深厚的技术洞察与真实世界的案例研究相结合,赋能蓝队专业人士强化其 Identity 安全态势,并抵御不断演进的对手技术。