CVE-2026-61451
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 · uneditedThe 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 confidenceThe 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.
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 checksWork through these to decide whether this CVE applies to you.
-
Identify Grav API plugin versionLocate 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.)
-
Verify forgot-password endpoint existsCheck 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
-
Inspect sanitizeHttpUrl functionOpen 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.
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 · scopedImplement 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.
grav-plugin-api version 1.0.4
- 1. Identify the Grav instance and locate the grav-plugin-api plugin installation directory
- 2. Check the current version of grav-plugin-api (typically found in plugin's manifest or composer.json)
- 3. If the installed version is before 1.0.4, backup the entire Grav installation and database
- 4. Update the plugin to version 1.0.4 or later using the Grav package manager or by replacing the plugin files
- 5. Verify the update was successful by checking the new plugin version
- 6. Test the /api/v1/auth/forgot-password endpoint to confirm sanitizeHttpUrl() now validates the host against the server's origin
- 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.
- Consultation2.0 h
- Implementation3.0 h
- Testing3.0 h
- Review / QA2.0 h
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 locallyCheck 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 sourcesPractitioner notes
ContributedPeer-ranked notes from engineers who’ve handled CVE-2026-61451 in production — separate from our analysis above.
The advisory tells you what broke. It rarely tells you what actually worked. If you’ve dealt with this one, that detail is what the next engineer is searching for.
- The version that genuinely resolved it — not the one the vendor claimed
- A config change or rule that shut the vector down
- A gotcha in the upgrade path that cost you an afternoon
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.
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.
- 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