Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as any shopper account
-
DeliveryEnumerate sequential bigserial cart/wishlist IDs
-
ExploitCall delete/update matching only on primary key
-
ExecutionRLS inactive for table-owner connection
-
ImpactDestroy or alter victim cart and wishlist rows
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Requires a valid authenticated account on the targeted installation (PR:L); any low-privileged shopper suffices, with no user interaction needed. The flaw is present in the template's default deployment, where a single DATABASE_URL is used both to run migrations (making that role the table owner) and for the runtime app, so PostgreSQL does not apply the RLS policies to the owner connection. Exploitation is eased by cart_items.id and wishlist.id being sequential bigserial identifiers that can be enumerated, and the update path returning the modified row including its owning user_id. Limiting factors: an account on the specific installation is mandatory, and an operator who separated the migration and runtime roles or applied the 0004_force_rls fix (FORCE ROW LEVEL SECURITY) would not be exposed via the owner-connection path. |
| Impact | Signals are moderate and broadly consistent. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N) and the 7.1 base score describe a remotely reachable, low-complexity flaw that requires an authenticated account (PR:L), with high integrity impact on other users' data (VI:H), a minor confidentiality leak (VC:L), and no availability or subsequent-system impact. The vuln.today Decision label is this_week - a real but non-emergency priority - and it is not in CISA KEV; no EPSS score was supplied, so widespread-exploitation probability cannot be quantified from the input. No confirmed working exploit code is provided; the reporter (Secur0) published a public technical advisory describing the IDOR. The practical risk driver is that exploitation is trivial once authenticated: identifiers are sequential bigserial values that are easily enumerated, the intended RLS defense is silently inactive, and the update path even returns the victim's user_id. The main dampeners are that an account on the specific installation is required and the affected product is a niche open-source template rather than widely deployed software, which argues for targeted rather than mass exploitation. No key signals conflict; the chief gap is the absence of EPSS/KEV data to gauge real-world exploitation breadth. |
| Exploit ScenarioDerived | An attacker registers an ordinary shopper account on an affected installation and authenticates. They enumerate the sequential cart_items.id and wishlist.id values and invoke the delete/update operations, which match rows by primary key alone; because the tables never had FORCE ROW LEVEL SECURITY set and the app connects as the table owner, PostgreSQL ignores the per-user policies and the calls succeed against other shoppers' rows. No exploit is confirmed as working code, but the reporter published a public technical advisory detailing the flaw. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Authorization bypass (CWE-639) in the MarcosCamara01 Ecommerce Template lets any authenticated shopper delete or change the cart and wishlist rows that belong to other accounts on the same installation, because the Drizzle repository calls match rows on the primary key alone and the per-user PostgreSQL row level security policies never take effect for the application's connection. Affected deployments are those using the template's default single-DATABASE_URL setup, where the migration role that creates the tables is also the runtime role, so PostgreSQL does not apply RLS to the table owner; cart_items.id and wishlist.id are sequential bigserial values, making other users' row identifiers enumerable, and the update path returns the modified row including its owning user_id. A valid low-privileged account on the target is required and no user interaction is needed; no public exploit identified at time of analysis, and vendor-side code addressing both the RLS enforcement gap and the missing ownership predicates is available in the referenced commit.
RemediationAI
Upstream fix available (PR/commit); released patched version not independently confirmed. Apply commit adf7dedbb41894c0bad0b33a26999b0da7e967b7 (https://github.com/MarcosCamara01/ecommerce-template/commit/adf7dedbb41894c0bad0b33a26999b0da7e967b7), which adds migration drizzle/migrations/0004_force_rls.sql and registers it in drizzle/migrations/meta/_journal.json. That migration re-issues ALTER TABLE ... ENABLE ROW LEVEL SECURITY and adds ALTER TABLE ... FORCE ROW LEVEL SECURITY for each of user, session, account, verification, products_items, products_variants, cart_items, wishlist, order_items, customer_info and order_products (guarded by an existence check and idempotent, so it is safe to re-run and also repairs databases that skipped 0002/0003). The same commit adds the missing ownership predicates: cartRepository.delete() and cartRepository.updateQuantityInternal() now filter on and(eq(cartItems.id, id), eq(cartItems.userId, userId)), wishlistRepository.delete() filters on and(eq(wishlist.id, id), eq(wishlist.userId, userId)), and userId is threaded through the call sites and insert path. Operators who cannot apply the commit immediately should either run the equivalent FORCE ROW LEVEL SECURITY statements manually or stop using the migration role as the runtime role, since a dedicated non-owner runtime role makes the existing policies effective. Note the documented side effect: once FORCE is set, the owner is also subject to the policies, so any future migration that must bypass a policy has to run as a role with BYPASSRLS or temporarily ALTER TABLE ... NO FORCE ROW LEVEL SECURITY; leaving FORCE off, or reverting to a single owner DATABASE_URL, restores the exposure. No public exploit code was identified, but the identifiers are enumerable, so applying the ownership predicates should not be deferred.
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 template is a Next.js-style e-commerce starter using Drizzle ORM over PostgreSQL, with data access encapsulated in repository modules (src/lib/db/drizzle/repositories/cart.repository.ts and wishlist.repository.ts). The vulnerability is a classic CWE-639 insecure direct object reference layered on a PostgreSQL row level security misconfiguration: migrations 0002 and 0003 issue ALTER TABLE ... ENABLE ROW LEVEL SECURITY and create policies comparing app.current_user_id() with user_id, but PostgreSQL only applies RLS policies to non-owner roles unless FORCE ROW LEVEL SECURITY is set, and the template never sets it. Because the same DATABASE_URL is used to run the migrations (which CREATE the tables, making that role the owner) and by the application at runtime, the application connects as the owner and every policy is silently ignored, so application-layer filtering becomes the only control. That control is absent: cartRepository.delete() and cartRepository.updateQuantityInternal() and wishlistRepository.delete() filter with eq(cartItems.id, id) / eq(wishlist.id, id) with no predicate on the owning user, and the identifiers are sequential bigserial values that can be walked, while the update path returns the modified row carrying the owner's user_id. The result is cross-tenant destruction and modification of cart and wishlist contents. The supplied evidence does not describe any additional trigger condition beyond supplying another user's identifier.
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:L/VI:H/VA:N/SC:N/SI:N/SA:N
Any authenticated user (PR:L) can remotely and simply (AV:N/AC:L) destroy or modify other users' rows (I:H), with a minor user_id leak (C:L); row deletion scored as integrity, not availability.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
Authorization Bypass Through User-Controlled Key (CWE-639) in the cart and wishlist repositories of MarcosCamara01 Ecommerce Template allows any authenticated user to delete and modify the cart and wishlist rows of any other user, because cartRepository.delete(), cartRepository.updateQuantityInternal() and wishlistRepository.delete() in src/lib/db/drizzle/repositories/ match rows by primary key alone, with no predicate on the owning user, and the per user authorization for those three operations rests on PostgreSQL row level security. The migrations run ALTER TABLE ... ENABLE ROW LEVEL SECURITY and create policies comparing app.current_user_id() with user_id, but never ALTER TABLE ... FORCE ROW LEVEL SECURITY, and PostgreSQL does not apply policies to the role that owns a table. The template uses one DATABASE_URL both to run the migrations, which create the tables, and for the application at runtime, so the application connects as the owner of the tables and the policies do not apply to it. cart_items.id and wishlist.id are sequential bigserial values, so the identifiers of rows belonging to other users can be enumerated, and the update path returns the modified row, which carries the identifier of the user it belongs to. This results in the destruction and modification of cart and wishlist contents belonging to other accounts of the installation.
Executive ViewAI
CVE-2026-115453 is a high-severity authorization bypass in the MarcosCamara01 Ecommerce Template that enables any authenticated shopper to access and modify other customers' cart and wishlist data. This compromises customer privacy and trust, and could lead to account takeovers or regulatory exposure. Leadership should prioritize remediation for all e-commerce sites built on this template.
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
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
More in Ecommerce Template
View allPrice substitution in the MarcosCamara01 Ecommerce Template cart and checkout flow lets any authenticated customer pay a
Unauthenticated remote attackers can repeatedly invoke the revalidateProducts Server Action in the MarcosCamara01 Ecomme
EUVD-2026-108213
GHSA-j5qr-vh53-fq3q
NVD
CVE.org
Exploit-DB