Files
blackbird/docs/security/core_SECURITY_AUDIT_20260801.md
T
qing 7f288f1c09 docs(security): 修正安全审计文档与代码不一致
- core: MQ kill/exec 实际未禁用,修正错误声明;HttpTask.cpp 行号 L53→L58
- gateway: 更新 20+ 处行号偏移(_KEYGEN/handleProxy/is_safe_target 等)
- aibox: shell=True 4处→3处,handle_connection/WebSocket 行号更新
- DEPS: WebSocketServer.cpp 已删除,fuzz 需求转移至 HttpServer_WsSession
- 加固计划: Phase 1.1 (127.0.0.1 绑定) 标记为已完成
- captcha/libhttp: 修正轻微行号偏移
2026-08-06 15:25:07 +00:00

6.7 KiB
Raw Blame History

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小时)

  • 确认 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 支持 # 注释行跳过,可禁用特定启动项