Files
ai-contract-platform/project-docs/V2-security-scan-rerun-2026-06-27.md
yuqei a3bb78e06b
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Failing after 16m35s
release: freeze V2 release candidate
2026-07-12 15:32:24 +08:00

4.9 KiB
Raw Permalink Blame History

AI 合同平台 V2 安全扫描复跑与补洞报告

日期:2026-06-27 本机复跑时间:2026-06-27 14:36:52 +08:00

结论

本轮安全扫描可以收口。

  • npm audit --omit=dev --audit-level=high:0 vulnerabilities。
  • bandit:高危 0、中危 0、低危 0,skipped_tests=0。
  • pip-audit:项目级虚拟环境 .venv-project 共审计 39 个 Python 依赖,0 known vulnerabilities。
  • 对 Bandit 曾经容易指到的 SQL 动态拼接区域做了人工复核,未发现用户输入进入 SQL 字符串拼接的真实注入路径。

本轮没有新增代码补洞需求。

扫描产物

本轮产物目录:

project-docs/qa-artifacts/v2-security-scan/2026-06-27T14-33-19

包含:

产物 说明
npm-audit.json 前端 npm 生产依赖审计结果
bandit-project.json Python 源码 Bandit 扫描结果
pip-audit-project.json .venv-project Python 依赖审计结果
scan-context.txt 扫描时间、工作目录、工具路径和项目依赖路径

同时已同步更新根目录项目级扫描结果:

  • bandit-project.json
  • pip-audit-project.json

执行命令

npm audit --omit=dev --audit-level=high --json

.\.venv-audit\Scripts\bandit.exe `
  -r yuqei-contract-platform\services\contract-api\src `
     yuqei-ai-platform\services\ai-platform-api\src `
     yuqei-ai-platform\services\worker\src `
     yuqei-ai-sdk-python\src `
  -f json `
  -o project-docs\qa-artifacts\v2-security-scan\2026-06-27T14-33-19\bandit-project.json

.\.venv-audit\Scripts\pip-audit.exe `
  --path .venv-project\Lib\site-packages `
  -f json `
  -o project-docs\qa-artifacts\v2-security-scan\2026-06-27T14-33-19\pip-audit-project.json `
  --progress-spinner off

结果明细

扫描项 结果
npm total vulnerabilities 0
npm high vulnerabilities 0
npm critical vulnerabilities 0
Bandit findings 0
Bandit high 0
Bandit medium 0
Bandit low 0
Bandit skipped tests 0
pip-audit dependencies 39
pip-audit vulnerabilities 0

SQL 动态拼接复核

重点复核文件:

  • yuqei-ai-platform/services/ai-platform-api/src/yuqei_ai_platform_api/repository.py
  • yuqei-contract-platform/services/contract-api/src/yuqei_contract_api/contracts.py

复核结论:

  1. AI 中台 pgvector 查询使用固定 SQL 常量:
    • PGVECTOR_CANDIDATE_SQL_64
    • PGVECTOR_CANDIDATE_SQL_64_FILTERED
    • PGVECTOR_CANDIDATE_SQL_GENERIC
    • PGVECTOR_CANDIDATE_SQL_GENERIC_FILTERED
  2. pgvector 查询参数走 SQLAlchemy text(...).bindparams(...) 与参数字典传入:
    • query_vector
    • query_dimension
    • knowledge_base_ids
    • limit
  3. knowledge_base_ids 使用 bindparam(..., expanding=True),没有手工拼接 IN (...)。
  4. 合同统一搜索使用 SQLAlchemy 表达式和 bindparam,用户输入的 keyword、item_type、status 没有进入 SQL 字符串拼接。
  5. literal_column("search_vector")、literal_column("embedding")、literal_column("0") 均为代码内固定列名/常量,不来自请求参数。
  6. text(f"ALTER TABLE ... {column_name} {column_type}") 仅用于启动期兼容列补齐,column_name 和 column_type 来自代码内固定字典或固定分支,不来自用户输入。

因此,本轮没有确认的 SQL 注入漏洞。

密钥痕迹复核

本轮继续排除了 .venv*、.runtime、node_modules 和扫描产物目录后检索明显密钥痕迹。

复核结果:

  • 文档中的远端密码示例仍为占位符,例如 YOUR_REMOTE_PASSWORD、YOUR_192_168_3_90_ROOT_PASSWORD。
  • 测试里的 test-key、embedding-key 属于测试夹具,不是生产密钥。
  • 运行时代码中的 api_key 字段是配置/接口字段名,未发现硬编码真实 token。

后续建议

  1. 后续涉及 SQL 性能优化时继续保持固定 SQL 模板加参数绑定,不恢复手写拼接。
  2. 生产上线前仍需在目标宿主机确认真实 secret 只存在于安全配置或 secret 管理中,不进入仓库、报告和日志。

CI 质量门接入

2026-06-27 已新增 GitHub Actions workflow:

/.github/workflows/security-quality-gate.yml

该 workflow 在 pull_request、main/master 分支 push 和手动触发时执行安全门禁:

  1. 创建 npm workspace 依赖环境并执行 npm audit --omit=dev --audit-level=high。
  2. 创建 .venv-project,安装 4 个 Python 项目包作为业务依赖审计目标。
  3. 创建独立 .venv-audit,固定安装 bandit==1.9.4 和 pip-audit==2.10.1。
  4. 执行 Bandit Python 源码扫描。
  5. 执行 .venv-project 的 pip-audit 依赖扫描。
  6. 三项扫描均会尽量跑完并上传 security-artifacts/,最后统一判定门禁是否通过。

验收标准:

  • npm 高危及以上漏洞为 0。
  • Bandit findings 为 0。
  • pip-audit known vulnerabilities 为 0。
  • CI 产物中包含 npm-audit.json、bandit-project.json、pip-audit-project.json。