快速结论:这是 Dify 密码重置流程中已知的安全漏洞,攻击者可在知晓目标邮箱的前提下,通过两个独立接口依次完成取 token 和重置密码,实现任意账户接管。它影响的不只是某个报错,而是整套密码找回链路,建议优先停止使用旧的 /console/api/forgot-password 流程,并升级到包含密码重置安全修复的版本。
适用环境:Issue 中明确说明影响“all versions of Dify”,同时标注为 Cloud 和 Self Hosted 均受影响;具体 Python、CUDA、显卡等运行环境在该 Issue 中未涉及,不做猜测。
最快修复方案:暂无确认的一步修复方案;可优先尝试将 Dify 升级到包含密码重置安全修复的最新 Release,并同步检查 api/controllers/console/auth/forgot_password.py 中是否已按“token + code 单次校验”方式重写接口。
注意事项:Issue 关闭时并未附上具体的修复 commit 或新版本号,也未给出可直接应用的补丁;以下“一次性校验 token 与 code”是报告中提出的修复方向,并不等于该修复已经合入某个具体版本。如果你在自建环境,应把该接口改成内部不可直接访问,并增加风控后再升级验证。
问题场景
用户在使用 Dify 的“忘记密码/找回密码”功能时触发。攻击者只要知道某个已存在账号的邮箱,就可以在 /console/api/forgot-password 获取密码重置 token,再通过 /console/api/forgot-password/resets 直接重置该用户密码,无需拿到原邮箱验证码,最终导致任意账户接管。该问题不依赖特定节点、模型或 WebUI 操作,而是在调用控制台 auth 接口时暴露。
报错原文
Password Reset Vulnerability Allows Arbitrary Account Takeover in All Versions of Dify
Vulnerability Location:
api/controllers/console/auth/forgot_password.py
Impact:
This allows attackers to arbitrarily reset the password of any account if the account exists, leading to potential account takeover.
Step1: get token via /console/api/forgot-password
Step2: reset password via /console/api/forgot-password/resets
原因分析
问题出在 Dify 的密码重置接口设计上:系统先通过一个接口校验并发放 token,随后第二个接口只凭 token 就能直接设置新密码。整个流程没有把“校验验证码/身份”和“写入新密码”合并到一个带强校验的请求中,导致知道账号邮箱的攻击者可以绕过邮箱验证码完成接管。可能原因还包括:token 缺少一次性使用限制、token 未绑定设备/IP、缺少请求频率限制与异常监控,以及重置成功后的通知不足。Issue 中建议将 token 与 code 放在同一个设置密码请求内完成校验。
环境排查
- 确认 Dify 版本:此漏洞不区分版本,Issue 标注为 all versions,Cloud 与 Self Hosted 均受影响。
- 检查受影响路由:确认控制台 auth 路由涉及 /console/api/forgot-password 与 /console/api/forgot-password/resets。
- 排查文件:检查 api/controllers/console/auth/forgot_password.py 中是否仍然存在“先发给 token、再用另一接口重置密码”的两段式实现。
- 确认部署方式与反向代理:如果你在自建环境,需额外确认运维侧是否已对该路径增加访问限制与告警。
解决步骤
- 先停止依赖旧密码重置流程的公开入口,避免漏洞被外部直接利用。
- 将 Dify 升级到包含安全修复的最新版本;Issue 未给出具体修复版本号,请以官方 Release 与安全公告为准。
- 检查升级后的 forgot_password.py 是否已将 token 校验与 code 校验合并到“设置新密码”的单次请求中;如果仍是两段式接口,应视为未完成修复。
- 为密码重置接口补充频率限制与风控策略,对同一邮箱或同一 IP 的重复请求进行拦截。
- 为密码重置流程增加日志与告警,并向账号邮箱发送重置通知,让用户在收到异常重置请求时可及时察觉。
- 确保 token 在首次使用后立即失效,并设置明确的过期时间,防止 token 被重放或二次利用。
验证方法
用两个不同测试账号分别验证:对一个已知邮箱发起 /console/api/forgot-password 拿到 token,然后尝试只用该 token 调用 /console/api/forgot-password/resets 重置密码。如果修复生效,该请求应被拒绝或要求额外携带正确的邮箱验证码;同时应检查两次相同请求能否走通、token 是否还能复用。此外,确认目标邮箱会收到密码重置成功或异常通知邮件。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


