docs(auth): design coding agent subscription accounts - #566
Conversation
|
评审任务执行失败:任务执行超时。 |
|
MonkeyScan 正在评审本次 push 新增到 PR 的变更,完成后会更新到本评论中,请稍后刷新查看。 |
|
评审任务执行失败:任务执行超时。 |
|
评审任务执行失败。 |
|
PR Title: docs(auth): design coding agent subscription accou... Commit: 本次变更仅修改设计文档 docs/design/coding_agent_subscription_auth_design.md(+45/-20),核心调整:(1) 删除 Anthropic 授权前 extra usage 计费确认提示;(2) 新增 3.1 节说明仅订阅账号部署可用但 scheduler.llm / LLMService.Generate 不可用;(3) 将 credential 存储从 AEAD 加密(encryption_key_id/secret_nonce/secret_ciphertext)改为 SQLite 明文 secret_json,并相应删除"OAuth token 不出现在数据库明文"验收标准;(4) 新增 5.4 节 Protobuf/ConnectRPC AccountService 设计;(5) 在安全约束中补充 data root/SQLite 文件/备份仅 daemon 用户可访问;(6) 简化实施步骤与测试清单。文档内部一致(全文已无残留"加密"描述)。核心风险:以文件权限替代静态加密来保护 OAuth refresh token 与 API Key,属于明显的安全降级,是本评审唯一高置信发现;Anthropic 计费确认的移除因无可注释 diff 锚点且属有意决策,未单列发现。 |
|
PR Title: docs(auth): design coding agent subscription accou... Commit: 本次变更仅修改设计文档 docs/design/coding_agent_subscription_auth_design.md 中的一处 CLI 交互示例文案:将“Subscription account (browser login)”改为“Subscription account (OAuth)”(+1/-1)。 文档通篇描述订阅账号认证使用厂商专用 OAuth(Codex 支持 Authorization Code + PKCE 与 Device Code,Anthropic 使用 Authorization Code + PKCE),因此“OAuth”比“browser login”更准确地概括了这两种登录方式,且与文中“订阅账号使用厂商专用 OAuth”的表述保持一致。该改动仅为文档措辞修正,不涉及任何代码、行为或安全影响,未发现可操作的问题。 |
| - `managed_api_key`:CLI/UI 提交,由 daemon 保存; | ||
| - `oauth`:daemon 保存并刷新 access/refresh token。 | ||
|
|
||
| managed credential 以明文 `secret_json` 保存在 SQLite,不引入额外 encryption key。所有面向用户的 API、日志和诊断输出必须省略或脱敏 credential。 |
There was a problem hiding this comment.
设计将 OAuth token 与 API Key 改为 SQLite 明文存储,移除静态加密保护
本变更删除了 llm_credential 中的 encryption_key_id / secret_nonce / secret_ciphertext 列和 AEAD 加密方案(第 232 行改为明文 secret_json TEXT),并把第 8 节完成标准从“OAuth token 不出现在数据库明文”弱化为只约束日志/API/YAML/Sandbox。涉及的是长期有效的高价值凭证:OAuth refresh token(可持续访问用户付费订阅账号)和 managed API Key(可产生费用)。新增的唯一缓解措施是文件系统权限(data root、SQLite 文件与备份只能由 daemon 运行用户访问),但该控制较脆弱:备份常被复制到权限更宽松的介质、同用户下其他进程/agent 可读取 data root、崩溃转储或容器镜像层可能暴露数据库文件。一旦数据库文件或备份泄露,所有已存凭证可被直接使用,无需再破解。
Problem code:
Changed code at docs/design/coding_agent_subscription_auth_design.md:273
Recommendation:
建议保留静态加密:例如用 data root 受限文件或系统 keychain 中的密钥对 secret_json 做 AEAD,密钥与密文分离存储;若确要放弃加密,应在设计文档中正式记录风险接受决策,并强制要求整盘加密、备份访问控制与数据库文件最小权限,同时恢复“OAuth token 不出现在数据库明文”的验收标准,避免完成标准与安全要求被悄悄放宽。
Suggested diff:
### 5.3 Credential 存储
- `managed_api_key`:CLI/UI 提交,由 daemon 保存;
- `oauth`:daemon 保存并刷新 access/refresh token。
managed credential 与 OAuth refresh token 使用 AEAD 加密后写入 secret_json;加密密钥由 operator 注入或首次使用时生成在 data root 的受限文件中,不能与密文一起存进 SQLite。密钥不可用时 Account 进入 reauth_required,不得降级为明文存储。所有面向用户的 API、日志和诊断输出必须省略或脱敏 credential。
Summary
Related to #562.
Testing
task docs:buildChecklist