core(Nidus)模块安全审计报告
审计日期: 2026-08-01
审计范围: src/main/、src/shared/
代码版本: dev_qing 分支
修复进度
| 优先级 |
总数 |
已修复 |
部分修复 |
未修复 |
| P0 |
2 |
0 |
1 |
1 |
| P1 |
3 |
0 |
0 |
3 |
| P2 |
3 |
0 |
1 |
2 |
| 合计 |
8 |
0 |
2 |
6 |
🔴 P0 — 严重问题
P0-1: PMC HTTP 管理接口无认证,可执行任意系统命令
- 位置:
src/main/HttpTask.cpp L53、L130-142
- 当前状态: ⚠️ 部分修复
- ✅ 管理接口已绑定
127.0.0.1(HttpTask.cpp L53),仅本地可访问
- ✅ MQ 通道的
kill/exec 操作已注释禁用(main.cpp L282-296),注释标注"在身份验证之前禁止操作"
- ❌ HTTP 端点
/exec、/kill、/list 仍无任何认证(HttpTask.cpp L130-142),本地任意进程可调用
- ❌ 无操作审计日志
- 修复建议:
确保管理接口仅监听 127.0.0.1 ✅ 已实现
- 添加强认证(预共享 Token 或 Basic Auth over localhost)
- 危险命令(exec、kill)要求二次确认
- 记录所有管理操作审计日志
P0-2: init.txt 配置文件无完整性校验,可注入恶意命令
- 位置:
src/main/pmc_mtd.cpp L90-118 parse_self_init_list()
- 当前状态: ❌ 未修复
- 无数字签名/校验和验证
- 无文件大小限制检查
- 支持
# 注释行跳过(基础防护),但命令行内容无任何校验
- 逐行读取后直接
ppool.crtp(row) 创建进程
- 修复建议:
- init.txt 添加数字签名/校验和验证
- 运行时监控 init.txt 修改,变更需管理员确认
- 文件权限设为 0600,仅 root/运行用户可写
🟠 P1 — 高危问题
| # |
问题 |
状态 |
位置 |
说明 |
| P1-1 |
子进程异常退出无次数限制 |
❌ 未修复 |
PPool.cpp、pmc_mtd.cpp |
PPool 无重启计数/频率限制,crtp() 无熔断机制;ProcessTask.cpp 在 #ifdef __NEW_VER 下未启用 |
| P1-2 |
日志路径穿越 |
❌ 未修复 |
pmc_mtd.cpp L90-118 |
init.txt 解析时未校验子进程命令行中的日志路径参数,可被构造写入任意位置 |
| P1-3 |
C++ HTTP 解析器需审计缓冲区溢出 |
❌ 未修复 |
libhttp 库(src/shared/) |
与 gateway P1-4 同一问题,libhttp 库未进行 fuzz 测试 |
🟡 P2 — 中危问题
| # |
问题 |
状态 |
说明 |
| P2-1 |
信号处理函数中使用非异步安全函数 |
❌ 未修复 |
main.cpp L76-81 signalHandler 调用 LOG_INFO(日志宏,底层为 printf)和 cv.WakeCv()(条件变量),均非异步信号安全 |
| P2-2 |
线程池任务队列无上限 |
⚠️ 部分修复 |
消息队列 Mq 有固定容量(msgcnt),但进程池 PPool 无大小上限,crtp() 可无限追加 |
| P2-3 |
崩溃 core dump 可能包含敏感信息 |
❌ 未修复 |
无 core dump 过滤或禁用机制,崩溃时可能泄露内存中的密码哈希、Token 等 |
✅ 已有安全机制
- ✅ 进程生命周期管理: 自动重启异常退出的子进程,保障服务可用性
- ✅ 线程池模型: 固定线程数,防止无限线程创建
- ✅ 日志集中管理: 统一日志格式和输出
- ✅ C++ RAII 内存管理: 使用智能指针减少内存泄漏风险
- ✅ 依赖审计: 使用经过审计的 libth 线程库、libhttp HTTP 库、libcrypt 加密库
- ✅ 管理接口本地绑定: HTTP 管理接口仅监听
127.0.0.1(HttpTask.cpp L53)
- ✅ MQ 通道危险操作已禁用:
kill/exec 通过消息队列的路径已注释,等待认证机制就绪(main.cpp L282-296)
修复路线图
立即(24小时)
短期(72小时)
中期
代码验证记录
验证日期: 2026-08-03
验证方式: 逐条对照审计报告与当前代码(main.cpp、HttpTask.cpp、ProcessTask.cpp、PPool.cpp、pmc_mtd.cpp、Tttask.cpp、subsys_call.cpp)
验证结果汇总
| 等级 |
总数 |
已修复 |
部分修复 |
未修复 |
修复率 |
| P0 |
2 |
0 |
1 |
1 |
25% (部分) |
| P1 |
3 |
0 |
0 |
3 |
0% |
| P2 |
3 |
0 |
1 |
2 |
17% (部分) |
| 合计 |
8 |
0 |
2 |
6 |
12.5% |
逐条验证
| 编号 |
状态 |
代码位置 |
验证说明 |
| P0-1 |
⚠️ 部分 |
HttpTask.cpp L53, L130-142 |
已绑定 127.0.0.1;MQ 通道 kill/exec 已注释;但 HTTP 端点 /exec//kill 仍无认证 |
| P0-2 |
❌ 未修复 |
pmc_mtd.cpp L90-118 |
parse_self_init_list 无完整性校验、无大小限制、无命令内容校验 |
| P1-1 |
❌ 未修复 |
PPool.cpp |
crtp() 无熔断/频率限制;ProcessTask.cpp 在 #ifdef __NEW_VER 下未启用 |
| P1-2 |
❌ 未修复 |
pmc_mtd.cpp L90-118 |
init.txt 解析未校验子进程日志路径参数 |
| P1-3 |
❌ 未修复 |
src/shared/ |
libhttp 库未进行 fuzz 测试 |
| P2-1 |
❌ 未修复 |
main.cpp L76-81 |
signalHandler 使用 LOG_INFO(printf) + cv.WakeCv(),非异步安全 |
| P2-2 |
⚠️ 部分 |
Tttask.cpp L43, PPool.cpp |
Mq 有容量限制;但 PPool 进程池无上限 |
| P2-3 |
❌ 未修复 |
- |
无 core dump 过滤/禁用机制 |
新增安全措施(审计报告未覆盖)
| 措施 |
代码位置 |
说明 |
| MQ 通道危险操作禁用 |
main.cpp L282-296 |
kill/exec 通过消息队列的路径已注释,注释标注"在身份验证之前禁止操作" |
| HTTP 管理接口本地绑定 |
HttpTask.cpp L53 |
显式绑定 127.0.0.1,非 0.0.0.0 |
| init.txt 注释行支持 |
pmc_mtd.cpp L105-107 |
支持 # 注释行跳过,可禁用特定启动项 |