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" 设置为持久的默认值。
攻击链:
- 攻击者从以下位置窃取 OAuth 令牌:
~/.claude/.credentials.json(通过恶意软件、SSRF 或任何文件读取漏洞) - 令牌可以携带,因此可在任意机器上使用
- 如果受害者存在处于活动状态的远程控制会话,攻击者将进行连接并接管控制权
- 如果受害者以
--dangerously-skip-permissions运行,那么攻击者现在拥有 以受害者用户身份进行不受限制的 shell 访问:- 读取/写入系统上的任何文件
- 执行任意命令(
curl,ssh,docker,以及包管理器等) - 安装后门、窃取数据、并转向其他机器
- 访问 SSH 密钥、云凭据以及系统中的其他所有机密信息
- 修改 Git 仓库、CI/CD 管道以及部署配置
即使不使用 --dangerously-skip-permissions,在 acceptEdits 模式下,Claude Code 会自动批准文件编辑和常见的文件系统命令。 这仍然可能很危险。权限模型的设计目的是防止意外操作,而不是防范控制会话的恶意行为者。
风险:CRITICAL(使用 --dangerously-skip-permissions),HIGH(默认权限)。
3. 通过 Claude OAuth 令牌进行横向移动
攻击者如果从 ~/.claude/.credentials.json 获取到 Claude OAuth 刷新令牌,则可以:
- 远程生成新的访问令牌(访问令牌约在 60 分钟后过期,但刷新令牌的有效期较长)。
- 访问受害者的 Claude 对话和工作区文件。
- 使用受害者已配置的任何 MCP 服务器(通过 AI 助手充当代理来访问他们的 GitHub 代码库、Azure DevOps 项目、Slack 工作区和数据库)
这些令牌是可移植的。将凭据文件复制到另一台机器上,Claude Code 就会使用它。Anthropic 实现了刷新令牌轮换,因此使用被盗令牌可能最终会使原令牌失效;但初始使用会成功,攻击者可能会在轮换生效之前获得访问权限。
风险:高。 中高的可能性,高的影响。
4. MCP 令牌聚合:横向移动
单个 MCP 配置文件会汇总用于 多个 外部服务的令牌。例如,一个文件可能产生:
GITHUB_PERSONAL_ACCESS_TOKEN→ 代码仓库、PR、CI/CDADO_MCP_AUTH_TOKEN→ Azure DevOps 项目SLACK_BOT_TOKEN→ 内部 Slack 工作区- 数据库密码 → 生产数据
JIRA_API_TOKEN→ 项目管理、内部工单
与分布式凭据存储不同:在分布式凭据存储中,攻破一个通道通常只会暴露部分凭据;而 MCP 的聚合模式意味着一旦发生单个文件泄露,就会连锁导致所有已连接的服务被攻破。
风险:CRITICAL。 发生可能性高,影响大。
5. 恶意 VS Code 扩展:凭据窃取(exfiltration)
VS Code 扩展在没有沙箱(sandboxing)的情况下运行。所有扩展共享相同的进程权限。恶意或已被入侵的扩展可能会:
- 直接访问
state.vscdbSQLite 数据库 - 从操作系统密钥链中检索加密密钥(任何用户级进程都可访问)
- 解密所有扩展程序的机密信息: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 引用中包含了令牌:
- 令牌会出现在 git 历史记录中
- 即使移除之后,
git log -p .mcp.json仍会暴露它们 - 自动化扫描器(TruffleHog、GitLeaks 等)可以在 GitHub/GitLab 上大规模发现它们
Anthropic 与 GitHub 的 secret scanning 合作能够捕获一些暴露的 API 密钥,但用于其他服务(Azure DevOps、Slack、数据库)的 MCP 配置令牌 not 不包含在自动化扫描的覆盖范围内。GitHub secret scanner 并没有用于 ADO_MCP_AUTH_TOKEN 或 SLACK_BOT_TOKEN 嵌入在 JSON env 块中的模式。
风险:MEDIUM。 发生可能性中等,影响中等偏高。
8. 通过 MCP 服务器进行供应链攻击
MCP 服务器通常是 npm 包。供应链风险与任何 npm 依赖相同,但有一个关键区别: MCP 服务器在启动时会接收凭据。
- npm 上的热门 MCP 服务器包被入侵(或发布了仿冒拼写的包)
- 用户会在自己的
claude_desktop_config.json中,以真实的令牌填写到env块里。 - MCP 服务器进程可访问传递给它的所有环境变量,包括令牌(tokens)。
- 被攻陷的服务器会将令牌(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 |
|
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 |
凭据文件结构
{
"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 |
|---|---|
|
|
Global MCP server configurations (may contain inline tokens) |
|
|
Project-scoped MCP server configs |
|
|
User preferences and permissions |
身份验证优先级顺序
Claude Code 按以下顺序检查凭据(首次匹配即生效):
- 云提供商环境变量(
CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX,CLAUDE_CODE_USE_FOUNDRY) ANTHROPIC_AUTH_TOKEN环境变量ANTHROPIC_API_KEY环境变量apiKeyHelper脚本输出(用于动态/轮换的凭据)CLAUDE_CODE_OAUTH_TOKEN环境变量(长效,从claude setup-token获取)- 来自以下位置的 OAuth 凭据:
~/.claude/.credentials.json或 Keychain
已知缺陷
一项已记录的缺陷(GitHub issue #36779)表明:OAuth 凭据没有正确持久化到 macOS Keychain。只有 mcpOAuth 字段会被存储,而主认证令牌缺失,导致在新会话中必须重新进行身份验证。
Claude Desktop
开发者: Anthropic 认证方式: Claude.ai 会话(macOS 上由 Keychain 支持备份)
Platform | Paths |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
Auth method: Claude.ai session (Keychain-backed on macOS)
配置文件
Platform | Path | Format | Encryption |
|---|---|---|---|
|
macOS |
|
JSON |
Plaintext (often 0644) |
|
Windows |
|
JSON
|
Plaintext |
|
Linux |
|
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: |
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 扩展存储
Platform | Path |
|---|---|
|
Linux |
|
|
macOS |
|
|
Windows |
|
state.vscdb 文件是一个使用 Electron 的 safeStorage API(AES-128-CBC)加密的 SQLite 数据库。不过,安全研究表明这会 容易受到恶意的 VS Code 扩展的攻击。由于缺少沙盒机制,任何扩展都可以访问其他扩展的密钥/机密信息(secrets)。
加密密钥存储在操作系统的密钥串(keychain)中(Code Safe Storage,在 macOS 上),任何具备用户权限的进程都可以访问。
令牌类型
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 认证(Copilot 也使用)
Platform | Path | Format |
|---|---|---|
|
Linux |
|
YAML |
|
macOS |
|
YAML |
|
Windows |
|
YAML |
Cursor IDE
开发者: Anysphere 认证方式: Cursor 账户 + 可选的 API 密钥
存储位置
Platform | Paths |
|---|---|
|
macOS |
|
|
Windows |
|
|
Linux |
|
MCP 配置
~/.cursor/mcp.json,其遵循与 mcpServers 相同的 JSON 结构,类似于 Claude Desktop。可能包含内联认证令牌。
已知问题
Cursor 会以所有人可读取的权限保存对话日志。如果用户将令牌粘贴到聊天界面中,这些日志可能包含凭据。
Continue.dev
开发者: Continue(开源) 认证方式: 按提供商分别使用直接的 API 密钥
配置文件
Platform | Path | Format | Encryption |
|---|---|---|---|
|
All |
|
JSON
|
Plaintext |
|
All |
|
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 |
|
|
Windows |
|
|
Linux |
|
关键: 这些文件是 明文(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 |
|
在此目录中查找 config.json,auth.json,credentials.json。
MCP 配置
~/.codeium/windsurf/mcp_config.json 并使用相同的 mcpServers 结构。
凭据的详细信息并没有得到充分的公开文档说明。在许多情况下,身份验证似乎是通过 Codeium 的集中式后端进行的,而不是通过本地令牌存储。
ChatGPT Desktop
开发者: OpenAI 认证方式: OpenAI 账户会话
存储位置
Platform | Path | Encryption |
|---|---|---|
|
macOS |
|
Keychain for session |
|
macOS |
|
Keychain for session |
|
Windows |
|
Credential Manager |
|
Windows |
|
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 |
|---|---|---|
|
|
INI
|
Plaintext access key ID, secret access key, session token (per profile) |
|
|
INI |
Region, output format, SSO configuration |
|
|
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 |
|---|---|---|
|
|
Environment variable |
Gemini API key |
|
|
Environment variable |
Google API key |
|
|
Dotenv |
API keys |
|
|
Dotenv |
API keys |
应用默认凭据(ADC)
Platform | Path | Format |
|---|---|---|
|
Linux |
|
JSON |
|
macOS |
|
JSON |
|
macOS (alt) |
|
JSON |
|
Windows |
|
JSON |
ADC 文件包含 client_secret,refresh_token,以及可能还有 private_key(用于服务账号)以 plaintext JSON 的形式存在。
身份验证方法
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
开发者: OpenClaw(开源) 身份验证方法: 每个提供商的 OAuth 2.0、API 密钥、特定于渠道的令牌
概览
OpenClaw 是一种本地优先(local-first)的 AI 代理平台,可连接 20+ 个消息渠道(WhatsApp、Telegram、Slack、Discord),并在本地机器上执行工具。它会为 LLM 提供商和消息渠道分别存储凭据。
凭据文件
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-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 |
|---|---|---|
|
|
|
Reads from environment variable |
|
|
|
Reads from file (JSON pointer or single value) |
|
|
|
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
|
|
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 |
凭据位置汇总
所有文件都位于所有平台(Linux、macOS、Windows)的 ~/.openclaw/ 下。在 WSL 中,应检查 Linux 原生路径和 Windows 挂载路径。
MCP 服务器配置
配置文件位置
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 |
常见的 MCP 认证环境变量
Variable | Service |
|---|---|
|
|
Azure DevOps |
|
|
GitHub |
|
|
GitHub |
|
|
Slack |
|
|
Atlassian Jira |
|
|
Notion |
|
|
Linear |
环境变量
以下环境变量通常由用户或工具设置,并包含与 AI 相关的机密信息:
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 |
其他 AI 提供商
Variable | Description |
|---|---|
|
|
Hugging Face |
|
|
Cohere |
|
|
Replicate |
|
|
Together AI |
|
|
Groq |
|
|
Mistral AI |
|
|
DeepSeek |
|
|
xAI / Grok |
|
|
Perplexity |
|
|
Fireworks AI |
包含 oauth_token 字段(明文 YAML)。
分享到
了解更多
关于作者
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 安全态势,并抵御不断演进的对手技术。