Aug 4, 2026·6 min read·2 visits
Unauthenticated remote attackers can obtain premium paid subscriptions for nominal costs by exploiting weak metadata sanitization and logical errors in Ghost's Stripe checkout integration.
An unauthenticated remote business logic vulnerability in Ghost CMS versions 6.27.0 through 6.43.1 allows attackers to bypass paid subscription gates. By injecting reserved metadata fields into public donation Stripe Checkout Sessions, attackers can obtain premium-tier memberships for arbitrary nominal amounts.
Ghost is an open-source content management system built on Node.js that enables subscription-based monetization, membership routing, and donations using Stripe. The platform relies on Stripe's hosted Checkout Sessions to securely handle credit card processing. The checkout flow handles operations such as purchasing premium memberships, processing single donations, and issuing gift cards.
To map these detached operations back to internal states, the CMS registers critical transaction parameters directly into Stripe's checkout session metadata. This architectural design relies on Stripe Webhooks to asynchronously inform the server which specific entitlements must be granted once payment is confirmed. This framework introduces an attack surface when user-supplied input parameters are processed without validation prior to payment initialization.
The flaw indexed as CVE-2026-59817 represents a classic parameter tampering and business logic bypass vulnerability in the routing of donation payments. Due to improper metadata sanitization, unauthenticated remote actors can inject control keys into Stripe sessions. When Stripe confirms payment completion, the backend accepts the modified metadata as authentic, resulting in privilege escalation.
The root cause of CVE-2026-59817 is a multi-step input validation and logical routing failure in the Ghost backend components handling member checkouts. The flow begins when a user initiates a donation payment through the public REST endpoint mapped to the _createDonationCheckoutSession controller function.
First, the application failed to verify if the donations feature was actually toggled on by administrators. It verified only if the Stripe service was structurally configured, allowing users to reach the donation setup codepath even on deployments where donations were disabled. This oversight granted access to an unauthenticated, arbitrary-amount checkout path.
Second, the controller did not enforce metadata boundaries. During session creation, the incoming HTTP request payload allowed arbitrary keys to be placed inside the metadata object. Because the controller did not sanitize or blocklist reserved internal identifiers, these keys were forwarded to the Stripe API and appended to the valid Stripe Session.
Finally, when Stripe transmitted the asynchronous checkout.session.completed event, the webhook consumer parsed the returned metadata to determine how to process the transaction. Rather than validating that the subscription purchase price matched the financial total processed, the handler executed routing solely based on the presence of boolean flags inside the metadata. This allowed a low-value donation payment to be routed to gift-subscription code paths.
Analyzing the source code diff reveals how the validation gaps were closed. The primary flaw was localized within router-controller.js and mitigated by enforcing configuration checks and stripping control tags.
The vulnerability is mitigated by implementing a strict set of reserved keys and introducing a validation check to guarantee that donations are actively enabled. Below is the code implementation showing the introduced metadata blocklist:
// Patched: Define reserved metadata keys that control application state
const RESERVED_CHECKOUT_METADATA_KEYS = new Set([
'ghost_donation',
'ghost_gift',
'ghostSignupContext',
'gift_token',
'tier_id',
'cadence',
'duration'
]);
// Patched: Explicit sanitization function to strip reserved attributes
function removeReservedCheckoutMetadata(metadata) {
if (!metadata || typeof metadata !== 'object') {
return;
}
for (const key of RESERVED_CHECKOUT_METADATA_KEYS) {
delete metadata[key];
}
}The corresponding webhook receiver in checkout-session-event-service.js was also patched to enforce strict boolean evaluations on Stripe metadata fields and prevent conflicting states. It now logs a warning and rejects executions where conflicting flow markers are present:
// Patched: Enforce strict type check on webhook processing
function isStripeMetadataTrue(value) {
return value === true || value === 'true';
}
function hasConflictingCheckoutFlowMetadata(metadata) {
return hasStripeMetadataKey(metadata, 'ghost_donation') && hasStripeMetadataKey(metadata, 'ghost_gift');
}To exploit this vulnerability, an attacker identifies a target site running a vulnerable version of Ghost CMS and locates the endpoint for creating checkout sessions. The attack requires no authentication or valid cookie credentials.
The attacker crafts a POST request to /api/create-stripe-checkout-session/ with the transaction type configured to donation. This allows the attacker to specify an arbitrary nominal value, such as $1.00. The attacker embeds reserved parameter fields within the unsanitized metadata nested object, simulating a valid paid gift subscription configuration.
{
"customerEmail": "attacker@example.com",
"type": "donation",
"amount": 100,
"successUrl": "https://example.com/success",
"cancelUrl": "https://example.com/cancel",
"metadata": {
"ghost_gift": "true",
"gift_token": "attacker_controlled_token_string",
"tier_id": "prod_premium_tier_id",
"cadence": "year",
"duration": "12"
}
}The vulnerable server accepts this payload, generates a Stripe checkout session link containing the tampered metadata, and returns it to the attacker. The attacker completes the Stripe payment flow of $1.00. The Stripe event processor issues a webhook to Ghost, which identifies ghost_gift: "true" in the metadata, bypasses the payment tier check, and provisions a 12-month premium access token to the designated email.
The impact of CVE-2026-59817 is localized privilege escalation and monetary evasion, with a CVSS v3.1 score of 5.3 (Medium). The flaw does not present a mechanism for remote code execution, command injection, or administrative panel access, nor does it allow access to back-end system databases.
The operational impact is restricted to the bypass of premium content subscription fees. Threat actors can use the vulnerability to obtain active, long-term premium memberships without paying the defined registration fees, leading to revenue loss for creators and publishing entities using the platform.
Because the vulnerability is confined to CMS billing logic, no customer records, payment details, or personal identifying information are leaked or modified. It does not affect system-level availability or service reliability.
The definitive remediation is to upgrade Ghost CMS to version 6.44.0 or newer. This update implements input scrubbing for public-facing Stripe endpoints and hardens the asynchronous validation of metadata properties within the Stripe webhook controllers.
If upgrading is not immediately possible, administrators should disable the Tips and Donations feature globally in the Ghost management console. This limits the ability of external actors to trigger custom-amount payment processes.
Administrators may also apply Web Application Firewall rules at the CDN or proxy layer (such as Cloudflare or Nginx) to inspect and block POST requests to /api/create-stripe-checkout-session/ if the payload contains any keys in the metadata object matching ghost_gift, gift_token, or tier_id.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Ghost TryGhost | >= 6.27.0, < 6.44.0 | 6.44.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-915 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 5.3 (Medium) |
| EPSS Score | 0.00257 (17.25 percentile) |
| Impact | Integrity Level Low (I:L), No Confidentiality/Availability Impact |
| Exploit Status | Proof-of-concept validated |
| KEV Status | Not Listed in CISA KEV |
The application allows user-controlled input to modify object attributes or metadata that should only be controlled by the server, leading to business logic bypass.
CVE-2026-53947 is an observable response discrepancy (CWE-204) in Ghost CMS that permits unauthenticated remote user enumeration via the passwordless magic link sign-in endpoint.
A critical broken access control vulnerability in Open WebUI (v0.10.0 to v0.11.0) allows authenticated write-collaborators to delete shared subfolders they do not own. Because deletion triggers a backend cascade using the folder owner's identity, this results in unauthorized permanent deletion of the owner's nested chats, messages, and files.
Open WebUI is susceptible to Server-Side Request Forgery (SSRF) when deployed in networks with NAT64 translation gateways. Authenticated users can bypass host validation checks by encapsulating internal or cloud-metadata IPv4 addresses within globally-routable IPv6 transition prefixes.
A critical authorization flaw exists in Flowise, a popular drag-and-drop orchestrator for building customized Large Language Model flows. Prior to version 3.1.3, multiple OAuth2 credential endpoints do not filter database lookups by the requesting entity's workspace context. This omission, combined with the exclusion of several endpoints from the global authentication pipeline, permits unauthenticated remote actors to access, manipulate, or steal access tokens linked to external service integrations.
An incomplete credential redaction mechanism in Flowise allows authenticated users with standard view permissions to retrieve sensitive decrypted third-party credentials in plaintext.
CVE-2026-69262 is a high-severity incorrect authorization vulnerability (CWE-863) within the Flowise drag-and-drop LLM flow platform. Prior to version 3.1.3, Flowise did not enforce resource-type validation on its deletion endpoint. Although routing middleware ensured users held deletion privileges for either chatflows or agentflows, the service level lacked validation checks to verify whether the target resource matched the user's specific permissions. Consequently, an authenticated user with only agentflow deletion permissions could delete arbitrary chatflow configurations, leading to unauthorized state modification and service disruption.