chore: initialize insar management system v2
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
# 安全审计补充记录(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. 本轮未发现的高风险点
|
||||
|
||||
本轮复核中,暂未发现以下明显高危问题:
|
||||
|
||||
- 前端未见将会话令牌持久化到 `localStorage` 或 `sessionStorage`。
|
||||
- 后端主路由默认挂载了统一的授权与登录依赖。
|
||||
- 管理类写操作多数仍要求管理员身份。
|
||||
|
||||
这不代表系统不存在其他缺陷,只表示在本次覆盖范围内未发现更高优先级的新问题。
|
||||
|
||||
## 5. 建议的上线前处置顺序
|
||||
|
||||
### P0:正式部署前必须完成
|
||||
|
||||
1. 修复所有归档解压的安全边界。
|
||||
2. 修复导出路径白名单判断逻辑。
|
||||
3. 调整登录限流策略,避免用户名级别锁死。
|
||||
4. 确保 `license-issuer/`、`.env`、任何实际授权文件不进入部署包。
|
||||
|
||||
### P1:交付封装优化
|
||||
|
||||
1. 将签发工具与后端运行目录彻底拆分。
|
||||
2. 将初始化口令改为部署时注入,而不是长期存放在项目根目录。
|
||||
3. 为部署物建立显式排除清单。
|
||||
|
||||
## 6. 说明
|
||||
|
||||
- 本文档用于记录 2026-03-12 的补充审计结论。
|
||||
- 本次审计未进行动态利用验证。
|
||||
- 本次审计未修改业务代码。
|
||||
|
||||
Reference in New Issue
Block a user