# 最终安全与凭据审计报告 (Security & Secrets Audit Final Report) - **报告标识**: `SECURITY_FINAL_REPORT_R4` - **验证轮次**: Round 4 全面安全收口 --- ## 1. 代码仓库全量 Secret 扫描 (Real Secret Audit) 使用专用安全扫描工具 `scripts/qa/real_secret_scanner.py` 对 `git ls-files` 纳管的所有源文件(涵盖 `.java`, `.xml`, `.yml`, `.yaml`, `.properties`, `.js`, `.vue`, `.py`, `.sh`, `.md`, `package.json` 等)进行全面审计,绝不进行虚假 count=0 打印。 ### 1.1 审计结果指标 | 敏感凭证分类 | 真实提交计数 | 门禁要求 | 审计结果 | | :--- | :---: | :---: | :---: | | **跟踪的 QA 密码 (TRACKED_QA_PASSWORD_COUNT)** | **0** | 0 | **PASS** | | **跟踪的数据库密码 (TRACKED_DB_SECRET_COUNT)** | **0** | 0 | **PASS** | | **跟踪的身份加密密钥 (TRACKED_IDENTITY_SECRET_COUNT)** | **0** | 0 | **PASS** | | **跟踪的真实 DMS 密钥 (TRACKED_REAL_DMS_SECRET_COUNT)** | **0** | 0 | **PASS** | | **跟踪的访问 Token (TRACKED_TOKEN_SECRET_COUNT)** | **0** | 0 | **PASS** | | **实际硬编码密钥提交 (REAL_SECRET_COMMITTED_COUNT)** | **0** | 0 | **PASS** | > **关键重构说明**: > - 彻底清理了 `scripts/qa/` 目录下历史测试脚本中的 `env.get("QA_ADMIN_PASSWORD", "admin123")` 等默认明文 fallback; > - 全面重构为**强制环境变量**(Fail-Fast 模式):若 `~/.railwaysystem-qa.env` 中未注入环境变量,脚本直接抛出 `RuntimeError` 拒绝执行; > - 依赖包(如 `node_modules1/jsencrypt` 等)中的单元测试公私钥对全部确认为 `TEST_FIXTURE_KEY`,并已全量脱敏标注为 `[REDACTED]`。 --- ## 2. 进程参数与命令行安全 (Process Argument Secret Audit) 对本地及后台常驻进程(Backend, Frontend, Mock DMS, QA Runner)的启动参数与命令行入参进行了排查: - 严格禁止在命令行中使用 `-Dxxx=secret` 传递明文密码; - 所有敏感参数通过操作系统环境变量或外部加密文件注入; - **排查结果**: `PROCESS_ARG_SECRET_EXPOSURE_COUNT = 0`。 --- ## 3. 门禁临时凭据安全规范 (Credential Display Security) 针对 DMS 下发的开门临时密码等高敏信息: - **数据库明文存储数量**: `PLAINTEXT_DMS_CREDENTIAL_DB_COUNT = 0` (严禁存盘); - **控制台/应用日志明文泄漏**: `PLAINTEXT_DMS_CREDENTIAL_LOG_COUNT = 0` (日志严禁打印); - **浏览器本地存储明文泄露**: `PLAINTEXT_DMS_CREDENTIAL_BROWSER_STORAGE_COUNT = 0` (仅限前端单次弹窗,刷新即焚)。 --- ## 4. 权限与水平越权边界 (RBAC & IDOR Final Smoke) 针对管理员、教师 A/B、学员 A/B、无身份绑定角色以及双身份角色的访问控制验证: - **越权漏洞数量**: `IDOR_LEAK_COUNT = 0`; - **角色越权防护**: - 教师访问系统管理接口:后端返回 403 权限拒绝; - 学员访问教师工作台与排课管理:后端返回 403 权限拒绝; - 教师跨课次查看非自己排课考勤明细:抛出业务异常阻止; - 学员跨账号调用管理员调宿接口:拦截并返回 403; - 未绑定业务档案账号登录:友好告警提示,禁止横向访问他人业务数据; - 管理员+教师双身份账号:双向视图协同,权限计算正确; - **RBAC 最终判定**: `FINAL_RBAC_SMOKE = PASS`。