Sep 23, 2026·6 min read·44 visits
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.
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.
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.
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])
endThe 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
endExploitation 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.
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.
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.
| Product | Affected Versions | Fixed Version |
|---|---|---|
Spree Spree | >= 5.4.0, < 5.4.4 | 5.4.4 |
Spree Spree | >= 5.5.0, < 5.5.4 | 5.5.4 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-639 |
| Attack Vector | Network |
| CVSS Score | 7.1 |
| EPSS Score | N/A |
| Impact | Confidentiality (High), Integrity (Low) |
| Exploit Status | poc |
| KEV Status | Not Listed |
CVE-2026-16454 is an object-level authorization bypass vulnerability (CWE-284, CWE-862) in Eclipse hawkBit versions 1.0.3 and prior. The flaw exists within the Direct Device Integration (DDI) REST controller (hawkbit-ddi-resource), where endpoints responsible for enumerating software module metadata and serving firmware binaries fail to verify whether the requested software module is assigned to the authenticated device. Consequently, any device with valid credentials (such as a TargetToken or GatewayToken) can enumerate software module identifiers and download arbitrary firmware artifacts across the entire tenant namespace.
CVE-2026-62284 (GHSA-5w5g-j6hw-6p8f) is a code injection and server-side request forgery vulnerability in the console-proxy component of the OSAC Operator. The RemoteConfigResolver parses Kubernetes Secrets containing kubeconfig files via clientcmd.RESTConfigFromKubeConfig without sanitizing execution-related fields. An attacker with RBAC permissions to create or modify labeled Secrets in monitored namespaces can supply a malicious exec credential plugin, resulting in arbitrary command execution within the console-proxy pod.
CVE-2026-62361 (GHSA-xgjr-7j9q-2h4r) is an authenticated SQL injection and authorization bypass vulnerability in listmonk, an open-source, self-hosted newsletter and mailing list manager written in Go. In versions prior to 6.2.0, the subscriber export endpoint (GET /api/subscribers/export) directly interpolates user-supplied SQL filter expressions into a PostgreSQL query without invoking the table allowlist validation function (validateQueryTables). Consequently, authenticated users possessing the subscribers:sql_query and subscribers:get_all permissions can bypass relational access controls, execute arbitrary subqueries against restricted tables such as users and settings, and modify database state via writable Common Table Expressions (CTEs).
CVE-2026-28385 (GHSA-3gq2-x4qg-p4g6) is a Server-Side Request Forgery (SSRF) vulnerability in Canonical LXD versions 4.12 through 6.9. An authenticated user possessing the can_create_images entitlement can force the LXD daemon to execute arbitrary outbound HTTP and HTTPS requests via the /1.0/images API endpoint. Due to the absence of egress destination validation, an attacker can probe host loopback services, RFC 1918 private network segments, and cloud Instance Metadata Services (IMDS) from the network position of the privileged LXD daemon.
Canonical LXD and LXC Incus contain an arbitrary file write vulnerability (CWE-73 / CWE-59) in the `/1.0/instances/<name>/exec` REST API endpoint. When an instance is unpacked from an image archive, top-level symbolic links are extracted directly onto the host filesystem within the instance storage directory. If a crafted image includes a symbolic link named `exec-output` pointing to an arbitrary host path, invoking the execution endpoint with `record-output: true` causes the privileged host daemon to follow the symlink and write command output files directly to the target host directory. An authenticated attacker with permissions to import images and execute commands can exploit this flaw to write controlled content to sensitive host directories such as `/etc/cron.d`, resulting in arbitrary code execution on the host as `root`.
CVE-2026-48749 (tracked as GHSA-vghh-5rfx-xhq8 for LXD and GHSA-2q3f-q5pq-g8wv for Incus) is a critical container escape vulnerability in the Canonical LXD and Linux Containers Incus system container managers. By importing a specially crafted container image archive containing duplicate tar member headers, an authenticated attacker can replace the instance rootfs directory with a symbolic link pointing to the underlying host root filesystem. When performing file operations on a stopped container, the privileged forkfile helper binary resolves the symbolic link without confinement and chroots directly into the host filesystem, granting arbitrary root-level file read and write access.