hapifhir BOPLA VULNs Report

下面是整理后的中文版规范漏洞报告(MDM / Bulk 操作相关),统一采用
1 风险分析,2 漏洞信息,3 核验细节,4 安全建议 结构,并仅保留最终判定为有效问题的 Issue 1(其余为非漏洞结论,做简要归档说明)。


Issue 1:/$mdm-link-history 分区/资源级读取约束缺失

1. 风险分析

该接口在返回历史 link 数据时,未执行分区与资源类型级别的访问控制约束,导致调用方在具备接口访问权限的情况下,可能读取超出自身授权范围的历史关联数据

在可枚举 ID 空间的情况下,攻击面将从单个资源扩展为整分区历史数据集泄露,可能触发高等级合规风险(如医疗数据场景下的隐私泄露)。


2. 漏洞信息

  • 接口: /$mdm-link-history

  • 问题类型:

    • (read, historicalLink.sourceResourceId)
    • (read, historicalLink.goldenResourceId)
    • (read, historicalLink.matchResult)
    • (read, historicalLink.revisionTimestamp)
  • 核心缺失:

    • 未执行 partition 级访问控制
    • 未执行 resourceType 级权限校验

3. 核验细节

入口阶段

  • MdmLinkHistoryProviderDstu3Plus.historyLinks

    • 仅校验参数格式
    • goldenResourceId / resourceId 直接传入 service 层

对比同类实现:

  • queryLinks

    • 会计算 readPartitionId
    • 注入 partitionIds
    • 对结果逐条执行 validateHasPartitionPermissions
  • 差异点:
    queryLinkHistory 完全跳过上述授权收敛逻辑


Sink 路径

  • MdmControllerSvcImpl.queryLinkHistory
    MdmLinkQuerySvcImplSvc.queryLinkHistory
    MdmLinkDaoSvc.findMdmLinkHistory

关键问题:

  • 未注入 partitionIds
  • 未执行结果级权限校验

生效点

  • BaseMdmProvider.parametersFromMdmLinkRevision

    • 将以下字段直接写入响应:

      • goldenResourceId
      • sourceResourceId
      • matchResult
      • revisionTimestamp
      • linkSource
      • score

这些字段最终构成 API 返回结果,成为实际数据泄露载体。


防线失效原因

  • 系统已有设计表明:

    • “接口可调用” ≠ “数据可全部读取”
  • queryLinks 已实现:

    • 分区限制 + 资源类型校验

history 路径未复用该模型,导致:

通用授权未向 sink 传播


4. 安全建议

/$mdm-link-history 链路中,强制复用与 queryLinks 一致的授权模型:

必须补充的控制点

  1. 查询前约束

    • 计算 readPartitionId
    • 注入 partitionIds 到 DAO 查询条件
  2. 结果级校验

    • 对每条记录执行:
      validateHasPartitionPermissions(resourceType)
  3. 拒绝策略

    • 不满足权限的记录不得返回(而非仅过滤字段)

设计原则

  • 不应将:

    “允许调用 $mdm-link-history

    等同于:

    “允许读取所有历史 link 数据”

posted @ 2026-05-06 13:48  Aibot  阅读(10)  评论(0)    收藏  举报