CVE-2026-86260:hosp_order 密码找回验证缺失导致账户接管

摘要

sfturing/hosp_order 是一个医院订单类应用。其密码找回链路存在认证缺陷:匿名请求阶段将按邮箱查到的账户标识直接写入会话 userMSG,而密码修改阶段未重新校验验证码、旧密码或当前会话身份,直接信任该会话标识作为目标账户。由此,攻击者仅需知道受害者邮箱即可替换其密码并完成登录,实现无凭据账户接管。受影响版本范围与证据边界详见影响范围章节。

漏洞原理

正常密码找回流程应在允许修改密码之前验证请求者身份(如校验验证码)和/或确认旧凭据。该项目中 CommonUserController 的找回链路在匿名请求阶段将邮箱查询结果直接写入会话 userMSG,跳过了身份绑定。

匿名阶段写入账户标识

找回端点接收的邮箱为攻击者可控输入。服务器据此查询受害者账户,并将账户标识存入会话,未与任何已认证身份绑定。此时尚未校验验证码或旧密码,会话处于匿名状态。

密码修改阶段信任会话标识

密码修改处理调用 CommonUserService.modifyPassWord,以会话中的 userMSG 作为目标账户标识,未重新校验验证码、旧密码或当前会话用户身份。会话标识在匿名阶段建立,两个阶段之间不存在认证衔接。

失效的信任边界

匿名请求阶段确立账户标识,密码修改阶段将其当作权威身份消费,二者之间缺少认证桥梁。攻击者仅需提交受害者邮箱即可将任意账户标识植入会话,随后调用密码修改将其密码改为自选值,完成接管。

触发条件与攻击逻辑

攻击所需唯一受害者特定信息为邮箱地址;攻击者以匿名请求发起,无需任何特权、受害者密码、验证码或旧密码,亦无需受害者交互。部署侧仅需运行受影响版本且密码找回端点可被匿名访问。由于匿名找回阶段写入会话标识与密码修改阶段消费该标识之间无认证衔接,从植入标识到密码替换的过渡不依赖任何凭据校验。

核心伪代码

# anonymous recovery phase
email = controlled_input
account = lookup_by_email(email)
session.userMSG = account.id # no identity binding

# password modification phase
target = session.userMSG
# absent: verify_code(), verify_old_password(), verify_session_identity()
CommonUserService.modifyPassWord(target, new_password)
# authentication with new password succeeds → account takeover

模型中缺失的关键检查是:modifyPassWord 消费会话 userMSG 前未验证验证码、旧密码或当前会话身份是否与该标识绑定。

影响范围

维度 内容与证据边界
受影响版本 rolling release,受测提交 627f426 及之前历史版本(单一构建测试,未逐一验证)
运行时确认 在受测提交上成功修改密码并以新密码登录受害者账户
条件性推断 若目标账户具备管理权限,影响延伸至其可访问的业务功能(具体权限未测试)
未验证项 无确认修复版本;无 CVSS 评分;未探查业务权限、代码执行或主机接管
机制依据 基于报告的源码级分析,未进行独立全量源码审计

运行时影响仅确认至账户登录层面。条件性权限提升取决于目标账户实际权限,测试未涉及。源码级分析描述了缺失的校验逻辑,但不等同于全量审计结论。

修复与检测

修复应在密码修改这一信任边界处重建认证。建议在 modifyPassWord 路径强制校验验证码,并重新验证旧密码或当前会话用户身份,确保会话 userMSG 与已认证身份绑定;不应将匿名请求阶段设置的会话属性作为安全敏感操作的权威账户标识。上述为基于机制的修复建议,非厂商已验证指引;报告未提供厂商修复方案。检测方面,可审计未校验验证码或未认证会话触发的密码修改操作。此为基于机制推断的调查线索,需与正常密码重置流程关联以排除误报;报告未提供公开检测指引。

参考资料