PR REVIEW EVIDENCE

feat(entity-log): 公司旧备份实体日志接入在线查询(禅道 #3442)

hemo-backend #1382

  1. PR 提交时间2026-10-09 16:13:18
  2. 审核结束时间2026-10-09 17:41:52
  3. 固定版本d80cb0d9e30b
  4. 模型链gpt-5.6-terra → gpt-5.6-sol
  5. 门禁stale
  6. 结果success

难度分

85
  • code_volume82新增离线导入命令、路由模型与映射、迁移脚本、运维脚本及多组测试,变更量较大。
  • architecture_complexity87同时涉及热数据、归档对象、对象存储、分页游标、离线导入和 Spring/MyBatis 装配。
  • domain_knowledge88需要理解透析业务审计日志、机构可见性、历史归档与恢复的数据一致性要求。
  • impact_scope78影响实体日志查询、排班修改记录、历史数据导入和受控运维流程。
  • risk_level89处理历史审计数据、对象存储凭证和 root 运维脚本,错误可能影响数据追溯、访问隔离与系统安全。

完成分

82
  • correctness60最终风险固定扣分:medium 2×20;合计 -40
  • completeness100本次静态审核未发现该维度的确认问题;不代表绝对完善
  • code_quality100本次静态审核未发现该维度的确认问题;不代表绝对完善
  • security60最终风险固定扣分:high 1×40;合计 -40
  • details100本次静态审核未发现该维度的确认问题;不代表绝对完善

固定范围

目标分支 SHA
f5e51f9cd2fcacd4a376708fadd694af078d90fe
共同祖先 SHA
d634fbd39fb172de16835ee40f12e7597e97e7a8
PR head SHA
d80cb0d9e30bead1a177a2cd86ff17a7b75631c5
轻量检查
passed · 轻量检查通过

风险与证据

high · 已确认 · 已计入完成分

可替换已校验 SDK 目录以 root 身份执行代码

在 SDK 父目录可被低权限账号修改的部署环境中,攻击者可在备份任务运行期间替换已校验的 SDK 路径,并以 root 身份执行恶意代码,从而获取备份凭证或篡改历史日志备份与恢复结果。

证据:scripts/ops/legacy_entity_log_oss_pilot.py:57 if os.geteuid() == 0: for path in [root] + list(root.rglob('*')): st = path.lstat() if st.st_uid != 0 or st.st_mode & 0o022: raise RuntimeError('SDK_DIRECTORY_NOT_ROOT_ONLY')

建议:校验 SDK 路径的所有父目录均由 root 独占且不可被其他用户写入,并消除摘要校验与模块加载之间的路径替换窗口,例如将已校验内容复制到新建的 root 专用目录后再加载。

medium · 已确认 · 已计入完成分

排班修改记录会将旧备份日志标记为 CURRENT

使用排班修改记录的人员可能把旧备份日志误认为当前系统日志,无法正确判断记录来源和历史上下文,影响排班变更追溯。

证据:src/main/java/com/data/hemodialysis/model/response/EntityUpdateLogSearchItem.java:48 return from(row, "CURRENT");

建议:在排班查询链路中保留并传递旧日志来源,或让排班接口使用不包含来源字段的独立响应模型,避免把旧日志默认标为 CURRENT。

medium · 已确认 · 已计入完成分

旧库来源标签可重复,响应唯一标识会冲突

两个旧备份来源存在相同日志 ID 且使用相同展示标签时,客户端按“来源加 ID”识别记录会发生冲突,可能造成记录混淆、覆盖或无法区分来源。

证据:src/main/resources/sql/migration/2026-10-09-entity-update-log-legacy-route.sql:10 source_code VARCHAR(128) NOT NULL, source_server_uuid CHAR(36) NOT NULL, source_database VARCHAR(64) NOT NULL, source_label VARCHAR(32) NOT NULL,

建议:为对外返回的来源标识提供全局唯一且稳定的约束或发布前校验;若展示标签允许复用,应另行返回不暴露敏感信息的唯一来源键供客户端与日志 ID 组合使用。