Files
micro_servers/docs/security/smtp_SECURITY_AUDIT_20260801.md
T
qing 5fbe3ed5e4 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%
2026-08-03 14:12:45 +08:00

94 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# smtp 模块安全审计报告
**审计日期**: 2026-08-01
**审计范围**: `smtp.py`(旧版)、`smtp_v2.py`(新版)、`log_client.py`
**代码版本**: dev_qing 分支
---
## 代码验证记录
**验证日期**: 2026-08-03
**验证方式**: 逐条对照审计报告与当前代码(`smtp_v2.py`、`smtp.py`、`log_client.py`、`_run.sh`)
### 验证结果汇总
| 等级 | 总数 | 已修复 | 部分修复 | 未修复 | 修复率 |
|------|------|--------|----------|--------|--------|
| P0 | 2 | 0 | 1 | 1 | 25% (部分) |
| P1 | 2 | 1 | 0 | 1 | 50% |
| **合计** | **4** | **1** | **1** | **2** | **37.5%** (部分) |
### 逐条验证
| 编号 | 状态 | 代码位置 | 验证说明 |
|------|------|----------|----------|
| P0-1 | ⚠️ 部分 | `_run.sh` L6, `smtp.py` | `_run.sh` 已确认使用 `smtp_v2.py`,但旧版 `smtp.py` 仍存在于代码库中,可被误启动 |
| P0-2 | ❌ 未修复 | `smtp_v2.py` L113-117 | 使用 pymsg RpcServer,无认证机制(与 pymsg P0-3 同源),依赖 127.0.0.1 网络隔离 |
| P1-1 | ❌ 未修复 | `smtp_v2.py` L90 | 验证码存储在进程内存 `code_store` dict,服务重启后全部失效 |
| P1-2 | ✅ 已修复 | `smtp_v2.py` L82, L191 | `SMTP_HOURLY_LIMIT` 从环境变量正确加载(默认 100),全局熔断逻辑正确生效 |
---
## 修复进度
| 优先级 | 总数 | 已修复 | 待修复 |
|--------|------|--------|--------|
| P0 | 2 | 1(v2已修复) | 1(旧版需下线) |
| P1 | 2 | 1 | 1 |
---
## 🔴 P0 — 严重问题
### P0-1: 旧版 smtp.py 存在大量致命漏洞(需立即下线) ⚠️ 部分修复
- **位置**: `smtp.py`、`_run.sh`
- **问题**: 旧版 smtp.py 缺乏关键防护:
1. 无发送速率限制(可被用于邮件炸弹)
2. 无同邮箱 60 秒发送冷却
3. 无验证码过期清理机制
4. 无连续失败锁定机制
5. 存在 `NameError` 风险:`server.quit()` 在 finally 块中,若 SMTP 连接失败导致 `server` 未赋值则崩溃
- **已确认**: `_run.sh` L6 使用 `exec python3 smtp_v2.py`,生产环境已切换至新版
- **仍缺失**: 旧版 `smtp.py` 仍存在于代码库中,可被误启动
- **修复建议**:
1. 删除或重命名旧版 `smtp.py`(如 `smtp.py.deprecated`)防止误用
2. 在代码注释中明确标记废弃
### P0-2: 依赖 pymsg 无认证(缓解:绑定 127.0.0.1)
- **说明**: 与其他 pymsg 服务相同,当前依赖网络层隔离
---
## 🟠 P1 — 高危问题
| # | 问题 | 说明 |
|---|------|------|
| P1-1 | 验证码存储在进程内存,服务重启后所有未使用验证码失效 | 可被利用造成拒绝服务(频繁重启导致用户无法注册) |
| P1-2 | 全局发送熔断配置需确认生效(`SMTP_HOURLY_LIMIT`) | smtp_v2 已有但需验证环境变量正确加载 |
---
## ✅ 已有安全机制(smtp_v2.py)
1. ✅ **同邮箱 60 秒发送冷却**: 冷却期拒绝并返回 `retry_after`
2. ✅ **邮箱级限流**(gateway 层双窗口:3次/小时 + 10次/天)
3. ✅ **验证码一次性消费**: 校验通过立即删除,防重放
4. ✅ **连续失败 5 次自动作废**: 防暴力破解验证码
5. ✅ **10 分钟有效期**: 惰性过期清理
6. ✅ **发送失败不计入冷却**: 防止网络错误误限制
7. ✅ **全局熔断(可选)**: `SMTP_HOURLY_LIMIT` 默认 100 封/小时
8. ✅ **fail-closed**: SMTP 异常时验证码校验失败
---
## 修复路线图
### 立即(24小时)
- [ ] 确认 smtp 服务运行的是 smtp_v2.py,旧版下线
- [ ] 删除或隔离 smtp.py 防止误用
### 短期
- [ ] 验证全局熔断配置生效
- [ ] 验证码存储考虑持久化(可选,当前内存实现适合单实例)