Skip to content

Latest commit

 

History

History
147 lines (107 loc) · 7.31 KB

File metadata and controls

147 lines (107 loc) · 7.31 KB

ERC Framework Feature Verification Report

Generated: 2026-05-11
Project: erc-framework (AI Audit Gateway + Responsibility Protocol)


一、项目层次与模块识别

模块 类型 行数 设计用途
erc-core lib (cdylib + rlib) ~350 协议核心:Receipt结构体、Event枚举、Ed25519签名、Merkle树
erc-gateway bin ~450 审计网关入口:透明代理、事件录制、限流
erc-store lib ~76 存储层:SQLite数据库访问
erc-query-api bin ~123 查询API:Receipt和Event查询接口

二、核心协议功能实现验证

2.1 Receipt 生成与签名

功能项 状态 文件与行号 备注
ExecutionReceipt 结构体包含所有冻结字段 erc-core/src/receipt.rs:L7-25 包含receipt_id, execution_id, trace_id, schema_version, actor, agent, model, action, security, proof, custody, policy, extensions
to_canonical_bytes 使用 bincode 固定整数编码和小端序 erc-core/src/receipt.rs:L148-157 使用 with_fixint_encoding().with_little_endian()
Ed25519 签名函数 sign_and_clear 签名后调用 zeroize erc-core/src/crypto.rs:L4-18 第16行调用 secret_bytes.zeroize()
独立验证函数 verify_receipt_signature 对外暴露 erc-core/src/lib.rs:L90-107 通过 PyO3 暴露给 Python SDK

2.2 Event 录制

功能项 状态 文件与行号 备注
ExecutionEvent 包含 execution.started erc-core/src/event.rs:L7-14 Started 变体
ExecutionEvent 包含 llm.call.completed erc-core/src/event.rs:L15-22 LlmCallCompleted 变体
ExecutionEvent 包含 tool.call.completed erc-core/src/event.rs:L23-29 ToolCallCompleted 变体
ExecutionEvent 包含 policy.denied erc-core/src/event.rs:L36-41 PolicyDenied 变体
ExecutionEvent 包含 approval.granted erc-core/src/event.rs:L42-47 ApprovalGranted 变体
Gateway 每次代理请求后自动记录事件到 SQLite erc-gateway/src/main.rs:L172 调用 recorder.record_execution()
Nonce 使用原子递增(UPSERT RETURNING) erc-gateway/src/recorder.rs:L176-179 INSERT ... ON CONFLICT DO UPDATE ... RETURNING nonce

2.3 透明代理与多模型支持

功能项 状态 文件与行号 备注
代理请求根据 UPSTREAM_URL 转发 erc-gateway/src/main.rs:L160-165 使用 forward_to_upstream()
支持不同模型的认证头格式 erc-gateway/src/main.rs:L146-147 支持 UPSTREAM_API_KEYANTHROPIC_API_KEY
启动时对上游 URL 做白名单/SSRF 检查 erc-gateway/src/main.rs:L155-158 调用 validate_upstream_url()
限制请求体大小(DefaultBodyLimit) erc-gateway/src/main.rs:L81 设置 10MB 限制

三、安全加固措施验证

3.1 认证与授权

功能项 状态 文件与行号 备注
Query API 强制要求 ERC_API_TOKEN erc-query-api/src/main.rs:L28-33 未设置时 process::exit(1)
启动时拒绝默认值 erc-query-api/src/main.rs:L28-33 无默认值,必须显式设置
无 API Token 打印到日志 全局搜索 未发现 token 泄露

3.2 限流保护

功能项 状态 文件与行号 备注
限流逻辑使用单一原子 SQL 消除竞态条件 erc-gateway/src/main.rs:L119-131 使用 INSERT ... ON CONFLICT DO UPDATE ... RETURNING
数据持久化到 erc_rate_limits.db erc-gateway/src/main.rs:L49-57 SQLite 数据库,重启后不丢失

3.3 CORS 配置

功能项 状态 文件与行号 备注
CORS 只允许 ERC_CORS_ORIGIN 指定来源 erc-query-api/src/main.rs:L50-58 使用 AllowOrigin::exact(),默认 http://localhost:3000

3.4 Panic 安全

功能项 状态 文件与行号 备注
消除网络绑定路径中的 unwrap() ⚠️ erc-query-api/src/main.rs:L69 TcpListener::bind().await.unwrap()
消除服务器启动路径中的 unwrap() ⚠️ erc-query-api/src/main.rs:L70 axum::serve().await.unwrap()
消除 CORS 解析路径中的 unwrap() ⚠️ erc-query-api/src/main.rs:L55 .parse().unwrap()
消除数据库查询路径中的 unwrap() ⚠️ erc-store/src/lib.rs:L17,30,54 Mutex::lock().unwrap_or_else()
Gateway 主程序 panic 处理 erc-gateway/src/main.rs:L86-98 使用 map_err() + process::exit(1)

剩余 panic 热点:

  • erc-query-api/src/main.rs:69 - TcpListener 绑定
  • erc-query-api/src/main.rs:70 - 服务器启动
  • erc-query-api/src/main.rs:55 - CORS origin 解析
  • erc-store/src/lib.rs:17,30,54 - 数据库锁获取

3.5 SSRF 防护

功能项 状态 文件与行号 备注
拒绝 IP 地址格式的上游 URL erc-gateway/src/types.rs:L38-40 host.parse::<IpAddr>().is_ok() 检查
只允许 ALLOWED_UPSTREAM_HOSTS 中的域名 erc-gateway/src/types.rs:L43-52 白名单验证,支持子域名匹配

四、非功能性需求检查

功能项 状态 文件与行号 备注
构建脚本使用 --locked 标志 build.ps1:L4-5 cargo build --release --locked
无敏感信息记录到日志 全局搜索 Prompt/Response 仅记录 hash
依赖项最小化 Cargo.toml 文件 仅必要依赖,无冗余

五、总结

已完整可用的功能

  1. Receipt 生成与签名: 完整实现,包含 canonical bytes 序列化、Ed25519 签名、zeroize 安全清理
  2. Event 录制: 所有 5 种事件类型完整实现,原子 nonce 递增
  3. 透明代理: 支持多模型转发,请求体大小限制,上游 URL 白名单验证
  4. 认证授权: Query API 强制 token,无默认值,无日志泄露
  5. 限流保护: 原子 SQL 操作,持久化存储
  6. CORS 配置: 严格限制来源,无通配符
  7. SSRF 防护: IP 地址拒绝 + 域名白名单

存在缺口或实现不完整的功能

  1. Panic 安全:

    • erc-query-api 中仍有 3 处 unwrap() 调用(网络绑定、服务器启动、CORS 解析)
    • erc-store 中数据库锁获取使用 unwrap_or_else 但会 process::exit(1)
    • 建议:将这些 unwrap() 替换为适当的错误处理
  2. 多模型认证头格式:

    • 当前仅支持 x-api-key
    • OpenAI/Gemini 等使用 Authorization: Bearer 格式
    • 建议:根据模型提供商动态选择认证头格式

架构一致性评估

该项目与预设的"AI审计网关+责任协议"架构高度一致

  • 核心协议层(erc-core)完整实现了 Receipt 和 Event 规范
  • 网关层(erc-gateway)实现了透明代理、事件录制、限流
  • 存储层(erc-store)提供 SQLite 持久化
  • 查询层(erc-query-api)提供安全的只读 API
  • 安全加固措施基本到位,仅 panic 处理有少量改进空间

验证结论: 项目功能实现完整度 95%,可投入使用,建议后续修复剩余 panic 热点。