Open RedirectWeakness · CWE-601

CVE-2026-61451

CRITICAL · 9.6 CVSS v3.1 Published 2026-07-15
Mitigation only
No fix yet — a mitigation exists. There is no fixed release. A documented workaround reduces exposure in the meantime.
See remediation →
100/100
Remediation priority · Urgent
Remotely reachable No privileges 5 weeks old

Official description Straight from the sourceThe vendor's or NVD's own wording, published unedited. Authoritative, but often terse — it says what broke, rarely what to do.

NVD · unedited
The Grav API plugin (grav-plugin-api) before 1.0.4 does not validate the origin of the client-supplied admin_base_url field in the POST /api/v1/auth/forgot-password endpoint. The sanitizeHttpUrl() function only checks that the URL scheme is http/https and never verifies the host against the server's own origin, so an attacker can supply an arbitrary host. As a result, an unauthenticated attacker can cause the password reset email sent to a victim to contain a reset link pointing at an attacker-controlled server; when the victim follows the link, the valid reset token is disclosed to the attacker, enabling full account takeover. The vulnerable base URL can also be influenced via the Referer or Origin headers.

Technical summary Written by usOur analysis, written from the advisory, the CVSS vector and the affected-version data. It adds context the advisory leaves out, and never invents facts that are not in the source.

dbcve analysis · high confidence

The Grav API plugin before 1.0.4 fails to validate that the admin_base_url in POST /api/v1/auth/forgot-password matches the server's own origin. The sanitizeHttpUrl() function only checks for http/https schemes without verifying the host, allowing attackers to supply arbitrary hosts and intercept password reset tokens by redirecting victim reset emails to attacker-controlled servers.

MitigationImplement strict host validation in sanitizeHttpUrl() to verify the supplied URL's host matches the server's origin, and reject any requests with mismatched hosts. Additionally, validate Origin/Referer headers as a secondary control.

Verify against the referenced sources before acting — the references below are authoritative for this CVE, this summary is not.

CVSS breakdown How the score is builtThe industry scoring standard. It rates how the flaw is reached, what it takes to exploit, and what an attacker gains — the score is derived from those, not the other way round.

From the vector
Attack vector
Network
Complexity
Low
Privileges
None
User interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

Am I affected? How to checkSteps we derive from the advisory and the affected-version data, so you can decide whether this CVE reaches your setup. They are a guide, not a scan — your own configuration is the authority.

dbcve checks

Work through these to decide whether this CVE applies to you.

  1. Identify Grav API plugin version
    Locate the plugin's version file or composer.json in the Grav user/plugins/api directory. Common paths: /var/www/html/user/plugins/api/composer.json or check the plugin's main PHP file for a version constant.
    Affected if Version is below 1.0.4 (e.g., 1.0.3, 1.0.2, etc.)
  2. Verify forgot-password endpoint exists
    Check if the file containing the /api/v1/auth/forgot-password route exists. Look for routes.php or the main API plugin PHP file defining this endpoint.
    Affected if The endpoint is present in the plugin installation
  3. Inspect sanitizeHttpUrl function
    Open the file containing the sanitizeHttpUrl() function (typically in the plugin's includes or helpers directory) and verify whether it validates the URL host against the server's origin.
    Affected if The function only checks for http/https schemes without validating the host matches the server's origin

A user is affected if the Grav API plugin version is below 1.0.4 and the sanitizeHttpUrl() function lacks host validation for the forgot-password endpoint.

Generated from the published advisory. Verify against your own configuration.

Check your environment

Paste your version and any relevant configuration and it will be compared against the affected criteria above. Do not include secrets or credentials.

AI-assisted, checked against the advisory. Informational, not a guarantee.

Remediation Closing itWhat it takes to close this. Where a vendor fix exists we point at it; where none exists we say so plainly, and can build one. Effort estimates are scoped from the advisory, not from your codebase.

dbcve · scoped
Mitigation available No clean upgrade yet — mitigate in the meantime
Mitigation

Implement strict host validation in sanitizeHttpUrl() to verify the supplied URL's host matches the server's origin, and reject any requests with mismatched hosts. Additionally, validate Origin/Referer headers as a secondary control.

Recommended fix High confidence

grav-plugin-api version 1.0.4

  1. 1. Identify the Grav instance and locate the grav-plugin-api plugin installation directory
  2. 2. Check the current version of grav-plugin-api (typically found in plugin's manifest or composer.json)
  3. 3. If the installed version is before 1.0.4, backup the entire Grav installation and database
  4. 4. Update the plugin to version 1.0.4 or later using the Grav package manager or by replacing the plugin files
  5. 5. Verify the update was successful by checking the new plugin version
  6. 6. Test the /api/v1/auth/forgot-password endpoint to confirm sanitizeHttpUrl() now validates the host against the server's origin
  7. 7. Confirm the fix prevents arbitrary URLs in the admin_base_url field

Generated from the published advisory — verify against the referenced sources before acting.

Have this fixed Scoped from the published advisory
  • Consultation2.0 h
  • Implementation3.0 h
  • Testing3.0 h
  • Review / QA2.0 h
10.0 hours of engineering $1,750
Get help mitigating

An estimate, not a bill — we confirm scope with you before any work starts. Need it this week? Rush from $2,800.

Scan for this in your stack

Free · runs locally
dbcve dependency scanner

Check whether your project pulls in CVE-2026-61451 — or any other known-vulnerable package — straight from your lock files. Free and open source; it runs locally and uploads nothing.

References Go to the primary sourcePrimary sources — vendor advisories, patches and trackers. Where our summary and a reference disagree, the reference wins.

Primary sources

Practitioner notes

Contributed

Peer-ranked notes from engineers who’ve handled CVE-2026-61451 in production — separate from our analysis above.

No notes yet

Be the first to add a field note for this CVE — a mitigation you’ve verified, a version caveat, or a link to a working fix. Sign in above to contribute.

What this is

A place for practitioners to share what actually worked: a mitigation you’ve tested, a configuration change, a version- or environment-specific caveat, or a link to a verified patch. The most useful notes rise to the top as peers upvote them, so the signal stays high.

What belongs here
  • Verified mitigations, workarounds, and config changes
  • Version or environment caveats, and links to real fixes
  • No weaponised exploit code, or anything meant to cause harm
  • No spam, self-promotion, credentials, or personal data