docs(security): 更新全部模块审计报告,添加代码验证记录
逐模块对照实际代码验证审计报告中的问题修复状态,添加代码验证记录、逐条验证结果、修复率统计。合并aibox两份审计报告,删除重复文件。修复率:confs 61% > dnfs 60% > ai_review 50% > smtp 37.5% > db 33% > core 12.5% > gateway 12.5% > pymsg 6.25% > static 5% > captcha/aibox/BotOps 0%
This commit is contained in:
1 parent
d3158c2420
commit
5fbe3ed5e4
14 files changed
+899
-457
No files matched your search
@@ -8,79 +8,126 @@
|
||||
|
||||
## 修复进度
|
||||
|
||||
| 优先级 | 总数 | 已修复 | 待修复 |
|
||||
|--------|------|--------|--------|
|
||||
| P0 | 1 | 0 | 1 |
|
||||
| P1 | 5 | 部分 | 3 |
|
||||
| P2 | 2 | 0 | 2 |
|
||||
| 优先级 | 总数 | 已修复 | 部分修复 | 未修复 |
|
||||
|--------|------|--------|----------|--------|
|
||||
| P0 | 1 | 0 | 1 | 0 |
|
||||
| P1 | 5 | 0 | 1 | 4 |
|
||||
| P2 | 2 | 1 | 0 | 1 |
|
||||
| **合计** | **8** | **1** | **2** | **5** |
|
||||
|
||||
---
|
||||
|
||||
## 🔴 P0 — 严重问题
|
||||
|
||||
### P0-1: RSA 私钥存储在仓库中/硬编码
|
||||
- **位置**: Token 签名相关代码
|
||||
- **问题**: RSA 私钥若硬编码在代码中或随仓库分发:
|
||||
- 所有部署使用同一密钥对,私钥泄露即全局沦陷
|
||||
- 任何有代码访问权限的人都可伪造 Token
|
||||
- **位置**: `main.cpp` L669 `_KEYGEN = std::make_unique<MyRSA::Generator>();`
|
||||
- **当前状态**: ⚠️ 部分修复
|
||||
- 密钥由 `MyRSA::Generator` 在内存中运行时生成,**未硬编码在源码中**,**未随仓库分发**
|
||||
- 每个进程实例独立生成密钥对,满足"每个部署独立密钥"要求
|
||||
- **遗留问题**: 密钥为内存生成,进程重启后丢失,所有已签发 Token 立即失效
|
||||
- **修复建议**:
|
||||
1. 私钥从文件路径加载(启动参数或环境变量),不硬编码
|
||||
2. 每个部署实例生成独立密钥对
|
||||
3. 私钥文件权限 0600,仅服务运行用户可读
|
||||
4. 公钥分发机制:dnfs、aibox 等需要验签的服务可访问公钥
|
||||
1. ~~私钥从文件路径加载(启动参数或环境变量),不硬编码~~ ✅ 已不在源码中硬编码
|
||||
2. ~~每个部署实例生成独立密钥对~~ ✅ 已满足
|
||||
3. 私钥文件权限 0600,仅服务运行用户可读 — 需增加持久化机制
|
||||
4. 公钥分发机制:dnfs、aibox 等需要验签的服务可访问公钥 — 待实现
|
||||
|
||||
---
|
||||
|
||||
## 🟠 P1 — 高危问题
|
||||
|
||||
| # | 问题 | 说明 |
|
||||
|---|------|------|
|
||||
| P1-1 | Token 吊销机制缺失 | 当前无 Token 黑名单/吊销列表,修改密码/注销后旧 Token 仍然有效直到过期 |
|
||||
| P1-2 | 登录失败次数限制需确认实现 | 是否有 IP/账户级别的失败锁定 |
|
||||
| P1-3 | 上游代理超时配置需验证 | 反向代理超时过短导致大文件上传失败,过长导致 Slowloris |
|
||||
| P1-4 | C++ HTTP 解析器缓冲区溢出审计 | libhttp 库需全面 fuzz 测试 |
|
||||
| P1-5 | 请求体大小限制需确认 | 是否配置了合理的上限(如 10MB) |
|
||||
| # | 问题 | 状态 | 说明 |
|
||||
|---|------|------|------|
|
||||
| P1-1 | Token 吊销机制缺失 | ❌ 未修复 | `handleLogout` (L1160) 仅清除 Cookie,无服务端黑名单/吊销列表;修改密码/注销后旧 Token 仍有效直到过期 |
|
||||
| P1-2 | 登录失败次数限制 | ⚠️ 部分修复 | IP 级限流已实现 (`_LOGIN_RATE`, L998, 5次/300秒),但**无账户级锁定**(同一邮箱多次失败不触发账户锁定) |
|
||||
| P1-3 | 上游代理超时配置 | ❌ 未修复 | `handleProxy` (L1712) 中 `HttpClient` 未显式设置超时,依赖 libhttp 默认值 |
|
||||
| P1-4 | C++ HTTP 解析器缓冲区溢出审计 | ❌ 未修复 | libhttp 库(`src/shared/`)需全面 fuzz 测试 |
|
||||
| P1-5 | 请求体大小限制 | ❌ 未修复 | 未配置显式请求体大小上限(如 10MB),依赖 Boost.Beast 默认行为 |
|
||||
|
||||
---
|
||||
|
||||
## 🟡 P2 — 中危问题
|
||||
|
||||
| # | 问题 |
|
||||
|---|------|
|
||||
| P2-1 | 错误页面可能泄露版本号/堆栈信息 |
|
||||
| P2-2 | HTTPS 配置(如使用)需确认 TLS 版本和密码套件安全 |
|
||||
| # | 问题 | 状态 | 说明 |
|
||||
|---|------|------|------|
|
||||
| P2-1 | 错误页面泄露版本号/堆栈信息 | ✅ 已修复 | `wrapperHttp` (L919-940) 异常捕获返回统一 `"Internal Server Error"`,详细错误仅输出到 stderr,不向客户端暴露 |
|
||||
| P2-2 | HTTPS TLS 版本和密码套件安全 | ❌ 未修复 | `main.cpp` L664-668 TLS 模式下仅指定证书文件,未显式限定 TLS 版本和 CipherSuites |
|
||||
|
||||
---
|
||||
|
||||
## ✅ 已有安全机制
|
||||
|
||||
1. ✅ **PBKDF2 密码哈希**: 慢哈希算法防彩虹表,使用唯一盐值
|
||||
```cpp
|
||||
bool auth_ok = PBKDF2Hasher::verify_password(password, stored_hash);
|
||||
```
|
||||
2. ✅ **RSA Token 签名**: Token 使用 RSA 私钥签名,防伪造
|
||||
1. ✅ **PBKDF2 密码哈希**: 慢哈希算法防彩虹表,使用唯一盐值 (`main.cpp` L58-143)
|
||||
2. ✅ **RSA Token 签名**: Token 使用 RSA 私钥签名,防伪造 (`main.cpp` L1112-1130)
|
||||
3. ✅ **反向代理架构**: 统一入口,隐藏后端服务拓扑
|
||||
4. ✅ **速率限制**: 邮件轰炸多层防护(gateway+smtp 双窗口限流、60秒冷却、失败锁定)
|
||||
5. ✅ **防用户名枚举**: 登录失败返回统一消息(需确认实现)
|
||||
4. ✅ **速率限制**: 多层防护(IP 级 + 邮箱级双窗口限流、60秒冷却、失败锁定)
|
||||
5. ✅ **防用户名枚举**: 用户不存在时执行 dummy PBKDF2 校验拉平响应时序 (`main.cpp` L1078-1083)
|
||||
6. ✅ **WAF 前置防护**: Go WAF 处理 SQLi/XSS/CC/协议解析
|
||||
7. ✅ **C++ 高性能实现**: 避免 Python GIL 瓶颈,抗并发能力强
|
||||
8. ✅ **依赖审计**: 使用项目自带的 libcrypt 加密库(PBKDF2、RSA)
|
||||
9. ✅ **路径遍历防护**: `is_safe_target()` 校验请求路径,拒绝 `..`、空字节、URL 编码遍历 (`main.cpp` L1926-1952)
|
||||
10. ✅ **X-Forwarded-For 可信注入**: 剥离客户端伪造的 IP 头后由 gateway 主动设置 (`main.cpp` L1853-1863)
|
||||
11. ✅ **优雅关闭**: SIGINT/SIGTERM 信号处理 (`main.cpp` L465-479)
|
||||
12. ✅ **Token 刷新机制**: 支持宽限期刷新 + 次数上限 + 限流 (`main.cpp` L1302-1453)
|
||||
13. ✅ **CAPTCHA 强制校验**: 登录/注册/发送验证码均需 CAPTCHA,对接 captcha 服务 (`main.cpp` L426-442)
|
||||
14. ✅ **异步日志**: 批量推送 + fail-safe,db 不可用时静默丢弃 (`LogC.hpp`)
|
||||
|
||||
---
|
||||
|
||||
## 修复路线图
|
||||
|
||||
### 立即(24小时)
|
||||
- [ ] 确认 RSA 私钥不从仓库/硬编码加载,改为外部文件
|
||||
- [ ] 验证请求体大小限制已启用(参考 waf 的 10MB 配置)
|
||||
- [ ] 增加请求体大小限制(参考 waf 10MB 配置)
|
||||
- [ ] 代理上游 HttpClient 增加显式超时配置
|
||||
|
||||
### 短期(72小时)
|
||||
- [x] 确认 RSA 私钥未硬编码 → ✅ 已确认:运行时内存生成,非硬编码
|
||||
- [ ] 实现 Token 吊销列表(密码修改时注销旧 Token)
|
||||
- [ ] 确认登录失败锁定机制生效
|
||||
- [ ] 验证代理超时配置(防 Slowloris + 支持大文件上传)
|
||||
- [ ] 增加账户级登录失败锁定
|
||||
- [ ] libhttp 解析器 fuzz 测试
|
||||
|
||||
### 中期
|
||||
- [ ] 错误页面脱敏
|
||||
- [ ] TLS 安全配置(HTTPS 场景)
|
||||
- [x] 错误页面脱敏 → ✅ 已完成
|
||||
- [ ] TLS 安全配置(限定 TLS 版本和 CipherSuites)
|
||||
- [ ] 管理操作审计日志
|
||||
- [ ] RSA 密钥持久化(避免重启后 Token 全部失效)
|
||||
|
||||
---
|
||||
|
||||
## 代码验证记录
|
||||
|
||||
**验证日期**: 2026-08-03
|
||||
**验证方式**: 逐条对照审计报告与当前代码(`main.cpp`、`Conf.hpp`、`DbC.hpp`、`LogC.hpp`、`Msg.hpp`)
|
||||
|
||||
### 验证结果汇总
|
||||
|
||||
| 等级 | 总数 | 已修复 | 部分修复 | 未修复 | 修复率 |
|
||||
|------|------|--------|----------|--------|--------|
|
||||
| P0 | 1 | 0 | 1 | 0 | 50% (部分) |
|
||||
| P1 | 5 | 0 | 1 | 4 | 10% (部分) |
|
||||
| P2 | 2 | 1 | 0 | 1 | 50% |
|
||||
| **合计** | **8** | **1** | **2** | **5** | **25%** |
|
||||
|
||||
### 逐条验证
|
||||
|
||||
| 编号 | 状态 | 代码位置 | 验证说明 |
|
||||
|------|------|----------|----------|
|
||||
| P0-1 | ⚠️ 部分 | `main.cpp` L669 | `MyRSA::Generator()` 运行时生成,非硬编码;但无持久化,重启后 Token 全部失效 |
|
||||
| P1-1 | ❌ 未修复 | `main.cpp` L1160-1174 | `handleLogout` 仅清除 Cookie,无 Token 黑名单/吊销机制 |
|
||||
| P1-2 | ⚠️ 部分 | `main.cpp` L998 | IP 限流已实现 (5次/300s),无账户级锁定 |
|
||||
| P1-3 | ❌ 未修复 | `main.cpp` L1712-1889 | `handleProxy` 中 `HttpClient` 未显式设置超时 |
|
||||
| P1-4 | ❌ 未修复 | `src/shared/` | libhttp 库未进行 fuzz 测试 |
|
||||
| P1-5 | ❌ 未修复 | `main.cpp` | 未设置请求体大小上限 |
|
||||
| P2-1 | ✅ 已修复 | `main.cpp` L919-940 | 异常统一返回 `"Internal Server Error"`,不泄露类型/堆栈 |
|
||||
| P2-2 | ❌ 未修复 | `main.cpp` L664-668 | TLS 模式仅指定证书,未限定版本和密码套件 |
|
||||
|
||||
### 新增安全机制(审计报告未覆盖)
|
||||
|
||||
| 机制 | 代码位置 | 说明 |
|
||||
|------|----------|------|
|
||||
| 路径遍历防护 | `main.cpp` L1926-1952 | `is_safe_target()` 拒绝 `..`、空字节、URL 编码遍历 |
|
||||
| XFF 可信注入 | `main.cpp` L1853-1863 | 剥离客户端伪造 IP 头后主动设置可信 XFF |
|
||||
| 优雅关闭 | `main.cpp` L465-479 | SIGINT/SIGTERM 信号处理 |
|
||||
| 防用户枚举 | `main.cpp` L1078-1083 | 用户不存在时执行 dummy PBKDF2 拉平响应时序 |
|
||||
| 密码强度校验 | `main.cpp` L148-181 | 8-128字符,至少3种字符类别 |
|
||||
| 邮箱双窗口限流 | `main.cpp` L1652-1660 | 3次/小时 + 10次/天/邮箱 |
|
||||
| 异步日志 fail-safe | `LogC.hpp` L210-213 | db 不可用时静默丢弃,绝不影响业务 |
|
||||
Reference in new issue
Block a user