CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-94462

CVE-2026-94462: Broken Access Control in Spree Store API v3 Cart Association

Alon Barad
Alon Barad
Software Engineer

Sep 23, 2026·6 min read·11 visits

Executive Summary (TL;DR)

Authenticated attackers can hijack arbitrary guest carts and leak customer PII by exploiting guessable cart IDs and a lack of token verification in the Spree Store API cart association endpoint.

An Insecure Direct Object Reference (IDOR) vulnerability exists in Spree open-source e-commerce solution versions 5.4.0 through 5.4.3 and 5.5.0 through 5.5.3. An authenticated attacker can predict or enumerate guest cart identifiers generated via Sqids and associate them with their own account. This unauthorized association leaks sensitive customer personally identifiable information (PII) and disrupts the checkout flow of active guest sessions.

Vulnerability Overview

The vulnerability exists in Spree open-source e-commerce solution versions 5.4.x (prior to 5.4.4) and 5.5.x (prior to 5.5.4). It resides specifically in the Spree::Api::V3::Store::CartsController#associate controller action. This endpoint is designated for linking a guest cart to an authenticated customer account.

Under default conditions, guest carts are assigned sequential database identifiers. The system obfuscates these identifiers externally using the Sqids library. The resulting strings, known as prefixed IDs, are reversible and lack cryptographic security, which enables users to predict valid cart identifiers.

An authenticated customer can submit an association request for a victim guest cart using its predicted prefixed ID. Because the application logic does not verify ownership of the guest cart during lookup, the server updates the cart owner to the attacker. Consequently, the attacker receives the complete serialized details of the target cart, including the victim guest's personally identifiable information.

Root Cause Analysis

The root cause of CVE-2026-94462 is a failure to enforce authorization checks during the cart association process. The application utilizes the Sqids encoding standard to generate public identifiers. Because Sqids is a non-cryptographic, salt-free algorithm, any authenticated client can decode their own cart's ID and systematically compute sequential database identifiers for other carts.

The lookup process in the vulnerable controller handles the query by matching the ID against inactive or unowned carts. Specifically, the database query filters for carts belonging to the current store where the user attribute is null. This logic is intended to match any guest cart.

However, the application accepts the user-controlled key as the sole authorization credential. The controller lacks a check to verify if the requesting client actually initialized or possessed the target guest cart. This omission permits any logged-in user to claim any unauthenticated session cart stored in the database.

Code Analysis

The vulnerable implementation of find_cart_for_association did not validate whether the client possessed the corresponding guest token. The system only checked whether the cart belonged to the store and was unassociated. The following code snippet demonstrates the vulnerable controller logic:

# Vulnerable Controller Logic
def associate
  @cart = find_cart_for_association
 
  # The association service executes without verifying the client's token
  result = Spree.cart_associate_service.call(guest_order: @cart, user: current_user, guest_only: true)
 
  if result.success?
    render_serialized_payload(200) { serialize_order(result.value) }
  else
    render_error_payload(result.error)
  end
end
 
private
 
def find_cart_for_association
  # This query retrieves any guest cart matching the provided prefix ID
  current_store.carts.where(user: [nil, current_user]).find_by_prefix_id!(params[:id])
end

The remediation introduces explicit authorization and token verification steps. The patched controller verifies that the request includes the cryptographically secure token associated with the cart. Below is the updated code implementing the security control:

# Patched Controller Logic
def associate
  @cart = find_cart_for_association
  # Enforces update authorization and token possession
  authorize!(:update, @cart, cart_token)
  require_cart_token!
 
  result = Spree.cart_associate_service.call(guest_order: @cart, user: current_user, guest_only: true)
 
  if result.success?
    render_serialized_payload(200) { serialize_order(result.value) }
  else
    render_error_payload(result.error)
  end
end
 
private
 
def require_cart_token!
  # Compares request header x-spree-token with the database-stored cart token
  valid = cart_token.present? && cart_token == @cart.token
 
  raise CanCan::AccessDenied.new(nil, :update, @cart) unless valid
end

Exploitation Methodology

Exploitation of this vulnerability requires a valid registered account on the target Spree platform. The attacker first registers or logs in to obtain a valid JSON Web Token (JWT) or session cookie. This token is used to authenticate requests to the Store API.

The attacker then estimates valid guest cart identifiers. Because Spree uses sequential integers encoded via Sqids, the attacker decodes their own cart's prefixed ID to find the active range of database integers. The attacker then encodes adjacent integer values to generate target identifiers.

Finally, the attacker issues a PATCH request to the associate endpoint. This request targets the calculated guest cart identifier but omits the x-spree-token header. The server processes the request, reassigns the cart, and responds with the full cart payload. This payload contains the victim's name, billing address, shipping address, and phone number.

Impact Assessment

The primary consequence of this vulnerability is the unauthorized disclosure of sensitive customer information. If a guest user has initiated the checkout process, their personal details are stored temporarily in the cart object. This data includes full names, email addresses, phone numbers, and physical addresses.

Additionally, the exploitation causes disruption of the checkout flow. When the attacker associates the guest cart with their own account, the cart's association changes. The victim guest is no longer able to complete their order, as their active session loses access to the hijacked cart.

The vulnerability is rated with a CVSS v3.1 base score of 7.1. The impact on confidentiality is high due to the exposure of raw PII. The impact on integrity is low because the attacker can alter database relationships but cannot modify other server configurations.

Remediation & Detection Guidance

To resolve CVE-2026-94462, administrators must upgrade their Spree installations. The vulnerability is addressed in versions 5.4.4 and 5.5.4. These versions implement strict token verification before allowing any cart association.

For organizations unable to immediately upgrade, a temporary mitigation can be implemented using a Web Application Firewall (WAF). Rules should be configured to inspect traffic to /api/v3/store/carts/*/associate. If the PATCH request does not contain the x-spree-token header, the WAF should drop the connection or return a 403 Forbidden response.

Detection can also be performed via log analysis. Security operations teams should monitor application access logs for multiple sequential PATCH requests to the associate endpoint from a single IP address or user account. A high frequency of such requests targeting distinct cart identifiers suggests automated scanning.

Fix Analysis (2)

Technical Appendix

CVSS Score
7.1/ 10

Affected Systems

Spree >= 5.4.0, < 5.4.4Spree >= 5.5.0, < 5.5.4

Affected Versions Detail

Product
Affected Versions
Fixed Version
Spree
Spree
>= 5.4.0, < 5.4.45.4.4
Spree
Spree
>= 5.5.0, < 5.5.45.5.4
AttributeDetail
CWE IDCWE-639
Attack VectorNetwork
CVSS Score7.1
EPSS ScoreN/A
ImpactConfidentiality (High), Integrity (Low)
Exploit Statuspoc
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1119Automated Collection
Collection
T1020Automated Exfiltration
Exfiltration
T1078Valid Accounts
Initial Access
CWE-639
Authorization Bypass Through User-Controlled Key

Vulnerability Timeline

Vulnerability patched in Spree repository
2026-07-16
Security advisory GHSA-4825-p4xm-pcf2 published
2026-09-22
CVE-2026-94462 assigned and NVD entry published
2026-09-22

References & Sources

  • [1]GitHub Security Advisory GHSA-4825-p4xm-pcf2
  • [2]Spree Pull Request #14314
  • [3]Spree v5.4.4 Release Tag
  • [4]Spree v5.5.4 Release Tag
  • [5]NVD Record for CVE-2026-94462

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 7 hours ago•CVE-2026-57576
6.5

CVE-2026-57576: Application-Level Denial of Service via Uncontrolled Resource Consumption in Plone

CVE-2026-57576 is an application-level Denial of Service (DoS) vulnerability in Plone. It resides in the `plone.app.dexterity` and `plone.app.contenttypes` packages, allowing authenticated users with content creation permissions to submit excessively long metadata attributes. Because these fields are stored without length limits and subsequently processed by indexing and rendering engines, they trigger complete server resource exhaustion and thread starvation.

Alon Barad
Alon Barad
6 views•9 min read
•about 8 hours ago•GHSA-8PCW-H6W9-H46G
6.5

GHSA-8PCW-H6W9-H46G: Denial of Service via Uncontrolled Resource Consumption in plone.app.contenttypes

An uncontrolled resource consumption vulnerability in plone.app.contenttypes allows authenticated users to trigger application-level denial of service via oversized filename metadata in file uploads.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 9 hours ago•CVE-2026-61685
7.5

CVE-2026-61685: SQL Injection via Dynamic Query Parameters in ReactPress

An unauthenticated remote SQL injection vulnerability exists in multiple API list endpoints of ReactPress prior to version 3.7.0. The vulnerability stems from unsafe construction of TypeORM QueryBuilder conditions, where untrusted HTTP query parameter keys are interpolated directly into SQL statements as identifiers without sanitization or validation.

Alon Barad
Alon Barad
7 views•9 min read
•about 10 hours ago•CVE-2026-56669
7.5

CVE-2026-56669: Remote Denial of Service via Algorithmic Complexity and Interpretation Conflict in Elysia

CVE-2026-56669 is a high-severity vulnerability in the Elysia web framework (ElysiaJS) that combines Inefficient Algorithmic Complexity (CWE-407) and an Interpretation Conflict (CWE-436). It allows remote, unauthenticated attackers to cause a complete Denial of Service (DoS) via CPU resource exhaustion using specially crafted multipart or urlencoded payloads.

Amit Schendel
Amit Schendel
8 views•6 min read
•about 11 hours ago•CVE-2026-86065
7.5

CVE-2026-86065: Denial of Service via Resource Exhaustion in klever-go WebSocket Subscription Endpoint

Prior to version 1.7.20, the default-open WebSocket `/subscribe` endpoint in klever-go was vulnerable to remote resource exhaustion. Unauthenticated, remote attackers could crash validator and node processes by exploiting unbounded frame reads, uncapped concurrent connections, unrestricted memory allocation for subscription address keys, and a permanent memory leak in subscription map tracking on client disconnects.

Alon Barad
Alon Barad
8 views•7 min read
•about 12 hours ago•CVE-2026-82405
8.7

CVE-2026-82405: Incorrect Authorization leading to Account Takeover in klever-go

A critical incorrect authorization vulnerability (CWE-863) exists in the Go implementation of the Klever blockchain protocol (klever-go) prior to version 1.7.20. The vulnerability allows an attacker to completely replace a target account's permission set by manipulating the RecipientAddr parameter in a VM built-in function, leading to total account takeover.

Amit Schendel
Amit Schendel
8 views•5 min read