a3bb78e06b
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Failing after 16m35s
4.9 KiB
4.9 KiB
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.jsonpip-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.pyyuqei-contract-platform/services/contract-api/src/yuqei_contract_api/contracts.py
复核结论:
- AI 中台 pgvector 查询使用固定 SQL 常量:
PGVECTOR_CANDIDATE_SQL_64PGVECTOR_CANDIDATE_SQL_64_FILTEREDPGVECTOR_CANDIDATE_SQL_GENERICPGVECTOR_CANDIDATE_SQL_GENERIC_FILTERED
- pgvector 查询参数走 SQLAlchemy
text(...).bindparams(...)与参数字典传入:query_vectorquery_dimensionknowledge_base_idslimit
knowledge_base_ids使用bindparam(..., expanding=True),没有手工拼接IN (...)。- 合同统一搜索使用 SQLAlchemy 表达式和
bindparam,用户输入的keyword、item_type、status没有进入 SQL 字符串拼接。 literal_column("search_vector")、literal_column("embedding")、literal_column("0")均为代码内固定列名/常量,不来自请求参数。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。
后续建议
- 后续涉及 SQL 性能优化时继续保持固定 SQL 模板加参数绑定,不恢复手写拼接。
- 生产上线前仍需在目标宿主机确认真实 secret 只存在于安全配置或 secret 管理中,不进入仓库、报告和日志。
CI 质量门接入
2026-06-27 已新增 GitHub Actions workflow:
/.github/workflows/security-quality-gate.yml
该 workflow 在 pull_request、main/master 分支 push 和手动触发时执行安全门禁:
- 创建 npm workspace 依赖环境并执行
npm audit --omit=dev --audit-level=high。 - 创建
.venv-project,安装 4 个 Python 项目包作为业务依赖审计目标。 - 创建独立
.venv-audit,固定安装bandit==1.9.4和pip-audit==2.10.1。 - 执行 Bandit Python 源码扫描。
- 执行
.venv-project的pip-audit依赖扫描。 - 三项扫描均会尽量跑完并上传
security-artifacts/,最后统一判定门禁是否通过。
验收标准:
- npm 高危及以上漏洞为 0。
- Bandit findings 为 0。
- pip-audit known vulnerabilities 为 0。
- CI 产物中包含
npm-audit.json、bandit-project.json、pip-audit-project.json。