- CreateSkillTool/InstallSkillTool 改为生成带 .md 扩展名的技能文件,与人格技能文件规范一致 - 同步更新 7_extension_skills.md 模板与工具描述 - 删除旧版 smtp.py(P0-1)并同步审计文档与 README
91 lines
3.6 KiB
Markdown
91 lines
3.6 KiB
Markdown
# 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)
|
||
|
||
### 短期
|
||
- [ ] 验证全局熔断配置生效
|
||
- [ ] 验证码存储考虑持久化(可选,当前内存实现适合单实例)
|