CVE-2026-72700

Grav before 3.9.1 Timing Attack via Non-Constant-Time Token Comparison

Published Aug 25, 2026 CVSS 4.0 · 8.7 High EPSS < 1% KEV · Not listed
Description
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 hash_equals() 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.

Analysis

AI-generated

Technical impact

The Grav Composer plugin login implementation before version 3.9.1 compares password reset and account activation tokens with a simple string equality check that is not constant‑time. That leaves a distinguishable timing side channel that an attacker can use to infer the correct token. Exploiting this flaw could allow an adversary to recover a valid token for a known username, compromising the ability to reset a password or activate an account. The weakness is categorized as CWE‑208.

Affected Systems

The vulnerability affects the Grav CMS project, specifically the getgrav:grav-plugin-login Composer plugin shipped with Grav before version 3.9.1. Versions 3.9.1 and newer contain the patch that replaces the fragile comparison with a secure hash_equals() call.

Risk and Exploitability

The CVSS score for this issue is 8.7, indicating a high severity level. The EPSS score is not available, so the overall exploitation probability is uncertain, but the flaw is not listed in the CISA KEV catalog. The exploitation path uses the public token‑submission endpoint (taskReset) which is also unrate‑limited, so an attacker could send repeated guesses and measure response times to converge on a valid token. Vendors rate the practical exploitability as low and have not demonstrated a complete network‑level attack. Nonetheless, the presence of the timing side‑channel and lack of throttling means that a skilled attacker could potentially recover a token in a real attack scenario.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Grav to version 3.9.1 or later to replace the insecure token comparison with a constant‑time hash_equals() function.
  • Implement rate limiting or an account lockout policy on the token reset endpoint to reduce the effect of timing measurements.
  • If an upgrade cannot be performed immediately, consider disabling or limiting access to the token reset endpoint until the patch is applied.

Generated by OpenCVE AI on August 25, 2026 at 03:22 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories available
History
Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}

Type Values Removed Values Added
Description 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 hash_equals() 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.
Title Grav before 3.9.1 Timing Attack via Non-Constant-Time Token Comparison
First Time appeared Getgrav
Getgrav grav
Weaknesses CWE-208
CPEs cpe:2.3:a:getgrav:grav:*:*:*:*:*:*:*:*
Vendors & Products Getgrav
Getgrav grav
References
Metrics cvssV3_1

{'score': 7.5, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N'}

cvssV4_0

{'score': 8.7, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N'}

Weaknesses
  • CWE-208

    Observable Timing Discrepancy

Sources

Status
PUBLISHED
Assigner
VulnCheck
Published
Updated
Aug 25, 2026, 5:25 PM
Reserved
Aug 10, 2026, 1:02 PM
Status
Deferred
Published
Aug 25, 2026, 2:16 AM
Modified
Oct 12, 2026, 3:10 PM