ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Claude Code安全机制源码审计:OAuth 2.0、JWT与macOS Keychain密钥管理全揭秘

Claude Code安全机制源码审计:OAuth 2.0、JWT与macOS Keychain密钥管理全揭秘 Claude Code安全机制源码审计OAuth 2.0、JWT与macOS Keychain密钥管理全揭秘【免费下载链接】claude-codeClaude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.项目地址: https://gitcode.com/gh_mirrors/claudecode5/claude-codeClaude Code 是运行在终端里的 AI 编程智能体agentic coding tool。它替你执行命令、读写代码权限极大——那么它如何保护你登录时的密钥本文带你源码审计 Claude Code 的三大安全机制OAuth 2.0 PKCE 登录流程、JWT 会话令牌刷新与macOS Keychain 密钥存储无需安全背景10 分钟看懂终端工具如何守住你的凭据。 先看懂终端 AI 助手的三道安全防线Claude Code 登录时需要拿到一串访问令牌token才能调用大模型 API。这套令牌一旦泄露别人就能冒用你的额度。源码审计后发现项目用三层纵深防御保护它防线解决的问题核心源码OAuth 2.0 PKCE登录时令牌如何不被中间人偷走src/services/oauth/index.tsJWT 主动刷新调度长会话中令牌过期导致掉线src/bridge/jwtUtils.tsmacOS Keychain 加密存储令牌落在磁盘上是否安全src/utils/secureStorage/index.ts一、OAuth 2.0 PKCE登录令牌如何零泄露1. 为什么是 PKCE 而不是简单密码登录终端程序没有网页表单也无法安全持有客户端密钥client secret 放在本地代码里等于公开。因此 Claude Code 采用OAuth 2.0 授权码模式 PKCE 扩展核心就三步本地随机生成 32 字节code_verifier验证书对其做 SHA-256 得到code_challenge挑战书只把挑战书发给登录页浏览器授权后回调带上一次性code换令牌时提交验证书服务端校验验证书的哈希 当初的挑战书攻击者即使截获code也无法伪造。这段逻辑非常干净见 src/services/oauth/crypto.ts#L11-L23——三个函数分别生成验证书、挑战书和防重放随机数全程使用密码学安全随机源。2. 一次性本地回调服务器state 参数防 CSRF浏览器授权后会跳回http://localhost:端口/callback?code...。这个回调由 auth-code-listener.ts 里的临时 HTTP 服务器接收有两个值得学习的安全细节端口交给操作系统随机分配监听端口 0避免固定端口被其他程序抢注、截走授权码严格校验 state 参数收到的 state 与发起时不一致直接拒绝返回 400这是标准的 CSRF跨站请求伪造防护见 src/services/oauth/auth-code-listener.ts#L164-L169。整个服务器只在登录期间存活拿到码或失败后立即关闭攻击面极小。3. 双通道登录自动流程 手动粘贴没有图形环境如 SSH 远程服务器打不开浏览器怎么办src/services/oauth/index.ts#L32-L86 提供了两条路并行自动流自动打开浏览器回调到本地监听器手动流用户从网页复制授权码粘贴回终端。两条路共用同一套 PKCE 与 state 校验安全水位一致——这在同类 CLI 工具中并不常见。4. 权限最小化Scope 白名单登录时请求的权限范围scope被硬编码为白名单如user:inference调用模型、user:profile读取资料等定义在 src/constants/oauth.ts#L33-L58。令牌过期判断还预留了 5 分钟缓冲client.ts#L344-L353避免刚好踩在过期点的请求失败。二、JWT会话令牌的身份证与主动刷新远程会话Bridge 模式使用的是JWT 令牌。Claude Code 不需要、也不应该在客户端验签——验签是服务端的职责。客户端只关心一件事它什么时候过期。decodeJwtExpiry 只解码 payload 中的exp声明Unix 时间戳配合createTokenRefreshScheduler刷新调度器形成一套完整的永不掉线机制提前 5 分钟刷新到期前 300 秒就发起换新长会话中令牌永远不会现场过期兜底周期刷新若拿不到新的过期时间按 30 分钟周期保底刷新失败熔断连续 3 次刷新失败才放弃失败期间每 60 秒重试避免刷爆服务端代数计数器generation每次调度/取消都会递增代号过期后到手的异步刷新结果会被丢弃防止旧定时器覆盖新令牌这类竞态——这是并发安全里很教科书式的写法见 src/bridge/jwtUtils.ts#L165-L230。三、macOS Keychain密钥落盘的最后堡垒1. 平台策略能用钥匙串就不用明文secureStorage/index.ts 的策略一目了然macOS 优先 Keychain失败才降级明文文件Linux 暂用明文源码中留有 libsecret 支持 TODOWindows 同理降级。降级策略保证了安全优先、可用兜底。Keychain 条目名也不是随便写的Claude Code 环境后缀 配置目录的 SHA-256 短哈希macOsKeychainHelpers.ts#L29-L41。这样生产、staging、本地开发的凭据在钥匙串里互不干扰改配置目录也不会误读别人的凭据。2. 细节里的攻防十六进制 stdin 传参这是本次审计最精彩的一处macOsKeychainStorage.ts#L97-L146。把凭据写入 Keychain 时先对 JSON 做十六进制编码避免引号转义破坏命令优先通过security -i从 stdin 读命令而不是把数据挂在命令行参数里——这样进程监控软件如 CrowdStrike看到的只是security -i而看不到令牌明文源码注释直接标注了对应内部安全事件编号若数据超过 stdin 单行 4096 字节上限才退回命令行传参。注释里解释得很诚实十六进制在参数里理论上可被还原但足以挫败朴素的明文扫描而静默丢失凭据是更糟的结果。3. 缓存与容错快 500ms 的 30 秒每次调用security子进程约 500ms。启动时若有 50 多个 MCP 连接器同时取凭据无缓存会卡死事件循环 5 秒以上源码注释记录了真实事故。因此引入了30 秒缓存 TTL令牌以小时计过期30 秒跨进程延迟完全可以接受Stale-while-error刷新失败时继续提供旧缓存值而不是突然变成未登录锁检测security show-keychain-info返回 36 表示钥匙串处于锁定状态——这正是 SSH 远程登录 macOS 时的常见场景工具会给出明确提示而不是让你莫名其妙地未登录。四、其他值得圈出的安全设计 自定义 OAuth 端点白名单即使你设置CLAUDE_CODE_CUSTOM_OAUTH_URL面向 FedStart/政务云私有化部署也只接受 3 个官方批准的域名防止令牌被诱导发到任意端点src/constants/oauth.ts#L176-L222生产/staging/local 三套配置物理隔离client_id 与回调 URL 各不相同测试环境令牌无法在生产环境使用刷新令牌轮换每次刷新后端会签发新 refresh_token旧的随之失效缩小凭据泄露的影响窗口client.ts#L146-L174。五、安全机制源码索引方便延伸阅读想动手翻代码按这个顺序读效率最高登录主流程src/services/oauth/index.tsPKCE 与 state 生成src/services/oauth/crypto.ts本地回调与 CSRF 校验src/services/oauth/auth-code-listener.ts令牌换取 / 刷新src/services/oauth/client.tsScope 与端点配置src/constants/oauth.tsJWT 解码与刷新调度src/bridge/jwtUtils.ts安全存储入口与平台策略src/utils/secureStorage/index.tsKeychain 读写实现src/utils/secureStorage/macOsKeychainStorage.ts总结一次源码审计下来Claude Code 的安全设计可以用三句话概括登录靠 OAuth 2.0 PKCE 把密钥彻底挡在客户端之外会话靠 JWT 提前刷新让长任务永不掉线落盘靠 macOS Keychain连写入方式都对进程监控做了隐身处理。对于想给自家 CLI 工具加认证的开发者这三个模块oauth/ 与 secureStorage/几乎是现成的最佳实践模板值得逐行精读。【免费下载链接】claude-codeClaude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.项目地址: https://gitcode.com/gh_mirrors/claudecode5/claude-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表