2. 医疗App数据生命周期与威胁建模

医疗App的数据安全不是“加个HTTPS、做个登录”就能解决的问题。同一条血压记录,在采集时可能来自蓝牙设备、在传输时经过公网、在存储时落到本地SQLite或云端对象存储、在使用时被推送给医生、在共享时流向第三方健康平台、在销毁时又可能残留在备份与日志中。每个阶段的资产形态、信任边界和攻击者能力都不同,因此需要按生命周期逐段分析,再用威胁建模方法把“可能出什么事”结构化。

一、六阶段数据生命周期与典型风险

采集阶段的风险集中在来源可信与授权边界。例如App读取用户手动输入的用药记录、通过蓝牙血糖仪获取读数、调用系统健康数据接口读取步数。若未校验设备身份,攻击者可用伪造的BLE外设注入错误血糖值;若权限申请过宽,可能顺带读取与业务无关的通讯录。采集还应明确“最小必要”:一个记录经期的小程序不应索取精确定位。

传输阶段的核心是机密性与完整性。移动端到服务端应使用TLS 1.2以上,并启用证书校验;若客户端关闭证书校验或信任用户安装的根证书,中间人即可解密。对于蓝牙传输,应使用配对加密并校验设备绑定关系。此外,传输元数据(如请求时间、IP、设备型号)本身也可能泄露就诊行为。

存储阶段要区分本地与服务端。本地常见风险包括:数据库明文、日志打印敏感字段、截图缓存、备份到iCloud/Google Drive未加密。服务端则涉及数据库访问控制、字段级加密、密钥管理。例如身份证号、基因数据等敏感字段应使用信封加密,密钥与数据分离存放。

使用阶段的风险来自内部越权与二次利用。医生、客服、运维人员可能超出职责范围查询患者数据;数据分析任务可能把可识别信息带入测试环境。应实施基于角色的访问控制与字段脱敏,并对批量导出、异常时段访问进行审计。

共享阶段涉及第三方SDK、科研合作、保险或广告平台。风险包括未获单独同意、共享范围超出约定、接收方二次转售。共享前应做去标识化,并签订数据处理协议,明确用途、留存期限与删除义务。

销毁阶段最容易被忽视。删除App不等于删除服务端数据;数据库逻辑删除后备份仍可能存在;日志、CDN缓存、消息队列中的副本也可能长期留存。应建立数据保留策略,到期后对主库、备份、日志执行可验证的物理或加密擦除。

医疗App数据生命周期 · 阶段风险与攻击面 采集 手动/设备/系统接口 传输 TLS / BLE / 元数据 存储 本地库/云端/备份 使用 访问/分析/展示 共享 SDK/科研/第三方 销毁 擦除/到期 采集风险 • 伪造BLE设备注入 • 权限过度索取 • 未获单独同意 • 输入未校验 传输风险 • 关闭证书校验 • 中间人窃听 • 降级到HTTP • 元数据泄露 存储风险 • 本地库明文 • 日志打印敏感 • 备份未加密 • 密钥与数据同存 使用风险 • 内部越权查询 • 测试环境带真数据 • 批量导出无审计 • 屏幕截图泄露 共享风险 • SDK超范围采集 • 未去标识化 • 接收方二次转售 • 无删除约束 销毁 • 逻辑删除 • 备份残留 • 日志留存 • 缓存副本 STRIDE · 面向安全属性 Spoofing 仿冒 → 身份认证 Tampering 篡改 → 完整性校验 Repudiation 抵赖 → 审计日志 Info Disclosure 泄露 → 加密脱敏 DoS 拒绝服务 → 限流降级 Elevation 提权 → 最小权限 LINDDUN · 面向隐私 Linking 关联 → 去标识化 Identifying 识别 → 假名化 Non-repudiation 不可否认 → 可否认机制 Detecting 可检测 → 隐蔽传输 Disclosure 披露 → 最小化收集 Unawareness 无感知 → 透明告知 Non-compliance 不合规 → 合规审计 攻击面① 攻击面② 攻击面③ 攻击面④ 攻击面⑤ ⑥

二、STRIDE与LINDDUN:两种互补的威胁建模视角

STRIDE由微软提出,关注系统安全属性,适合分析“系统会不会被攻破”。它把威胁分为六类:仿冒、篡改、抵赖、信息泄露、拒绝服务、权限提升。在医疗App中,仿冒可能表现为伪造医生账号登录;篡改可能是修改检验报告数值;抵赖可能发生在医生否认开过某张处方;信息泄露对应患者数据外泄;拒绝服务可能让挂号或急救通道不可用;权限提升则可能是普通用户通过接口漏洞读取他人病历。

LINDDUN则专门面向隐私,关注“个人数据会不会被不当关联或披露”。它包含关联、识别、不可否认、可检测、披露、无感知、不合规七类。例如,同一设备ID在多个健康App间被关联,可能推断出用户患有某种慢性病;用户不知道自己的数据被用于训练模型,属于“无感知”;未按法规取得单独同意,属于“不合规”。

实践中,两者应结合使用:先用STRIDE梳理系统组件与信任边界,再用LINDDUN检查每个数据流是否满足隐私原则。例如,对“上传血糖记录到云端”这一数据流,STRIDE会问“传输是否可被篡改”,LINDDUN会问“云端是否会将记录与用户身份长期绑定”。

三、典型攻击面识别与建模落地

攻击面是攻击者可以尝试交互的入口集合。医疗App常见攻击面包括:移动端本地存储、网络接口、蓝牙/WiFi外设、第三方SDK、推送通道、后台管理端、云存储桶、日志与监控系统。识别时可按“入口—资产—信任边界”三步走:先列出所有入口,再标注每个入口能触达的数据资产,最后画出信任边界,明确哪些区域之间需要认证与加密。

下面给出一份可直接用于评审的威胁建模工作表示例,以“血糖记录上传”数据流为例:

数据流STRIDE威胁LINDDUN威胁缓解措施
血糖仪→App(BLE) 仿冒设备、篡改读数 可检测(蓝牙广播被嗅探) 配对绑定、校验设备证书、读数范围校验
App→API网关(HTTPS) 信息泄露、拒绝服务 关联(IP+设备ID) TLS1.3、证书固定、限流、IP脱敏
API→数据库 权限提升、篡改 披露(运维可见明文) 字段级加密、RBAC、审计日志
数据库→分析平台 信息泄露 识别、关联 去标识化、差分隐私、用途限制
分析平台→第三方科研 抵赖 不合规、无感知 单独同意、数据处理协议、到期删除
建模不是一次性文档。每次新增SDK、开放接口、变更数据用途,都应回到数据流图更新威胁清单,并确认缓解措施仍然有效。

最后需要强调:威胁建模的产出不是一张漂亮的图,而是一组可验证的安全需求。例如“传输必须启用证书固定”应转化为测试用例:使用代理工具尝试中间人,若App拒绝连接则通过;“日志不得出现手机号”应转化为代码扫描规则。只有把威胁落到可测试、可审计的控制点,生命周期安全才真正闭环。