AtomCode CodingPlan 加密层深度分析
持续分析迭代 — Blind Spot #2:CodingPlan 加密层 2026-06-22/23
1. 加密层概览
| 属性 | 值 |
|---|---|
| Crate 路径 | crates/atomcode-codingplan-crypto/ |
| 源码文件 | src/versions/v1.rs |
| 架构 | 多版本加密方案(当前仅发现 v1) |
| 用途 | CodingPlan 模型配额、认证令牌的签名/验证 |
| 依赖库 | Rustls (TLS)、Ring (签名)、AES-NI 硬件加速 |
核心发现:CodingPlan 加密层并非用于保护用户数据,而是保护 CodingPlan 配额模型的使用授权。
2. 加密模块架构
crates/atomcode-codingplan-crypto/
└── src/
└── versions/
└── v1.rs # 当前唯一的加密实现版本设计模式:版本化加密方案
| 组件 | 说明 |
|---|---|
versions/ 目录 | 支持未来升级加密方案,v1 为当前实现 |
v1.rs | 签名算法、密钥派生、令牌验证 |
这意味着架构上预留了向后兼容的多版本支持,但目前仅实现 v1。
3. 使用的加密原语
从二进制中提取的加密相关符号:
| 算法 | 用途 | 来源库 |
|---|---|---|
| SHA256 | 哈希、签名摘要 | Ring |
| SHA384 | 哈希(更强安全性) | Ring |
| SHA512 | 哈希 | Ring |
| SHA512_256 | 截断哈希 | Ring |
| HMAC | 消息认证码 | Ring |
| AES-NI (Intel AES) | 硬件加速 AES | 通过 Rustls/OpenSSL |
| AES-NI GCM | AES-GCM 模式加密 | CRYPTOGAMS |
| ECDSA P256 | 椭圆曲线签名 (ASN1/FIXED) | Ring |
| ECDSA P384 | 椭圆曲线签名 (ASN1/FIXED) | Ring |
| Ed25519 | 爱德华兹曲线签名 | Ring (ring::signature::ED25519) |
签名方案优先级
ECDSA_P256_SHA256_ASN1 (首选 — 性能与安全平衡)
ECDSA_P384_SHA384_ASN1 (高安全需求)
Ed25519 (现代替代方案)4. CodingPlan 认证流中的加密使用
4.1 时间戳签名(Request Signing)
请求签名验证失败消息:
"Request rejected: signed timestamp outside the accepted window.
Please check your system clock (NTP sync) and retry."
"Request was repeatedly flagged as a replay."
机制:
- 每个 API 请求携带签名的时间戳
- 服务器验证签名 + 时间窗口(防重放)
- 使用 ECDSA 或 Ed25519 签名4.2 官方构建验证
"codingplan_official_build_required"
"atomcode-codingplan-crypto"
"codingplan_crypto"
"This feature requires the official AtomCode build."CodingPlan 加密模块仅在官方构建中编译。这意味着:
- 社区/自制版的 AtomCode 无法使用 CodingPlan 配额模型
- 加密层作为"正版验证"的一部分
- 设置
ATOMCODE_CODINGPLAN_LLM_BASE_URL可自定义 LLM 端点,但认证层仍需要官方构建
4.3 引用完整性验证
assertion failed: padding.iter().all(|&b| b == 0)
assertion failed: min_bits >= MIN_BITS
assertion failed: em.len() >= digest_len + 11
assertion failed: output.len() <= padded.len()这些 assertion failed 字符串来自 RSA-OAEP 或 PSS 填充验证,指示:
- 支持 RSA 签名方案(作为后备)
- 编码方法的边界检查(EME-OAEP/PSS)
- 严格的密钥位长验证
5. 密钥管理
| 组件 | 描述 |
|---|---|
| 公钥 | 内置于二进制中(用于验证 CodingPlan 服务器签名) |
| 私钥 | CodingPlan 服务器持有(从未分发给客户端) |
| 会话密钥 | OAuth 流程中派生(通过 /auth/login/start → /auth/login/:id/poll) |
| 令牌存储 | ~/.atomcode/auth.json(序列化为 StoredAuth 结构体) |
StoredAuth 结构体
| 字段 | 类型 | 说明 |
|---|---|---|
access_token | String | OAuth 访问令牌 |
token_type | String | 令牌类型(通常是 "Bearer") |
expires_in | u64 | 过期秒数 |
refresh_token | String? | 刷新令牌(可选) |
scope | String? | 权限范围 |
created_at | u64 | 创建时间戳 |
6. 安全措施
6.1 防重放攻击
验证链:
1. 客户端用私钥签署当前时间戳
2. 服务端验证签名 + 时间戳在窗口内
3. 服务端检查该签名是否已使用(重放检测)6.2 防篡改
"assertion failed: output.len() <= padded.len()"
"assertion failed: em.len() >= digest_len + 11"填充验证确保加密数据在传输过程中未被修改。
6.3 官方构建检测
rust
// 伪代码 — 从二进制推断
fn is_official_build() -> bool {
// 检查 atomcode-codingplan-crypto crate 是否存在
// 非官方构建中此 crate 被条件编译排除
cfg!(feature = "codingplan_crypto")
}7. 加密层与其他系统的交互
┌──────────────────────────────────────────────────────┐
│ AtomCode 客户端 │
│ ┌─────────────┐ ┌────────────────────────────┐ │
│ │ CodingPlan │ │ atomcode-codingplan-crypto │ │
│ │ API 客户端 │──▶ (官方构建专属) │ │
│ │ │ │ ├── v1.rs (签名/验证) │ │
│ │ /codingplan │ │ ├── ECDSA P256/P384 │ │
│ │ /claim-v2 │ │ ├── Ed25519 │ │
│ │ /status-v2 │ │ └── HMAC+SHA256 │ │
│ │ /setup │ │ │ │ │
│ └──────┬──────┘ └─────────┼─────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ CodingPlan API 服务器 │ │
│ │ https://api.gitcode.com/api/v5/ │ │
│ │ (验证签名时间戳 + 配额管理) │ │
│ └──────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘8. 关键 API 端点
| 端点 | 方法 | 加密要求 |
|---|---|---|
/coding-plan/claim-v2 | POST | 签名时间戳 |
/coding-plan/status-v2 | GET | 签名时间戳 |
/coding-plan/models-v2?plan_type= | GET | 签名时间戳 |
/codingplan/setup | POST | 签名时间戳 |
认证方式:所有请求通过 Authorization: Bearer <signed_token> 头传递。
9. 未解决的问题
| 问题 | 状态 |
|---|---|
| v1 加密方案的具体算法组合(签名+哈希+派生) | 已知类型但未知精确组合 |
| 私钥存储位置(操作系统密钥链?文件?) | 未确认 — 可能在 ~/.atomcode/auth.json |
| 令牌刷新时是否重新派生密钥 | 可能(有 refresh_token 字段) |
| 多版本架构中 v2 是否计划使用后量子密码 | 未知 |
| 加密层是否使用 TPM/安全飞地 | 不可能(跨平台 Go/Rust 项目) |
10. 总结
| 维度 | 评估 |
|---|---|
| 加密强度 | ⭐⭐⭐⭐ 强(ECDSA P256/P384 + Ed25519 + SHA256/384/512) |
| 实现完整性 | ⭐⭐⭐⭐ 完整(填充验证、防重放、时间戳窗口、官方构建校验) |
| 密钥安全性 | ⭐⭐⭐ 中等(私钥在客户端,理论上可提取) |
| 架构设计 | ⭐⭐⭐⭐⭐ 优秀(版本化加密方案、向后兼容、条件编译) |
| 逆向难度 | ⭐⭐⭐⭐⭐ 高(Rust 编译,strip 后类型信息不完整) |
核心结论:CodingPlan 加密层是一个轻量级认证签名层,主要用于:
- 验证客户端是官方 AtomCode 构建(条件编译)
- 对 CodingPlan API 请求进行签名(防篡改+防重放)
- 保护配额模型的使用授权
它不是端到端加密或用户数据加密 — 不保护对话内容、代码文件或会话历史。
本报告由持续分析循环生成
逆向命令索引
bash
# 提取 CodingPlan 加密相关
strings atomcode.bin.bak | grep "^crates/atomcode-codingplan-crypto/" | sort -u
# 输出: crates/atomcode-codingplan-crypto/src/versions/v1.rs
# 提取签名算法
strings atomcode.bin.bak | grep -iE "ecdsa|ed25519|signature|verify.*key" | sort -u | head -10
# 提取 CodingPlan 端点和协议
strings atomcode.bin.bak | grep -iE "coding.*plan|claim.*v2|codingplan/status" | sort -u | head -10