# 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 | 1 | 0 | 1 | 50% | | P1 | 2 | 1 | 0 | 1 | 50% | | **合计** | **4** | **2** | **0** | **2** | **50%** | ### 逐条验证 | 编号 | 状态 | 代码位置 | 验证说明 | |------|------|----------|----------| | P0-1 | ✅ 已修复 | ~~`smtp.py`~~ | 旧版 `smtp.py` 已删除下线(2026-08-04),杜绝误启动;`_run.sh` 使用 `smtp_v2.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 | 2 | 0 | | 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`,生产环境已切换至新版 - **修复 (2026-08-04)**: 旧版 `smtp.py` 已**删除下线**,杜绝误启动;README 中相关描述已同步更新 ### 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小时) - [x] 确认 smtp 服务运行的是 smtp_v2.py,旧版下线 ✅ 已确认(`_run.sh` 使用 `smtp_v2.py`) - [x] 删除或隔离 smtp.py 防止误用 ✅ 已删除(2026-08-04) ### 短期 - [ ] 验证全局熔断配置生效 - [ ] 验证码存储考虑持久化(可选,当前内存实现适合单实例)