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%
This commit is contained in:
qing committed 2026-08-03 14:12:45 +08:00
1 parent d3158c2420
commit 5fbe3ed5e4
14 files changed
+899 -457

No files matched your search

+57 -12
View File
@@ -1,11 +1,49 @@
# pymsg 模块安全审计报告
**审计日期**: 2026-08-01
**审计范围**: `pymsg/__init__.py`、`pymsg/rpc.py`
**审计范围**: `pymsg/__init__.py`、`pymsg/rpc.py`、`pymsg/async_queue.py`
**代码版本**: dev_qing 分支
---
## 代码验证记录
**验证日期**: 2026-08-03
**验证方式**: 逐条对照审计报告与当前代码(`__init__.py`、`rpc.py`、`async_queue.py`)
### 验证结果汇总
| 等级 | 总数 | 已修复 | 部分修复 | 未修复 | 修复率 |
|------|------|--------|----------|--------|--------|
| P0 | 3 | 1 | 0 | 2 | 33% |
| P1 | 5 | 0 | 0 | 5 | 0% |
| P2 | 4 | 0 | 0 | 4 | 0% |
| P3 | 4 | 0 | 0 | 4 | 0% |
| **合计** | **16** | **1** | **0** | **15** | **6.25%** |
### 逐条验证
| 编号 | 状态 | 代码位置 | 验证说明 |
|------|------|----------|----------|
| P0-1 | ❌ 未修复 | `__init__.py` L103, L140-156 | `_recv_exact` 仍使用 `sock.settimeout()` 单次系统调用超时,非 deadline 模式;攻击者可逐字节发送维持连接 |
| P0-2 | ✅ 已修复 | `__init__.py` L113-114, L462-463 | 双重防护:`recv()` 将 `UnicodeDecodeError` 包装为 `ConnectionError`;`_handle_client` 防御性捕获 `UnicodeDecodeError` |
| P0-3 | ❌ 未修复 | `rpc.py` L80-171 | 无认证机制,仅依赖 127.0.0.1 网络层隔离 |
| P1-1 | ❌ 未修复 | `__init__.py` L359 | `listen(10)` 仅限制 SYN 队列,不限制已建立连接数 |
| P1-2 | ❌ 未修复 | `__init__.py` L362-365 | `ThreadPoolExecutor` 使用默认无界队列 |
| P1-3 | ❌ 未修复 | `rpc.py` L160, L178 | `_dispatch` 将 `str(e)` 和 `f"JSON 解析失败: {e}"` 直接返回客户端 |
| P1-4 | ❌ 未修复 | 全模块 | 明文 TCP,无 TLS 支持 |
| P1-5 | ❌ 未修复 | `rpc.py` L158 | `json.loads(text)` 无深度限制 |
| P2-1 | ❌ 未修复 | `__init__.py` L106-111 | length=0 空消息无特殊处理 |
| P2-2 | ❌ 未修复 | `__init__.py` L395-418 | `broadcast()` 无频率/权限控制 |
| P2-3 | ❌ 未修复 | `__init__.py` L377-378 | `except (ValueError, OSError): break` 仍捕获所有 OSError(含 EINTR) |
| P2-4 | ❌ 未修复 | `__init__.py` L196-203 | `MsgClient.send()` 短连接模式,高频调用导致 TIME_WAIT 堆积 |
| P3-1 | ❌ 未修复 | - | 安全事件(超大消息、超时、JSON 解析失败)无日志 |
| P3-2 | ❌ 未修复 | `__init__.py` L182 | `name` 参数未过滤控制字符 |
| P3-3 | ❌ 未修复 | `__init__.py` L359 | `listen(10)` backlog 在高并发下偏小 |
| P3-4 | ❌ 未修复 | `__init__.py` L520-527 | `_shutdown` 直接 `close()` 所有 socket,可能发送 RST |
---
## 问题严重等级
| 等级 | 说明 | 响应时间 |
@@ -49,16 +87,13 @@
---
### P0-2: UnicodeDecodeError 可导致同步模式服务崩溃
- **位置**: `__init__.py:111`、`__init__.py:434-448`
- **问题**: `payload.decode("utf-8")` 抛出的 `UnicodeDecodeError`(`ValueError` 子类)不在 `_handle_client` 的异常捕获列表 `(ConnectionError, ConnectionResetError, OSError, TimeoutError)` 中。**同步模式(workers=0,默认配置)下收到无效 UTF-8 字节会直接导致整个服务进程崩溃!**
- **影响范围**: db/confs/smtp/captcha 等所有默认配置的 pymsg 服务
- **修复建议**: 在异常捕获中添加 `UnicodeDecodeError` 和 `json.JSONDecodeError`:
```python
except (ConnectionError, ConnectionResetError, OSError, TimeoutError,
UnicodeDecodeError, json.JSONDecodeError):
...
```
### P0-2: UnicodeDecodeError 可导致同步模式服务崩溃 ✅ 已修复
- **位置**: `__init__.py:113-114`、`__init__.py:462-463`
- **原问题**: `payload.decode("utf-8")` 抛出的 `UnicodeDecodeError`(`ValueError` 子类)不在 `_handle_client` 的异常捕获列表中,同步模式下收到无效 UTF-8 字节会直接导致整个服务进程崩溃
- **修复方案(双重防护)**:
1. `recv()` 函数将 `UnicodeDecodeError` 包装为 `ConnectionError`(第一层)
2. `_handle_client` 异常捕获列表添加 `UnicodeDecodeError`(第二层,防御性兜底)
- **影响范围**: 已消除,db/confs/smtp/captcha 等所有 pymsg 服务均受保护
---
@@ -119,13 +154,23 @@
8. ✅ 回调异常隔离(线程池模式)
9. ✅ 单元测试覆盖消息大小边界
## 新增安全机制(审计后添加,审计报告未覆盖)
| 机制 | 代码位置 | 说明 |
|------|----------|------|
| UnicodeDecodeError 双重防护 | `__init__.py` L113-114, L462-463 | `recv()` 包装为 `ConnectionError` + `_handle_client` 防御性捕获,防止无效 UTF-8 导致服务崩溃 |
| AsyncRpcQueue 有界队列 | `async_queue.py` L47, L130-132 | `max_queue_size` 默认 10000,超限丢弃最旧数据,防止内存无限增长 |
| AsyncRpcQueue 错误隔离 | `async_queue.py` L49, L189-194 | `on_error` 回调 + 异常捕获,后台线程失败不影响主业务 |
| RpcClient 响应格式校验 | `rpc.py` L89-90 | 校验响应必须是含 `success` 字段的 dict,非法响应抛出 `RpcError` |
| MsgClient.call 节制日志 | `__init__.py` L209, L248-254 | 重试日志首次立即打印,后续每 5 秒一次,避免刷屏 |
---
## 修复路线图
### 立即(24小时)
- [ ] 修复 P0-1: recv 总超时(deadline 模式)
- [ ] 修复 P0-2: 捕获 UnicodeDecodeError/JSONDecodeError
- [x] 修复 P0-2: 捕获 UnicodeDecodeError/JSONDecodeError ✅ 已完成
### 短期(72小时)
- [ ] 添加最大连接数限制