CVE-2026-113662
## Summary `@apostrophecms/import-export`'s update-by-key feature lets an imported document carry a `<field>:key` property (for example `slug:key`) whose value is used to find an existing document to update instead of inserting a new one. `getUpdateKey()`/`insertOrUpdateDocWithKey()` (`lib/methods/import.js`) use that value directly as a MongoDB query value with no laundering: ```js const matchingDraftPromise = manager.findForEditing( req.clone({ mode: 'draft' }), { aposMode: 'draft', [updateField]: doc[updateKey] }).toObject(); ``` Archive documents are parsed with EJSON (see `lib/formats/gzip.js`), which revives objects such as `{ $ne: null }` as live values, the same untrusted data source and revival mechanism already fixed once in this module for `findSingletonAposDocId`/`findParkedAposDocId` in GHSA-79qf-vqgc-7xx3. That fix did not touch `insertOrUpdateDocWithKey`, so the identical class of bug survives here: a crafted `"slug:key": { "$ne": null }` entry in an archive's `aposDocs.json` makes the import match (and then update) an existing document the archive's author never actually identified, instead of failing to find a match. ## Impact Reaching this requires only an authenticated session with import access to the target type (the built-in contributor role holds this, matching the precondition of GHSA-79qf-vqgc-7xx3), and no admin interaction. Because the match uses a MongoDB operator instead of an exact value, it is not limited to a document the importer already knows the identifying field of: any existing document the importer has generic edit rights on and that satisfies the operator (which `{ $ne: null }` trivially does for any doc with a non-null value in that field) is a candidate, and Apostrophe's `findForEditing` permission filter, not the update-key logic, is the only thing narrowing which document actually gets matched and overwritten. Live-verified: a contributor-role request importing a document containing `"slug:key": { "$ne":
Properties
- Summary
- ApostropheCMS import-export: NoSQL injection via update-key value lets a crafted import match and overwrite an unidentified document
- Severity
- medium
- Nvd fetched at
- 2026-10-20T21:14:08.448323+00:00
- Cvss score
- 5.4
- Cvss severity
- MEDIUM
- Retrieved at
- 2026-10-21T01:23:59+00:00
- Ghsa published
- 2026-10-20T18:19:19Z
- Source url
- https://github.com/advisories/GHSA-jqw5-w6h3-44g6
- Ghsa updated
- 2026-10-20T18:19:20Z
- Ghsa id
- GHSA-jqw5-w6h3-44g6
- Last source
- GitHub Advisory Database
- Score
- 5.4
- Cvss version
- 3.1
- Cve id
- CVE-2026-113662
- Cvss vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
- First seen by Signal
- 2026-10-20T21:15:35+00:00
- Is ghsa only
- false
- Vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
- Published at
- 2026-10-20T18:17:19.693
- Last modified
- 2026-10-20T19:53:10.247
Related Entities (4)
HAS_WEAKNESS (2)
AFFECTS (1)
VULNERABLE_TO (1)
Explore deeper with Ninja Signal's threat intelligence graph