# 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` L58、L130-142 - **当前状态**: ⚠️ 部分修复 - ✅ 管理接口已绑定 `127.0.0.1`(`HttpTask.cpp` L58),仅本地可访问 - ❌ MQ 通道的 `kill`/`exec` 操作**仍在活跃执行**(`main.cpp` L283-296),L282 注释标注"在身份验证之前禁止操作"但代码未实际禁用 - ❌ **HTTP 端点 `/exec`、`/kill`、`/list` 仍无任何认证**(`HttpTask.cpp` L130-142),本地任意进程可调用 - ❌ 无操作审计日志 - **修复建议**: 1. ~~确保管理接口仅监听 127.0.0.1~~ ✅ 已实现 2. 添加强认证(预共享 Token 或 Basic Auth over localhost) 3. 危险命令(exec、kill)要求二次确认 4. 记录所有管理操作审计日志 ### P0-2: init.txt 配置文件无完整性校验,可注入恶意命令 - **位置**: `src/main/pmc_mtd.cpp` L90-118 `parse_self_init_list()` - **当前状态**: ❌ 未修复 - 无数字签名/校验和验证 - 无文件大小限制检查 - 支持 `#` 注释行跳过(基础防护),但命令行内容无任何校验 - 逐行读取后直接 `ppool.crtp(row)` 创建进程 - **修复建议**: 1. init.txt 添加数字签名/校验和验证 2. 运行时监控 init.txt 修改,变更需管理员确认 3. 文件权限设为 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 等 | --- ## ✅ 已有安全机制 1. ✅ **进程生命周期管理**: 自动重启异常退出的子进程,保障服务可用性 2. ✅ **线程池模型**: 固定线程数,防止无限线程创建 3. ✅ **日志集中管理**: 统一日志格式和输出 4. ✅ **C++ RAII 内存管理**: 使用智能指针减少内存泄漏风险 5. ✅ **依赖审计**: 使用经过审计的 libth 线程库、libhttp HTTP 库、libcrypt 加密库 6. ✅ **管理接口本地绑定**: HTTP 管理接口仅监听 `127.0.0.1`(`HttpTask.cpp` L58) 7. ❌ **MQ 通道危险操作未禁用**: `kill`/`exec` 通过消息队列的路径**仍在活跃执行**(`main.cpp` L283-296),L282 注释标注"在身份验证之前禁止操作"但代码未实际注释禁用 --- ## 修复路线图 ### 立即(24小时) - [x] 确认 PMC HTTP 接口仅绑定 127.0.0.1 → ✅ 已确认 - [ ] **禁用或保护 MQ 通道 kill/exec**(`main.cpp` L283-296 当前仍活跃,注释标注禁止但未实际执行) - [ ] PMC HTTP 接口 `/exec`、`/kill` 添加认证(当前仅绑定 localhost 不足以防御本地恶意进程) - [ ] 检查 init.txt 文件权限 ### 短期(72小时) - [ ] PMC HTTP 接口添加认证(预共享 Token 或 Basic Auth) - [ ] 子进程重启频率限制(指数退避或熔断) - [ ] 审计 libhttp HTTP 解析器 ### 中期 - [ ] init.txt 完整性校验 - [ ] 管理操作审计日志 - [ ] 信号处理函数安全改造(仅使用 `volatile sig_atomic_t` 标志位) - [ ] 进程池大小上限 - [ ] Core dump 过滤/禁用 --- ## 代码验证记录 **验证日期**: 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` L58, L130-142 | 已绑定 127.0.0.1;但 MQ 通道 kill/exec **未禁用**(`main.cpp` L283-296 仍活跃);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` 通过消息队列的路径**仍活跃**,L282 注释标注"在身份验证之前禁止操作"但未实际注释代码 | | HTTP 管理接口本地绑定 | `HttpTask.cpp` L58 | 显式绑定 `127.0.0.1`,非 `0.0.0.0` | | init.txt 注释行支持 | `pmc_mtd.cpp` L105-107 | 支持 `#` 注释行跳过,可禁用特定启动项 |