Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N
Network-accessible public checkout endpoint, but AC:H because attacker must possess a non-enumerable archived offer UUID; no auth required per PR:N; limited confidentiality and integrity impact only.
Primary rating from Vendor (https://github.com/TryGhost/Ghost).
CVSS VectorVendor: https://github.com/TryGhost/Ghost
Lifecycle Timeline
2DescriptionCVE.org
Impact
A missing validation check allowed users to redeem subscription offers that were no longer active.
Vulnerable versions
This vulnerability is present in Ghost from v4.22.0 up to v6.54.0.
Patches
v6.54.1 contains a fix for this issue.
How to update
For self-hosters using Docker, find Docker's official Ghost image here. Updating a Docker-based Ghost instance is documented here.
If your Ghost is a Ghost-CLI install see our documentation on updating it to the latest version here.
References
Ghost thanks Pedro Pinho for disclosing this vulnerability responsibly.
For more information
If you have any questions or comments about this advisory, email us at [security@ghost.org](mailto:security@ghost.org).
AnalysisAI
Ghost CMS subscription checkout accepts redemption of archived offers due to missing offer-status validation in the member router controller, affecting all self-hosted Ghost instances from v4.22.0 through v6.54.0. Unauthenticated users who possess or can discover an archived offer ID can submit a valid checkout request and obtain unauthorized subscription discounts or access at a revoked price point. No public exploit code has been identified and this CVE is absent from CISA KEV, but the direct financial impact on subscription-based Ghost sites makes it a meaningful business-logic risk for affected operators.
Technical ContextAI
Ghost (npm package: pkg:npm/ghost) is a Node.js open-source publishing and membership platform with Stripe-integrated subscription and offer management. The vulnerability resides in the _getSubscriptionCheckoutData method within ghost/core/core/server/services/members/members-api/controllers/router-controller.js. This method retrieves an offer object by its ID during checkout but, prior to v6.54.1, never validated the retrieved offer's status field against the expected value of 'active'. Offers in 'archived' status were indistinguishable from active ones at the checkout layer, allowing the flow to proceed to Stripe payment processing with a revoked offer applied. CWE-20 (Improper Input Validation) correctly identifies the root cause: a business-state property of a server-side resource was not checked before acting on the user-supplied reference. The fix confirmed in commit d91c0fc52dfc987d71a9803dbcbe6447d21b92fb adds an explicit guard: if (offer.status && offer.status !== 'active') throw new BadRequestError(...), preventing archived offer IDs from reaching downstream subscription logic.
RemediationAI
Upgrade Ghost to v6.54.1 or later, which contains the server-side status validation fix confirmed in commit d91c0fc52dfc987d71a9803dbcbe6447d21b92fb. For Docker-based self-hosters, pull the updated official Ghost image from hub.docker.com/_/ghost and redeploy per Ghost's Docker update documentation at https://docs.ghost.org/install/docker#updating-ghost. For Ghost-CLI installations, follow the upgrade procedure at https://docs.ghost.org/update. If immediate upgrading is not possible, a targeted compensating control would be to audit current archived offers in the Ghost admin panel and, where feasible, delete rather than merely archive any sensitive promotional offers to eliminate the redeemable IDs entirely - deletion removes the database record the checkout controller would resolve, whereas archiving only sets the status flag that was not previously checked. Note that deleting offers may affect historical subscription reporting. There is no network-layer mitigation that would address this without also disrupting the legitimate checkout flow.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
Vasion Print (formerly PrinterLogic) Virtual Appliance Host prior to version 25.2.169 and Application prior to version 2
Same weakness CWE-20 – Improper Input Validation
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-52929
GHSA-4wx2-7gvj-qfq3