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-
将以下字段直接写入响应:
goldenResourceIdsourceResourceIdmatchResultrevisionTimestamplinkSourcescore
-
这些字段最终构成 API 返回结果,成为实际数据泄露载体。
防线失效原因
-
系统已有设计表明:
- “接口可调用” ≠ “数据可全部读取”
-
queryLinks已实现:- 分区限制 + 资源类型校验
但 history 路径未复用该模型,导致:
通用授权未向 sink 传播
4. 安全建议
在 /$mdm-link-history 链路中,强制复用与 queryLinks 一致的授权模型:
必须补充的控制点
-
查询前约束
- 计算
readPartitionId - 注入
partitionIds到 DAO 查询条件
- 计算
-
结果级校验
- 对每条记录执行:
validateHasPartitionPermissions(resourceType)
- 对每条记录执行:
-
拒绝策略
- 不满足权限的记录不得返回(而非仅过滤字段)
设计原则
-
不应将:
“允许调用
$mdm-link-history”等同于:
“允许读取所有历史 link 数据”

浙公网安备 33010602011771号