CVE-2026-72700: Grav before 3.9.1 Timing Attack via Non-Constant-Time Token Comparison
The getgrav/grav-plugin-login Composer plugin before 3.9.1 (used by Grav) compares password reset and account activation tokens using a non-constant-time === string comparison instead of hashequals() in classes/Controller.php (taskReset()) and login.php (activation handler). Because the token-submission endpoint (taskReset) also lacks rate limiting, an attacker could in principle send repeated token guesses against a known username and use the timing differences to attempt to recover a valid token, though the vendor rates the practical exploitability as low and no end-to-end network exploit has been demonstrated.
Affected Software
Event History
Frequently Asked Questions
What conditions would an attacker need to exploit this issue?
An attacker would need a known username and the ability to repeatedly submit password-reset token guesses to the taskReset endpoint. Exploitation relies on measuring timing differences from token comparisons to try to recover a valid token.
Is this known to be practically exploitable over the network?
The vendor rates practical exploitability as low, and no end-to-end network exploit has been demonstrated. The issue is nevertheless network-reachable and requires no authenticated access or user interaction according to the provided vector.
What makes repeated guessing feasible in the affected reset flow?
The taskReset token-submission endpoint lacks rate limiting. This permits repeated token guesses, which are needed to attempt a timing-based recovery attack.
How can I determine whether my deployment is affected?
Check whether Grav uses the composer/getgrav/grav-plugin-login plugin before version 3.9.1. Affected code paths are the password-reset handler in classes/Controller.php (taskReset()) and the account-activation handler in login.php.