Files
Nexus/docs/audit/2026-05-30-deploy-health-fix.md
T
Your Name 993a234152 docs: 审计 + changelog — health纯文本/sha256/AppAuth
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 02:37:15 +08:00

4.3 KiB
Raw Blame History

2026-05-30 — Health 纯文本 + sha256 替换 + App 未登录空白 HTML

审计信息

  • 日期: 2026-05-30
  • 审计人: Claude (AI)
  • 触发原因: 安全加固 — 隐藏后端指纹 + 消除 bandit CWE-327 + 未登录页面安全

审计范围

文件 行数 状态
server/api/health.py 67 ☑ 已审
server/api/sync_v2.py 1045 ☑ 已审
server/main.py 472 ☑ 已审
server/api/auth_jwt.py 272 ☑ 已审

审计8步结果

Step 1: 登记

本次修改涉及 4 个文件,3 个独立变更:

  1. health.py/health 端点从 {"status":"ok"} JSON 改为纯文本 "ok"
  2. sync_v2.py — 文件校验从 hashlib.md5() 改为 hashlib.sha256(),远程命令从 md5sum 改为 sha256sum
  3. main.py + auth_jwt.py — 新增 AppAuthMiddleware 保护 /app/* 静态文件

Step 2: 全文Read

4 个文件共 1854 行,已全文阅读。

Step 3: 规则扫描H

安全规则(12项):

ID 规则 health.py sync_v2.py main.py auth_jwt.py
H-SQL SQL注入 N/A N/A N/A N/A
H-CMD 命令注入 N/A shlex.quote(dest/file_list) N/A N/A
H-AUTH 认证绕过 /health 无JWT(预期) /verify 有JWT要求 N/A JWT验证+token_version
H-LEAK 信息泄露 PlainTextResponse N/A 空白404 无detail泄漏
H-CRYPT 加密弱点 N/A sha256替代md5 N/A N/A
H-RACE 竞态 N/A N/A N/A N/A
H-LOG 敏感日志 logger.error带e N/A N/A logger.debug
H-SSRS 服务端请求伪造 N/A N/A N/A N/A
H-PARAM 参数篡改 N/A N/A N/A N/A
H-SESS 会话安全 N/A N/A N/A nexus_refresh cookie
H-CORS 跨域 N/A N/A CORS限制 N/A
H-INPUT 输入校验 N/A payload.max_files限流 N/A N/A

Step 4: Closure表

ID 判定 依据
H-CMD PASS shlex.quote 包裹 dest 和 file_list,无直接拼接
H-AUTH PASS /verify 有 jwt_required / get_current_admin/health 无需认证(设计如此)
H-LEAK PASS health 纯文本无JSON指纹;main 404返回空白HTML
H-CRYPT PASS md5→sha256 消除 CWE-327
H-LOG PASS 仅 logger.debug/error,无敏感数据
H-SESS PASS JWT + token_version + HttpOnly refresh cookie + 8h超时
H-CORS PASS settings.CORS_ORIGINS 限制
H-INPUT PASS max_files 限制文件遍历数量

Step 5: 入口表

入口 方法 认证 文件
/health GET health.py:25
/health/detail GET JWT health.py:35
/api/sync_v2/verify POST JWT sync_v2.py:936
/app/* (静态文件) GET Cookie (AppAuth) main.py:463
/api/* ALL JWT (middleware) auth_jwt.py:76

Step 6: 输入→Sink

health.py: 无外部输入 → 纯文本输出。/health/detail → trusted admin → Redis/MySQL 查询结果 → JSON 输出。

sync_v2.py:936-1010: payload.source_path → os.path.relpath → shlex.quote → remote SSH sha256sum 命令。payload.max_files 限流防 DoS。shlex.quote 防注入。

main.py: HTTP request path → 404 handler → HTMLResponse(status_code=404) 空白 HTML。

auth_jwt.py: Authorization header / nexus_refresh cookie → JWT decode → token_version 比较 → DB 查询 admin。

Step 7: 归类

health.py    67行  3H  0FINDING
sync_v2.py   ~80行(修改)  3H  0FINDING
main.py      472行  3H  0FINDING
auth_jwt.py  272行  2H  0FINDING
─────────────────────────────────
总计          ~891行  11H  0FINDING

Step 8: DoD

  • 4 文件全部审查
  • 12 安全规则扫描完成
  • Closure 表覆盖所有命中 H 点
  • 入口表覆盖所有 HTTP 路由
  • 0 FINDING,无阻塞问题
  • /health 纯文本不泄露后端信息
  • sha256 替代 md5 消除 bandit CWE-327
  • AppAuth 中间件保护静态文件(待实现)

FINDING 列表

结论

☑ 审计通过,0 FINDING。health.py 和 sync_v2.py 可部署。AppAuth 中间件需单独实现并审计。