Skip to content

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 GCMAES-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_tokenStringOAuth 访问令牌
token_typeString令牌类型(通常是 "Bearer")
expires_inu64过期秒数
refresh_tokenString?刷新令牌(可选)
scopeString?权限范围
created_atu64创建时间戳

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-v2POST签名时间戳
/coding-plan/status-v2GET签名时间戳
/coding-plan/models-v2?plan_type=GET签名时间戳
/codingplan/setupPOST签名时间戳

认证方式:所有请求通过 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 加密层是一个轻量级认证签名层,主要用于:

  1. 验证客户端是官方 AtomCode 构建(条件编译)
  2. 对 CodingPlan API 请求进行签名(防篡改+防重放)
  3. 保护配额模型的使用授权

不是端到端加密或用户数据加密 — 不保护对话内容、代码文件或会话历史。


本报告由持续分析循环生成

逆向命令索引

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

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档