CVE-2026-84306: Filament: Multi-factor authentication (app) codes can still be used after a newer code has been used
Filament is a collection of full-stack components for accelerated Laravel development. From 4.0.0 until 4.12.6 and 5.7.6, packages/panels/src/Auth/MultiFactor/App/AppAuthentication.php uses AppAuthentication::verifyCode() with a used-code cache key derived from both the app authentication secret and the submitted TOTP code. This isolates the newest accepted timestep by code instead of by secret, allowing a previously issued app-based MFA code to be accepted after a newer code has already been used. Reuse of the exact same code was already prevented, but another code inside the accepted time window remained usable. An attacker who obtains the target account's password and one app-based MFA code can use that code for the remainder of the configured window, which is approximately four minutes with the default settings, even after the legitimate account holder logs in with a newer code. Email-based MFA is not affected. This issue is fixed in versions 4.12.6 and 5.7.6.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
Filamentto a version that resolves this vulnerability.Fixed in 4.12.6 - Upgrade
Upgrade
Filamentto a version that resolves this vulnerability.Fixed in 5.7.6
Event History
Frequently Asked Questions
Who is exposed to this issue?
Deployments using Filament app-based MFA in affected releases are exposed. Email-based MFA is not affected.
What does an attacker need to exploit it?
An attacker needs the target account's password and one valid app-based MFA code. They can use that code for the remainder of the configured acceptance window even after the legitimate user has authenticated with a newer code.
Are default settings affected, and for how long can a captured code remain useful?
Yes. With the default settings, another code within the accepted window can remain usable for approximately four minutes; reuse of the exact same code is already prevented.
Which versions contain the fix?
The issue is fixed in Filament versions 4.12.6 and 5.7.6.