CVE-2026-113648 is a low-severity (CVSS 3.1) Missing Authentication vulnerability in @apostrophecms/import-export. A fix is available for @apostrophecms/import-export — see the affected versions and patch details below.
ApostropheCMS: Missing Authentication in `cleanExport` Route
Exploitation Status
No confirmed exploitation observed yet
- CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.
Exploitation and automatability from CISA’s SSVC triage for CVE-2026-113648.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
CVE-2026-113648 by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 394,803 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.
@apostrophecms/import-exportnpmDescription
1. Summary
The API endpoint POST /api/v1/@apostrophecms/import-export/clean-export in @apostrophecms/import-export lacks authentication and authorization checks. Any client—including unauthenticated anonymous users who have obtained the standard CSRF cookie from visiting the site—can directly invoke this route and trigger the underlying self.cleanExport(req) method.
2. Affected Files & Endpoints
- Endpoint:
POST /api/v1/@apostrophecms/import-export/clean-export - Route Definition:
packages/import-export/lib/apiRoutes.js(lines 32–34) - Method Implementation:
packages/import-export/lib/methods/import.js(lines 1271–1324)
3. Root Cause Analysis
In packages/import-export/lib/apiRoutes.js, the get.related handler explicitly validates that the caller is logged in:
get: {
async related(req) {
if (!req.user) {
throw self.apos.error('forbidden');
}
// ...
}
}
In contrast, post.cleanExport (as well as post.overrideDuplicates) lacks any verification of req.user:
post: {
async overrideDuplicates(req) {
return self.overrideDuplicates(req);
},
async cleanExport(req) {
return self.cleanExport(req); // <-- No authentication check
}
}
Because ApostropheCMS does not enforce authentication globally on all apiRoutes, omitting an explicit if (!req.user) guard allows anonymous requests to pass directly through to the business logic layer.
4. Evidence
When sending an unauthenticated POST request with the site’s CSRF cookie (issued to any visitor on GET /), the request bypasses access control entirely and executes self.cleanExport(req), as demonstrated by the server stack trace:
at Object.cleanExport (.../packages/import-export/lib/methods/import.js)
at .../packages/apostrophe/modules/@apostrophecms/module/index.js:193:30
This confirms that execution directly reaches the core import-export handler without an authenticated session.
5. Impact
- Broken Access Control: Unauthenticated users can invoke cleanup operations and delete temporary export files and artifacts stored on the server.
- Unauthorized State Mutation: The endpoint allows modifying job records in the database via
req.body.jobId(forcing them toended: true, status: 'completed') and dismissing notifications viareq.body.notificationIdwithout verifying whether the resources belong to the requesting caller.
6. Suggested Remediation (Patch)
Enforce an authentication check in packages/import-export/lib/apiRoutes.js before executing the underlying methods:
--- a/packages/import-export/lib/apiRoutes.js
+++ b/packages/import-export/lib/apiRoutes.js
@@ -26,10 +26,16 @@ module.exports = self => {
get: { ... },
post: {
async overrideDuplicates(req) {
+ if (!req.user) {
+ throw self.apos.error('forbidden');
+ }
return self.overrideDuplicates(req);
},
async cleanExport(req) {
+ if (!req.user) {
+ throw self.apos.error('forbidden');
+ }
return self.cleanExport(req);
}
}
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | @apostrophecms/import-export | all versions | 3.7.1npm install @apostrophecms/import-export@3.7.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for @apostrophecms/import-export, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update @apostrophecms/import-export to 3.7.1 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-113648 is resolved across your whole dependency graph.
Workarounds
Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.
Frequently Asked Questions
Is CVE-2026-113648 in your dependencies?
Find it across npm, including transitive dependencies.