Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as ordinary user
-
DeliveryRead cheap item's public stripeId
-
ExploitPOST cart pairing expensive variantId with cheap stripeId
-
ExecutionComplete Stripe checkout at cheap price
-
ImpactWebhook records expensive product unpaid-for
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V3 - Web Frontend Security Server-side parameter enforcement
|
| Exploitation Conditions | Requires only a standard authenticated user account with no special privileges (PR:L) against a default deployment of MarcosCamara01 Ecommerce Template - no non-default configuration or feature toggle is needed. The attacker POSTs to /api/user/cart supplying variantId and stripeId as independent fields; because every stripeId in the catalogue is readable by any visitor, no secret value must be guessed. The only limiting factors are the need for a valid logged-in session and reachability of the cart/checkout API; there is no user-interaction requirement, no admin access, and no version- or platform-specific precondition stated in the evidence. |
| Impact | Severity signals point to a moderate, integrity-only flaw: the supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N) scores 7.1 with VI:H but VC:N and VA:N, i.e. no data exposure and no availability loss - the damage is fraudulent, mismatched orders and under-charging of the merchant. No EPSS score and no CISA KEV entry are present in the input, so widespread-exploitation probability cannot be quantified from the data; the only priority signal is the vuln.today 'this_week' decision label, which is consistent with easy, authenticated, network-reachable exploitation rather than an emergency. Exploitability is genuinely high in context: AC:L/PR:L with every required stripeId publicly readable means any registered user can abuse it reliably and repeatably with no guessing. The tempering factor is real-world footprint - this is an individual-authored open-source ecommerce template, so even though the bug is trivially exploitable and directly monetizable, the number of exposed production deployments is likely small. Net: a real, must-fix priority for anyone actually running this template (direct financial fraud), but not a mass-exploitation internet-wide event given the narrow product base. Missing data to flag: no EPSS, no KEV, and no vendor-confirmed public exploit-code artifact. |
| Exploit ScenarioDerived | An authenticated shopper reads the publicly visible Stripe price ID of the cheapest catalogue item, then calls POST /api/user/cart adding an expensive variantId while supplying the cheap item's stripeId. Stripe charges the cheap price, but the checkout.session.completed webhook records the order against the expensive variantId, so the attacker obtains expensive goods for the cheapest price, repeatable without limit. A private PoC (REPORT-1627) is mirrored in the vendor's added regression test; no verified public working exploit code is published in the input. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Price substitution in the MarcosCamara01 Ecommerce Template cart and checkout flow lets any authenticated customer pay a cheap Stripe price while ordering a more expensive variant, producing paid orders and order records that do not match. The flaw exists because /api/user/cart stores client-supplied variantId and stripeId independently, and /api/stripe/payment charges the stored stripeId while the checkout.session.completed webhook records the variantId. The vendor commit e6b364cd668f2ba875cfa7f6d55c63e771715df7 removes stripeId from client input and resolves pricing server-side; a public PoC reference exists in the vendor regression test and is not verified as working exploit code, and no CISA KEV active exploitation is reported in the supplied data.
RemediationAI
Apply the vendor fix in commit e6b364cd668f2ba875cfa7f6d55c63e771715df7 or a release containing it; the patch removes stripeId from addToCartSchema and client payloads, resolves the Stripe price server-side from the variant via findVariantById and findByUserIdWithDetails, and builds Stripe line items with buildLineItems from the authoritative variant stripeId. Until upgraded, ignore or strip any client-supplied stripeId at /api/user/cart and derive the Stripe price server-side from variantId, because the supplied evidence shows the payment route otherwise charges the stored client-controlled stripeId. If immediate patching is not possible, restricting or disabling the cart and checkout API endpoints would reduce exposure but has the trade-off of blocking legitimate purchases. The patch reference is https://github.com/MarcosCamara01/ecommerce-template/commit/e6b364cd668f2ba875cfa7f6d55c63e771715df7, the CNA reference is https://secur0.com/en/cna/cve-list/cve-2026-115450-price-manipulation-stripe-checkout, and the supplied priority label is this_week.
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The affected code is a Next.js App Router e-commerce template using Drizzle ORM repositories and Stripe Checkout. CWE-472 applies because stripeId is treated as an assumed-immutable value but is accepted from the client in the add-to-cart request alongside variantId; the cart row stores both values, the payment route builds Stripe line items from item.stripeId, and the checkout.session.completed webhook creates order products from variantId. Catalogue stripe IDs are readable by any visitor, so an authenticated user can pair an expensive variantId with a cheap stripeId without guessing a secret. The vendor patch adds buildLineItems and findByUserIdWithDetails, removes stripeId from addToCartSchema and client components/hooks, and adds findVariantById so the server resolves the variant's authoritative stripe_id. The trigger described in the supplied evidence is a crafted POST to /api/user/cart with mismatched variantId and stripeId; no race, memory-corruption condition, or non-default configuration requirement is stated.
Know when Ecommerce Template 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
Network API reachable (AV:N), trivially reliable with public stripeIds (AC:L), needs any authenticated account (PR:L), no UI; integrity-only fraud (I:H) with no confidentiality or availability impact.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
External Control of Assumed-Immutable Web Parameter (CWE-472) in the cart and checkout flow of MarcosCamara01 Ecommerce Template allows an authenticated user with no special privileges to be charged the price of one product while placing an order for another, because POST /api/user/cart accepts variantId, which determines what the order records, and stripeId, which determines what Stripe charges, as two independent fields of the request body, stores both on the cart row, and no check requires the stripeId to be the one that belongs to the variantId. POST /api/stripe/payment builds the Stripe Checkout line items from the stored value, as { price: item.stripeId, quantity }, so the amount charged is the amount of that Stripe price. The checkout.session.completed webhook then creates the order products from the variantId of the same cart row, so the order records a product that was not paid for. Every stripeId in the catalogue is readable by any visitor, so no value has to be guessed. This results in orders for goods at the price of the cheapest item in the catalogue, repeatable without limit, and in order records whose amount does not correspond to the product they list.
Executive ViewAI
CVE-2026-115450 is a high-severity pricing flaw in the MarcosCamara01 Ecommerce Template that allows authenticated customers to pay a reduced price for higher-value products, directly impacting revenue and order integrity. Leadership should be concerned because this undermines financial controls and customer trust, and requires immediate remediation to prevent financial losses.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
More in Ecommerce Template
View allAuthorization bypass (CWE-639) in the MarcosCamara01 Ecommerce Template lets any authenticated shopper delete or change
Unauthenticated remote attackers can repeatedly invoke the revalidateProducts Server Action in the MarcosCamara01 Ecomme
EUVD-2026-108212
GHSA-5222-hwj8-q4fh
NVD
CVE.org
Exploit-DB