Files
insar-management-system-v2/docs/SECURITY_AUDIT_2026-03-12.md

5.5 KiB

安全审计补充记录(2026-03-12)

审计范围:后端权限边界、文件与归档处理链路、部署敏感资产暴露情况。
审计方式:静态只读审计,本文档仅记录结论与建议,不包含代码修复。
审计前提:当前环境为开发机,目标部署环境为私有内网;授权签发材料与初始化密码当前因封装方式不足,仍位于开发目录中。

1. 本次审计的判断口径

本次记录将问题分为两类:

  1. 开发阶段可解释、但上线打包时必须隔离的运维/交付风险。
  2. 与部署环境无关、进入内网后仍然成立的代码级安全缺陷。

这一区分的目的,是避免把“开发机上的临时暴露”与“真正需要修代码的问题”混为一谈。

2. 开发机阶段的可解释暴露

以下内容在当前“开发机 + 私有内网 + 尚未完成封装”的前提下,可以暂时理解为运维接受项;但它们不应进入最终部署包、客户现场机器、共享目录或备份集。

2.1 授权签发私钥与签发工具位于项目目录

  • 证据:
    • license-issuer/issue_license.py
    • license-issuer/private_key.b64
    • backend/app/license_service.py
    • license-issuer/README.md
  • 说明:
    • 当前目录同时包含授权验证逻辑和签发私钥材料。
    • 在开发阶段这可以理解为便于调试和现场签发。
    • 但从交付角度看,签发端与验证端必须物理隔离。
  • 当前结论:
    • 在开发机上记录为“运维接受项”。
    • 在上线交付前必须从部署物中彻底移除。

2.2 .env 中包含初始化管理员密码

  • 证据:
    • .env
    • scripts/init_db.py
    • README.md
  • 说明:
    • 初始化脚本会读取 INIT_ADMIN_PASSWORD 用于创建或重置管理员。
    • 这在开发期、首次部署准备期可以理解为简化初始化流程。
    • 但如果 .env 被打进部署包、同步到共享目录或留在客户机,管理员账户控制面会暴露。
  • 当前结论:
    • 在开发机上记录为“运维接受项”。
    • 在上线交付前必须改为受控注入,不应随项目目录长期保留。

3. 上线前应修复的代码问题

以下问题即使部署在私有内网,仍然成立,建议在正式部署前完成修复。

3.1 归档解压边界仍不安全

  • 风险等级:高
  • 证据:
    • scripts/unpack_archives.py:123
    • scripts/unpack_archives.py:206
    • backend/app/services/gf3_service.py:27
    • backend/app/services/gf3_service.py:36
    • backend/app/services/gf3_service.py:42
  • 问题描述:
    • 现有检查主要基于归档条目名中的 .. 或绝对路径。
    • 但后续仍直接使用 extractall
    • 这种模式对 tar 的符号链接、硬链接等条目并不稳妥。
  • 影响:
    • 如果输入归档来自外部来源、共享目录或低信任操作员,可能出现目录逃逸或覆盖非目标文件的风险。
  • 建议:
    • 禁用不安全条目类型。
    • 使用逐条提取代替 extractall
    • 在提取前对最终落盘路径做真实路径校验。

3.2 导出目录白名单使用前缀匹配,存在绕过空间

  • 风险等级:中
  • 证据:
    • backend/app/routers/dependencies.py:179
    • backend/app/routers/dependencies.py:219
    • backend/app/routers/tools.py:88
    • backend/app/routers/dinsar.py:299
    • backend/app/routers/idl.py:246
  • 问题描述:
    • ALLOWED_EXPORT_DIRS 白名单校验使用 startswith
    • 当允许目录为 C:\exports 时,类似 C:\exports_tmp 也可能被误判为合法。
  • 影响:
    • 导出、复制、结果提取类接口的目标目录边界不够严格。
  • 建议:
    • 改为基于规范化后的真实路径做“目录包含关系”判断,而不是字符串前缀判断。

3.3 登录限流按用户名生效,容易被用于锁死指定账号

  • 风险等级:中
  • 证据:
    • backend/app/routers/dependencies.py:459
    • backend/app/routers/auth.py:72
    • backend/app/routers/dependencies.py:92
    • backend/app/routers/dependencies.py:94
  • 问题描述:
    • 当前限流键仅基于用户名,不区分来源。
    • 任意请求方只需反复提交错误密码,即可让目标账号进入锁定窗口。
  • 影响:
    • 会形成低成本拒绝服务,尤其对 admin 账号明显。
  • 建议:
    • 改为“用户名 + 来源”或多维限流。
    • 对不存在账号和存在账号保持相近的响应节奏。
    • 视部署场景决定是否叠加网关层限流。

4. 本轮未发现的高风险点

本轮复核中,暂未发现以下明显高危问题:

  • 前端未见将会话令牌持久化到 localStoragesessionStorage
  • 后端主路由默认挂载了统一的授权与登录依赖。
  • 管理类写操作多数仍要求管理员身份。

这不代表系统不存在其他缺陷,只表示在本次覆盖范围内未发现更高优先级的新问题。

5. 建议的上线前处置顺序

P0:正式部署前必须完成

  1. 修复所有归档解压的安全边界。
  2. 修复导出路径白名单判断逻辑。
  3. 调整登录限流策略,避免用户名级别锁死。
  4. 确保 license-issuer/.env、任何实际授权文件不进入部署包。

P1:交付封装优化

  1. 将签发工具与后端运行目录彻底拆分。
  2. 将初始化口令改为部署时注入,而不是长期存放在项目根目录。
  3. 为部署物建立显式排除清单。

6. 说明

  • 本文档用于记录 2026-03-12 的补充审计结论。
  • 本次审计未进行动态利用验证。
  • 本次审计未修改业务代码。