pymsg 模块安全审计报告
审计日期: 2026-08-01
审计范围: pymsg/__init__.py、pymsg/rpc.py、pymsg/async_queue.py
代码版本: dev_qing 分支
⚠️ 合并追溯说明(2026-08-10)
原始审计报告共 16 条发现(P0×3 / P1×5 / P2×4 / P3×4)。其中 6 条已修复项
(P0-1、P0-2、P1-1、P1-2、P1-3、P1-5)的修复代码已落地并经 2026-08-03 验证,
现已作为 [SECURITY AUDIT ... ✅ 已修复] 注释合并进源文件对应位置:
| 编号 |
已合并位置 |
| P0-1 |
pymsg/__init__.py — recv()、_recv_exact() |
| P0-2 |
pymsg/__init__.py — recv()、_handle_client() |
| P1-1 |
pymsg/__init__.py — MsgServer.__init__、_accept_client() |
| P1-2 |
pymsg/__init__.py — _BoundedThreadPoolExecutor 类、MsgServer.__init__、_handle_client() |
| P1-3 |
pymsg/rpc.py — _sanitize_error() |
| P1-5 |
pymsg/rpc.py — 模块顶部 _MAX_NUM_DIGITS 注释、_dispatch() |
本报告以下章节仅保留尚未修复(未合并)的 10 条发现作为待办跟踪,已修复条目
已从「逐条验证」「修复进度」及详细问题章节中删除,其完整描述见源代码注释。
剩余未修复条目(待跟踪)
汇总
| 等级 |
剩余总数 |
说明 |
| P0 |
1 |
无认证/鉴权机制 |
| P1 |
1 |
明文 TCP,无 TLS |
| P2 |
4 |
健壮性/配置问题 |
| P3 |
4 |
优化建议 |
| 合计 |
10 |
|
逐条验证(仅未合并项)
| 编号 |
状态 |
代码位置 |
说明 |
| P0-3 |
❌ 未修复 |
rpc.py L80-171 |
无认证机制,仅依赖 127.0.0.1 网络层隔离 |
| P1-4 |
❌ 未修复 |
全模块 |
明文 TCP,无 TLS 支持 |
| 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 |
问题严重等级
| 等级 |
说明 |
响应时间 |
| P0 🔴 |
可导致服务崩溃、DoS 或远程接管 |
立即修复 |
| P1 🟠 |
可导致资源耗尽、信息泄露 |
72小时内 |
| P2 🟡 |
健壮性/配置问题 |
一周内 |
| P3 🟢 |
优化建议 |
版本迭代 |
修复进度(剩余)
| 优先级 |
剩余待修复 |
| P0 |
1(无认证) |
| P1 |
1(无 TLS) |
| P2 |
4 |
| P3 |
4 |
🔴 P0 — 严重问题
P0-3: 无认证/鉴权机制
- 位置:
rpc.py:80-171 整个 RpcServer
- 问题: RPC 服务完全没有身份验证,任何能连接到端口的客户端都能调用所有路由
- 当前缓解: 所有服务均绑定 127.0.0.1,依赖网络层隔离
- 修复建议:
- 添加基于预共享 token 的认证(如
_auth 字段)
- 支持路由级权限控制
- 文档明确警告不要暴露到公网
🟠 P1 — 高危问题
| # |
问题 |
位置 |
状态 |
| P1-4 |
无 TLS/加密传输,内网流量可被窃听 |
全模块明文 TCP |
❌ 未修复 |
🟡 P2 — 中危问题
| # |
问题 |
| P2-1 |
length=0 空消息未特殊处理,可用于心跳攻击 |
| P2-2 |
broadcast() 无频率/权限控制,可被用于放大攻击 |
| P2-3 |
select 异常处理过于宽泛,EINTR 临时错误直接退出循环 |
| P2-4 |
MsgClient 短连接模式导致 TIME_WAIT 堆积 |
🟢 P3 — 低危/建议
| # |
建议 |
| P3-1 |
安全事件(超大消息、超时、JSON解析失败)无日志 |
| P3-2 |
name 参数未过滤控制字符,可导致日志注入 |
| P3-3 |
listen backlog=10 在高并发下偏小 |
| P3-4 |
无优雅关闭(直接 close() 可能发送 RST) |
✅ 已有安全机制
- ✅ 64 MiB 消息大小上限(
_MAX_MSG_SIZE),防止 OOM
- ✅ send/recv 双端都检查消息大小
- ✅ 线程池模式下同一连接串行处理,避免帧交错
- ✅ 使用
sendmsg 散射-聚集 I/O 减少内存拷贝
- ✅ 使用
recv_into 预分配 buffer
- ✅ 线程安全的发送锁
- ✅ 回调异常隔离(线程池模式)
- ✅ 单元测试覆盖消息大小边界
注:P0-1(recv 总超时)、P0-2(UnicodeDecodeError 防护)、P1-1(连接数限制)、
P1-2(有界队列)、P1-3(异常脱敏)、P1-5(JSON 解析限制)等已修复机制均已合并进
源代码注释,见开头「合并追溯说明」。
修复路线图(剩余)
中期