Oct 6, 2026·5 min read·5 visits
Payload CMS fails to sanitize user documents in password reset and token refresh endpoints, allowing low-privileged authenticated users to access hidden or read-restricted fields across collection boundaries.
CVE-2026-105853 is a high-severity information disclosure vulnerability in Payload CMS that affects authentication-enabled collections. In vulnerable versions, the application fails to properly serialize and sanitize user documents during token refresh and password reset operations. This deficiency leaks hidden and read-restricted fields to unauthorized actors. Additionally, a logical flaw in token refresh validation allows low-privileged users to cross collection boundaries, exposing sensitive configuration details and administrative metadata.
Payload CMS is an open-source headless content management system built on Node.js. It features authentication-enabled collections, allowing developers to manage different classes of users (such as public users and administrators) with fine-grained access control policies. Each collection has its own schema where developers can define security attributes, including fields hidden from API responses (hidden: true) or fields restricted by custom read-access controls.
In affected versions, the endpoints responsible for processing token refresh and password reset operations contain integration flaws. They bypass the standard field-level serialization and sanitization pipelines. This omission exposes the raw user document directly to the client, undermining the security guarantees defined in the application schema.
Furthermore, the system fails to validate authorization boundaries between separate authentication collections during token refresh operations. This allows an authenticated user from a low-privilege collection to query the refresh endpoint of a high-privilege collection. The vulnerability represents a serious risk of internal privilege escalation and data harvesting in multi-tenant or multi-collection installations.
The underlying security issue is classified as CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor). It stems from two distinct logical errors in the authentication controllers.
First, standard Payload CMS operations run user documents through a sanitization pipeline before returning them to the client. This pipeline checks permissions and strips any fields flagged as hidden or fields that the requester does not have read-access to. However, the token refresh and password reset controllers directly retrieved user objects from the database and serialized them straight into the JSON response. This omission allowed any requester capable of triggering these endpoints to inspect internal system fields, custom roles, password reset tokens, and API keys.
Second, the token refresh operation did not enforce boundaries between different authenticated collections. When an authenticated client invokes the refresh endpoint, the application decodes the JSON Web Token (JWT) and validates the session. However, the system failed to verify whether the collection associated with the active token (req.user.collection) matched the target collection route being called (collectionConfig.slug). Consequently, a low-privilege user could submit their token to a high-privilege refresh route, bypassing namespace isolation and forcing the server to return the non-sanitized user document.
The fix for the collection-boundary validation bypass was introduced in commit f5f1283d275c58b30e2faa6be7cdc4d49451ea91 inside the file packages/payload/src/auth/operations/refresh.ts.
Prior to the patch, the refreshOperation handler validated the presence of the authenticated user in the request context but did not verify the collection source:
// Before Patch
if (!args.req.user) {
throw new Forbidden(args.req.t)
}The patch introduced strict checking of the user's collection against the collection configuration of the active route:
// After Patch
import { status as httpStatus } from 'http-status'
import { APIError, Forbidden } from '../../errors/index.js'
// ... within refreshOperation ...
if (!args.req.user) {
throw new Forbidden(args.req.t)
}
if (args.req.user.collection !== collectionConfig.slug) {
throw new APIError('Incorrect collection', httpStatus.FORBIDDEN)
}This addition ensures that if the authenticated user's collection identifier does not match the target collection slug, an explicit 403 Forbidden APIError is raised immediately. To mitigate the broader field-leakage issue, additional sanitization wrappers were added to the endpoint outputs, ensuring that all returned objects are filtered using the standard schema access-control rules.
An attacker can exploit this vulnerability through two separate vectors, depending on their level of access. In the first vector, the attacker exploits the cross-collection boundary to obtain hidden metadata. The workflow is demonstrated in the sequence diagram below:
In the second vector, an attacker triggers the password reset flow using the /api/users/forgot-password and /api/users/reset-password endpoints. When the reset is completed, the server returns the updated user document to the client. Because the handler lacks serialization, the response includes fields that are explicitly designated as hidden, such as internal access levels or secret keys.
The impact of this vulnerability is significant for multi-tenant and multi-role configurations. The disclosure of hidden fields allows attackers to read internal access control attributes, backend flags, and reference IDs that are crucial for application logic.
While the vulnerability does not directly allow remote code execution or unauthorized database modification, the leaked metadata often contains the information necessary to construct subsequent high-impact attacks. For example, exposing internal user roles or secret configuration variables can allow an attacker to identify flaws in custom access control hooks.
According to the CVSS v4.0 calculator, the base score is 7.1 (High) with the vector string CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N. This calculation indicates that the network-accessible, low-complexity exploit has high confidentiality impact on the target system.
The primary recommendation is to update the application dependencies to a secure version. The vendor has released patches that address both the collection validation logical flaw and the field-level leakage.
Users operating on the 3.x release branch must upgrade the core payload package to version 3.90.0 or higher. Users on the 4.x development or canary branches must upgrade to version 4.0.0-canary.34 or higher.
Additionally, developers utilizing custom authentication strategies must review their implementations. The vendor advisory notes that custom authentication strategies remain responsible for filtering user documents returned through custom responses. Developers must ensure that all custom login, token-refresh, or identity-validation endpoints manually run user records through the standard Payload sanitization utilities prior to transmitting payload structures.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
payload Payload CMS | >= 3.0.0, < 3.90.0 | 3.90.0 |
payload Payload CMS | >= 4.0.0-canary.0, < 4.0.0-canary.34 | 4.0.0-canary.34 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-200 |
| Attack Vector | Network (AV:N) |
| CVSS v4.0 Score | 7.1 |
| EPSS Score | Not yet populated |
| Impact | High Confidentiality Exposure |
| Exploit Status | poc |
| KEV Status | No |
The product exposes sensitive information to an actor who is not authorized to have access to that information.
A critical access control bypass vulnerability (CVE-2026-105851) in Payload CMS allows authenticated users to bypass field-level access controls during document duplication. By duplicating high-privilege documents, such as administrator accounts, standard users can inherit sensitive fields (e.g., role configurations or API keys), leading to privilege escalation.
An authorization bypass vulnerability in Payload CMS enables unauthenticated attackers to query and infer the existence of restricted documents via nested relationship queries on public collections. This cross-document contamination flaw affects both MongoDB and Drizzle SQL database adapters, allowing unauthorized reads of relationship metadata.
A high-severity race condition vulnerability exists in @payloadcms/plugin-ecommerce within the Stripe payment adapter's order confirmation pipeline. Unauthenticated attackers or parallel webhook deliveries can exploit sequential, non-atomic database operations to bypass state verifications, leading to duplicate order creation, multiple inventory decrements, and inconsistent database records.
A sensitive data exposure vulnerability in Payload CMS allows authenticated low-privilege users to retrieve decrypted, plaintext API keys of other users, including administrators, leading to full administrative account takeover and privilege escalation.
CVE-2026-86540 is a high-severity arbitrary code execution vulnerability in knowns, a repository management tool. The vulnerability occurs when the application parses and executes unvalidated language server binary overrides defined within a project's local configuration file.
Payload CMS, a popular open-source headless Content Management System, contains a critical Regular Expression Denial of Service (ReDoS) and uncontrolled resource consumption vulnerability in versions prior to 3.90.0 and canary versions prior to 4.0.0-canary.34. Due to nested quantifiers in the multipart boundary regex validation pattern, and the absence of streaming backpressure controls, remote attackers can trigger catastrophic backtracking and memory exhaustion. This blocks the single-threaded Node.js event loop, resulting in a persistent and complete Denial of Service (DoS).