Skip to main content

Grav Login Plugin EUVDEUVD-2026-87761

| CVE-2026-100667 MEDIUM
Missing Critical Step in Authentication (CWE-304)
2026-09-26 VulnCheck GHSA-r29m-xqx4-rwgf
6.9
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain member's password
  2. Delivery
    Submit password, halt at 2FA prompt
  3. Exploit
    Session flagged as authenticated
  4. Execution
    Request authenticated()-gated content
  5. Impact
    Read member-only content

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Critical step enforcement
Exploitation Conditions

Requires (1) a Grav site running grav-plugin-login 3.8.7-3.9.6 with two-factor authentication enabled, (2) content gated specifically by the no-argument authenticated() Twig function, the group form authenticated(null, 'group'), or the [authenticated] shortcode (the inverse [guest] shortcode is likewise mis-evaluated), and (3) the attacker must already know a target member's password - the whole point is bypassing only the second factor. Limiting factors: exploitation yields no completed session and cannot reach access:-rule-protected pages or let the attacker act as the user; the authenticated('some.permission') form via UserObject::authorize() is not affected; impact is confined to disclosure of that gated content.

Impact

This is a genuine but low-severity flaw. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N = 6.9) marks it network-reachable, low-complexity, and nominally unauthenticated, but that PR:N is misleading in practice: the description states the attacker must already know a valid member's password - they simply cannot answer the second factor. So real-world exploitation is gated by prior credential compromise, which is a meaningful barrier the score does not capture. Impact is strictly confidentiality-limited (VC:L): the attacker reads content gated by the no-argument authenticated() Twig function / [authenticated] shortcode, but obtains no completed session, cannot reach access:-rule-protected pages, and cannot act as the user. There is no integrity or availability impact, and the authenticated('some.permission') form routed through UserObject::authorize() is unaffected. No EPSS score, no CISA KEV listing, and no POC are present in the input - consistent with a niche CMS plugin flaw of limited blast radius. Signals align rather than conflict: modest CVSS, no exploitation evidence, narrow impact. This is a patch-in-normal-cycle issue, not an emergency; the PR:N vs. password-precondition tension is the main caveat to verify.

Exploit ScenarioDerived

An attacker who has already obtained a Grav member's password (e.g., via phishing or reuse) submits it to a 2FA-enabled Grav site and stops at the 2FA code prompt without answering it. Because Login::isAuthenticated() only checked the password-step session flag, that half-completed session is treated as authenticated, letting the attacker load pages whose content is gated by authenticated() or [authenticated] and read member-only material. No public exploit code is identified at time of analysis.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 26, 2026

A two-factor authentication bypass in the Grav Login plugin (grav-plugin-login) versions 3.8.7 through 3.9.6 allows a remote attacker who already knows a member's password to read content that the site gates behind the no-argument authenticated() Twig function, the group form authenticated(null, 'group'), or the [authenticated] shortcode, because Login::isAuthenticated() checked only the session flag showing the password step had succeeded rather than the flag showing login had fully completed. The flaw (CWE-304, missing critical step in authentication) does not grant a completed session: the attacker cannot reach pages protected by an access: rule, cannot act as the member, and cannot use the permission-based authenticated('some.permission') form, so impact is confined to disclosure of that gated content. No public exploit code was identified at time of analysis and the issue is not confirmed actively exploited (not in CISA KEV), though the vendor has released a fix in 3.9.7.

RemediationAI

Vendor-released patch: grav-plugin-login 3.9.7 - upgrade the Login plugin from any 3.8.7-3.9.6 release to 3.9.7 as the primary fix, for example via the Grav Package Manager (bin/gpm update login or the Admin plugin's update mechanism) or by the equivalent Composer update, then confirm the installed plugin version is 3.9.7 or later. Review the vendor advisory at https://github.com/getgrav/grav/security/advisories/GHSA-636m-8598-45r9 for any accompanying guidance. Where immediate upgrading is not possible, the most effective compensating control is to stop relying on the flag-only gating forms: replace no-argument authenticated() calls, authenticated(null, 'group') calls, and [authenticated]/[guest] shortcodes in Twig templates with the permission-based authenticated('some.permission') form, which routes through UserObject::authorize() and is not affected - the trade-off is that this requires defining and assigning suitable permissions to the intended audience groups and editing every affected template. Alternatively, protect sensitive pages with access: rules rather than the vulnerable shortcodes/Twig forms; this changes the site's gating model and must be tested to ensure legitimate members retain access. Disabling two-factor authentication is not an acceptable workaround because it removes the very control being bypassed, and restricting network access to the site does not address the underlying flaw. Since exploitation still requires knowledge of a valid member password, enforcing strong, unique member passwords and credential-reuse monitoring reduces the practical attack surface while patching proceeds, but this is a risk-reduction measure only and not a substitute for upgrading to 3.9.7.

Affected VersionsENISA

grav 3.8.7 <3.9.7

Affected Packages

euvd grav fix: 3.9.7

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The Grav CMS Login plugin implements the site's front-end authentication flow, including the second-factor challenge. In the affected range, Login::isAuthenticated() evaluated only the session flag recording that the password step had succeeded, while the separate flag recording that the whole login (including 2FA) had completed was never consulted. The root cause maps to CWE-304 (Missing Critical Step in Authentication): the verification of the second factor was effectively skipped for the purposes of the Twig/Shortcode content-gating layer, so a session parked at the 2FA code prompt evaluated as authenticated. This affects the Twig authenticated() function in its no-argument form and its group form authenticated(null, 'group'), the [authenticated] shortcode, and the inverse [guest] shortcode, which is consequently evaluated too early. Crucially, the authenticated('some.permission') form is unaffected because it routes through UserObject::authorize() and therefore enforces the full, completed login state. The CPE string cpe:2.3:a:getgrav:grav and the EUVD listing (grav 3.8.7 < 3.9.7) both anchor the issue to the Grav CMS plugin distribution rather than to Grav core. The assessed CVSS:3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N) reflects a remote, high-complexity attack with no integrity or availability impact and low confidentiality impact, consistent with the narrowing conditions of the bypass.

Know when Grav gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulnCheck) PRIMARY 6.9 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
vuln.today AI 3.7 LOW

Network-reachable and no target authentication (PR:N), but success hinges on already knowing the victim's password, modeled as AC:H; only member-content confidentiality is affected (C:L).

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

1
Patch available
Sep 26, 2026 - 14:02 EUVD

DescriptionCVE.org

grav-plugin-login (the Grav CMS Login plugin) versions >= 3.8.7 and < 3.9.7 allow the two-factor authentication challenge to be bypassed for content gated by the authenticated() Twig function or the [authenticated] shortcode. On sites with 2FA enabled, Login::isAuthenticated() checked only the session flag indicating that the password step had succeeded, not the flag indicating that login had completed, so a session sitting at the 2FA code prompt was treated as fully authenticated. An attacker who knows a member's password but cannot answer that member's second factor can therefore read member-only content rendered by the no-argument authenticated() or group authenticated(null, 'group') forms and by [authenticated]; the inverse [guest] shortcode is likewise evaluated too early. Impact is limited to disclosure of that content: the attacker does not obtain a completed session, cannot access pages protected by an access: rule, and cannot act as the user. The authenticated('some.permission') form, which goes through UserObject::authorize(), is not affected. Fixed in grav-plugin-login 3.9.7.

Threat Intelligence Overview

EPSS Score
0.3%
Top 79% exploitable
Prevalence
Low
Login plugin for Grav, a niche PHP flat-file CMS with small footprint
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

More in Grav

View all
CVE-2025-66294 HIGH POC
8.7 Dec 01

Server-side template injection (SSTI) in Grav (getgrav/grav) prior to 1.8.0-beta.27 allows an authenticated attacker hol

CVE-2025-66301 HIGH POC
8.6 Dec 01

Broken access control in Grav CMS (CWE-285) before 1.8.0-beta.27 lets an authenticated editor-level user escalate their

CVE-2025-50286 HIGH POC
8.1 Aug 06

A Remote Code Execution (RCE) vulnerability in Grav CMS v1.7.48 allows an authenticated admin to upload a malicious plug

CVE-2024-34082 CRITICAL POC
9.9 May 15

Grav is a file-based Web platform. Rated critical severity (CVSS 9.9), this vulnerability is remotely exploitable, low a

CVE-2021-47812 CRITICAL POC
9.8 Jan 16

GravCMS 1.10.7 allows unauthenticated remote attackers to write arbitrary YAML configuration files, leading to full serv

CVE-2026-65008 CRITICAL POC
9.3 Jul 21

Remote code execution in Grav CMS 2.0.4 (fixed in 2.0.7) lets an authenticated user holding the admin.pages or api.pages

CVE-2026-75827 CRITICAL POC
9.3 Aug 18

Remote code execution in Grav CMS before 2.0.15 allows attackers holding page-edit or blueprint-config privileges to wri

CVE-2026-75837 CRITICAL POC
9.3 Aug 18

Vertical privilege escalation in Grav CMS before 2.0.14 lets a delegated administrator holding only the admin.users perm

CVE-2026-75828 CRITICAL POC
9.3 Aug 18

Stored cross-site scripting in Grav CMS before 2.0.15 lets authenticated editors smuggle JavaScript event handlers past

CVE-2025-66844 CRITICAL POC
9.1 Dec 15

Server-side request forgery (SSRF) in Grav CMS versions prior to 1.7.49.5 allows remote authenticated attackers to make

CVE-2025-66299 HIGH POC
8.8 Dec 01

Grav is a file-based Web platform. Prior to 1.8.0-beta.27, Grav CMS is vulnerable to a Server-Side Template Injection (S

CVE-2026-72819 HIGH POC
8.7 Aug 14

Remote code execution in Grav CMS before 2.0.13 allows authenticated low-privilege users to plant and execute arbitrary

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy