Skip to main content

Ecommerce Template CVE-2026-115453

| EUVDEUVD-2026-108213 HIGH
Authorization Bypass Through User-Controlled Key (CWE-639)
2026-10-22 Secur0 GHSA-j5qr-vh53-fq3q
7.1
CVSS 4.0 · Vendor: Secur0
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as any shopper account
  2. Delivery
    Enumerate sequential bigserial cart/wishlist IDs
  3. Exploit
    Call delete/update matching only on primary key
  4. Execution
    RLS inactive for table-owner connection
  5. Impact
    Destroy 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

Ecommerce Template b139a11c7bfab82b9c54c738b9a5d6015b439972 <adf7dedbb41894c0bad0b33a26999b0da7e967b7

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

Vendor (Secur0) PRIMARY 7.1 HIGH
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
vuln.today AI 7.1 HIGH

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (Secur0).

CVSS VectorVendor: Secur0

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
Rare
open-source GitHub ecommerce template, hobby-scale, no enterprise footprint
Social Media
1
Sightings
Data Quality
4 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy