Tenant authorization bypass in Payload Multi-Tenant Plugin
Key facts
- Attack vector
- Network
- Privileges required
- Low
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- None
- Impact type
- Security bypass
- Confidentiality · integrity · availability
- None · High · None
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA and GitHub. Impact type from CWE-862.
Summary
Versions of @payloadcms/plugin-multi-tenant before 3.90.0 and from 4.0.0-canary.0 before 4.0.0-canary.34 in Payload are affected. Missing authorization (CWE-862) in the default tenant array field access lets an authenticated user assign their own account to other tenants. Deployments that replace the default with secured tenants arrayFieldAccess create and update functions are not affected.
Written with Claude Haiku 5.5 from the sources below · 2026-10-29
Description from the CNA
Payload is a free and open source headless content management system. In @payloadcms/plugin-multi-tenant versions before 3.90.0 and canary versions before 4.0.0-canary.34, the default tenant array field access allows an authenticated user to assign the user's own account to other tenants. Deployments that replace the default behavior with secured tenants arrayFieldAccess.create and tenants arrayFieldAccess.update functions are not affected by this behavior. This issue is fixed in versions 3.90.0 and 4.0.0-canary.34.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- No
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| payloadcms | payload | before 3.90.0; 4.0.0-canary.0 to before 4.0.0-canary.34 | 3.90.0, 4.0.0-canary.34 | Patch available | CNA |
| — | @payloadcms/plugin-multi-tenant (npm) | before 3.90.0 | 3.90.0 | Patch available | GHSA-p96c-xwx8-3cqj |
| — | @payloadcms/plugin-multi-tenant (npm) | 4.0.0-canary.0 to before 4.0.0-canary.34 | 4.0.0-canary.34 | Patch available | GHSA-p96c-xwx8-3cqj |
- payload Vendorpayloadcms Affected before 3.90.0; 4.0.0-canary.0 to before 4.0.0-canary.34 Fixed in 3.90.0, 4.0.0-canary.34 Patch available CNA
- @payloadcms/plugin-multi-tenant (npm) Vendor— Affected before 3.90.0 Fixed in 3.90.0 Patch available GHSA-p96c-xwx8-3cqj
- @payloadcms/plugin-multi-tenant (npm) Vendor— Affected 4.0.0-canary.0 to before 4.0.0-canary.34 Fixed in 4.0.0-canary.34 Patch available GHSA-p96c-xwx8-3cqj
CPE configurations NVD · 35
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:payloadcms:payload:*:*:*:*:*:node.js:*:* | before 3.90.0 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary0:*:*:*:node.js:*:* | 4.0.0 canary0 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary1:*:*:*:node.js:*:* | 4.0.0 canary1 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary10:*:*:*:node.js:*:* | 4.0.0 canary10 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary11:*:*:*:node.js:*:* | 4.0.0 canary11 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary12:*:*:*:node.js:*:* | 4.0.0 canary12 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary13:*:*:*:node.js:*:* | 4.0.0 canary13 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary14:*:*:*:node.js:*:* | 4.0.0 canary14 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary15:*:*:*:node.js:*:* | 4.0.0 canary15 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary16:*:*:*:node.js:*:* | 4.0.0 canary16 | Vulnerable | payloadcms |
- cpe:2.3:a:payloadcms:payload:*:*:*:*:*:node.js:*:* Versions before 3.90.0 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary0:*:*:*:node.js:*:* Versions 4.0.0 canary0 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary1:*:*:*:node.js:*:* Versions 4.0.0 canary1 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary10:*:*:*:node.js:*:* Versions 4.0.0 canary10 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary11:*:*:*:node.js:*:* Versions 4.0.0 canary11 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary12:*:*:*:node.js:*:* Versions 4.0.0 canary12 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary13:*:*:*:node.js:*:* Versions 4.0.0 canary13 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary14:*:*:*:node.js:*:* Versions 4.0.0 canary14 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary15:*:*:*:node.js:*:* Versions 4.0.0 canary15 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary16:*:*:*:node.js:*:* Versions 4.0.0 canary16 Vulnerable ·payloadcms
Show 25 more CPE
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:payloadcms:payload:4.0.0:canary17:*:*:*:node.js:*:* | 4.0.0 canary17 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary18:*:*:*:node.js:*:* | 4.0.0 canary18 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary19:*:*:*:node.js:*:* | 4.0.0 canary19 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary2:*:*:*:node.js:*:* | 4.0.0 canary2 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary20:*:*:*:node.js:*:* | 4.0.0 canary20 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary21:*:*:*:node.js:*:* | 4.0.0 canary21 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary22:*:*:*:node.js:*:* | 4.0.0 canary22 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary23:*:*:*:node.js:*:* | 4.0.0 canary23 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary24:*:*:*:node.js:*:* | 4.0.0 canary24 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary25:*:*:*:node.js:*:* | 4.0.0 canary25 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary26:*:*:*:node.js:*:* | 4.0.0 canary26 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary27:*:*:*:node.js:*:* | 4.0.0 canary27 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary28:*:*:*:node.js:*:* | 4.0.0 canary28 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary29:*:*:*:node.js:*:* | 4.0.0 canary29 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary3:*:*:*:node.js:*:* | 4.0.0 canary3 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary30:*:*:*:node.js:*:* | 4.0.0 canary30 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary31:*:*:*:node.js:*:* | 4.0.0 canary31 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary32:*:*:*:node.js:*:* | 4.0.0 canary32 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary33:*:*:*:node.js:*:* | 4.0.0 canary33 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary4:*:*:*:node.js:*:* | 4.0.0 canary4 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary5:*:*:*:node.js:*:* | 4.0.0 canary5 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary6:*:*:*:node.js:*:* | 4.0.0 canary6 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary7:*:*:*:node.js:*:* | 4.0.0 canary7 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary8:*:*:*:node.js:*:* | 4.0.0 canary8 | Vulnerable | payloadcms |
| cpe:2.3:a:payloadcms:payload:4.0.0:canary9:*:*:*:node.js:*:* | 4.0.0 canary9 | Vulnerable | payloadcms |
- cpe:2.3:a:payloadcms:payload:4.0.0:canary17:*:*:*:node.js:*:* Versions 4.0.0 canary17 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary18:*:*:*:node.js:*:* Versions 4.0.0 canary18 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary19:*:*:*:node.js:*:* Versions 4.0.0 canary19 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary2:*:*:*:node.js:*:* Versions 4.0.0 canary2 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary20:*:*:*:node.js:*:* Versions 4.0.0 canary20 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary21:*:*:*:node.js:*:* Versions 4.0.0 canary21 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary22:*:*:*:node.js:*:* Versions 4.0.0 canary22 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary23:*:*:*:node.js:*:* Versions 4.0.0 canary23 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary24:*:*:*:node.js:*:* Versions 4.0.0 canary24 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary25:*:*:*:node.js:*:* Versions 4.0.0 canary25 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary26:*:*:*:node.js:*:* Versions 4.0.0 canary26 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary27:*:*:*:node.js:*:* Versions 4.0.0 canary27 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary28:*:*:*:node.js:*:* Versions 4.0.0 canary28 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary29:*:*:*:node.js:*:* Versions 4.0.0 canary29 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary3:*:*:*:node.js:*:* Versions 4.0.0 canary3 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary30:*:*:*:node.js:*:* Versions 4.0.0 canary30 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary31:*:*:*:node.js:*:* Versions 4.0.0 canary31 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary32:*:*:*:node.js:*:* Versions 4.0.0 canary32 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary33:*:*:*:node.js:*:* Versions 4.0.0 canary33 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary4:*:*:*:node.js:*:* Versions 4.0.0 canary4 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary5:*:*:*:node.js:*:* Versions 4.0.0 canary5 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary6:*:*:*:node.js:*:* Versions 4.0.0 canary6 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary7:*:*:*:node.js:*:* Versions 4.0.0 canary7 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary8:*:*:*:node.js:*:* Versions 4.0.0 canary8 Vulnerable ·payloadcms
- cpe:2.3:a:payloadcms:payload:4.0.0:canary9:*:*:*:node.js:*:* Versions 4.0.0 canary9 Vulnerable ·payloadcms
Remediation
Update @payloadcms/plugin-multi-tenant to 3.90.0 or to 4.0.0-canary.34. The sources list no fixed version for payload.
Written with Claude Haiku 5.5 from the sources below · 2026-10-29
- Fix · CNA payload (payloadcms) Fixed in 3.90.0, 4.0.0-canary.34
- Fix · GHSA-p96c-xwx8-3cqj @payloadcms/plugin-multi-tenant (npm) Fixed in 3.90.0 Advisory →
- Fix · GHSA-p96c-xwx8-3cqj @payloadcms/plugin-multi-tenant (npm) Fixed in 4.0.0-canary.34 Advisory →
Timeline
- 2026-10-06 Threatist record created from CVE-2026-105860
- 2026-10-07 Alias added: GHSA-p96c-xwx8-3cqj
- 2026-10-07 Fix available: npm/@payloadcms/[email protected], npm/@payloadcms/[email protected] · GHSA-p96c-xwx8-3cqj
- 2026-10-07 CVSS score added · GHSA-p96c-xwx8-3cqj
- 2026-10-07 Weakness changed · GHSA-p96c-xwx8-3cqj
- 2026-10-07 5 new references · GHSA-p96c-xwx8-3cqj
- 2026-10-15 CVSS score added · NVD
References
Patch 2
Advisory 2
More payloadcms Payload vulnerabilities
- TI-2026-20653 Payload has an SQL Injection in JSON/RichText Queries on PostgreSQL/SQLite Adapters CVSS 3.1CRITICAL 9.8
- TI-2026-68608 Payload CMS lets attackers update collection documents CVSS 3.1CRITICAL 9.8
- TI-2026-68606 Remote code execution in Payload Form Builder plugin CVSS 3.1CRITICAL 10.0
- TI-2026-68612 Payload authentication token field handling issue CVSS 4.0CRITICAL 9.2
- TI-2026-26995 Payload has Unvalidated Input in Password Recovery Endpoints CVSS 3.1CRITICAL 9.1
- TI-2026-68489 Field access control bypass in Payload duplicate operation CVSS 4.0CRITICAL 9.3
Sources
- CVE-2026-105860 · CVE Program
- CVE-2026-105860 · NVD
- FIRST EPSS
- GHSA-p96c-xwx8-3cqj · GitHub Advisory Database · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences