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 缺乏关键防护:
- 无发送速率限制(可被用于邮件炸弹)
- 无同邮箱 60 秒发送冷却
- 无验证码过期清理机制
- 无连续失败锁定机制
- 存在
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)
- ✅ 同邮箱 60 秒发送冷却: 冷却期拒绝并返回
retry_after
- ✅ 邮箱级限流(gateway 层双窗口:3次/小时 + 10次/天)
- ✅ 验证码一次性消费: 校验通过立即删除,防重放
- ✅ 连续失败 5 次自动作废: 防暴力破解验证码
- ✅ 10 分钟有效期: 惰性过期清理
- ✅ 发送失败不计入冷却: 防止网络错误误限制
- ✅ 全局熔断(可选):
SMTP_HOURLY_LIMIT 默认 100 封/小时
- ✅ fail-closed: SMTP 异常时验证码校验失败
修复路线图
立即(24小时)
短期