
FileRise 3.23.0 之前的版本将失败的 TOTP 验证尝试存储在 PHP 会话状态中。该计数器限制了单个会话内的尝试次数,但不会跨新建会话持久化。
已经拥有目标账户有效主凭据的攻击者可以重新启动登录流程,获得新的待登录会话,并恢复 TOTP 尝试额度。重复此过程即可在预期的五次尝试限制之外继续进行在线 TOTP 猜测。
TOTP 验证流程将失败计数器保存在 $_SESSION 中。在五次失败提交后,该会话中的进一步尝试会返回 HTTP 429。
然而,在新会话中成功完成主认证会创建新的待登录状态,并带有新的 TOTP 失败计数器。因此,先前账户的 TOTP 失败记录不会被延续。
该问题还影响另一个未强制执行相同持久限制的待登录 TOTP 处理器。因此,修复措施被集中应用于所有待登录 TOTP 验证路径。
此问题被归类为 CWE-307:对过度认证尝试的限制不当。
利用该漏洞需要拥有目标账户的有效主凭据,例如通过凭据重用、钓鱼或其他方式泄露获得的密码。
该漏洞不会泄露凭据,也不会立即绕过 TOTP。它允许在缺乏账户级持久限制的情况下继续进行自动化 TOTP 猜测。一次成功的猜测会以受影响账户的权限完成认证,可能包括管理员权限。
未启用 TOTP 的账户不受此特定第二因素速率限制问题的影响。
FileRise 3.23.0 引入了集中式持久 TOTP 尝试限制:
现有账户、TOTP 密钥、会话、Docker 安装和部署配置无需迁移。
用户应升级到 FileRise 3.23.0 或更高版本。
感谢负责任的披露和详细的复现步骤。
我们审查了 TOTP 验证工作流并确认了底层问题。失败的 TOTP 提交仅受主前端验证端点中的 PHP 会话计数器限制。因此,在新会话中重复成功的主认证步骤可以恢复第二因素尝试额度。我们的审查还发现另一个待登录 TOTP 处理器未应用相同的尝试计数器,因此修复措施已集中应用于各验证路径,而不仅仅是所报告的端点。
该修复已在 FileRise v3.23.0 中实现:
账户限制为 15 分钟窗口内五次尝试。来源级限制有意设置为同一窗口内 50 次尝试,以减少共享网络的误报。现有账户、TOTP 密钥、会话、Docker 安装和部署配置无需迁移。
致谢:Pervin Zahidli (@ech0void ) 参考:https://github.com/error311/FileRise/security/advisories/GHSA-4hfj-6478-5cv7