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

3.7 KiB
Raw Blame History

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 防止误用

短期

  • 验证全局熔断配置生效
  • 验证码存储考虑持久化(可选,当前内存实现适合单实例)