Low

ApostropheCMS: Missing Authentication in `cleanExport` Route

  • Disclosed: 21.10.2026
  • Updated: 21.10.2026 20:24

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:

js
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:

js
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

  1. Broken Access Control: Unauthenticated users can invoke cleanup operations and delete temporary export files and artifacts stored on the server.
  2. Unauthorized State Mutation: The endpoint allows modifying job records in the database via req.body.jobId (forcing them to ended: true, status: 'completed') and dismissing notifications via req.body.notificationId without 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:

diff
--- 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);
       }
     }

What to do

Update @apostrophecms/import-export to version 3.7.1 or later. Alternatively, implement an authentication check in packages/import-export/lib/apiRoutes.js before executing the underlying methods.

Affected software

Click a technology to see all vulnerabilities affecting it.

PlatformPackageVulnerable versionsFixed in
npm package @apostrophecms/import-export < 3.7.1 3.7.1

References

CVSS score 3.1/10
CVSS vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
Weakness (CWE)
CWE-306, CWE-862
Platform
npm
Package
@apostrophecms/import-export
Disclosed
21.10.2026
Updated
21.10.2026 20:24

Sources and licenses · Edited or translated by DockRay; source rights and applicable licenses are retained.

OSV / GitHub Advisory Database - GHSA-rw26-wwfc-9wvm - CC BY 4.0

Vulnerability history: @apostrophecms/import-export

All published vulnerabilities of this package (npm package), newest first. Shows whether this is a one-off slip or a package that needs watching.

All (9) in the archive
Total entries
9
First → latest
03.2026 10.2026
Without a fix
0
Exploited in attacks
0

Severity breakdown

  • Critical 1
  • High 1
  • Medium 6
  • Low 1

Disclosures per year

  1. 2026: 9
Severity:
  1. ApostropheCMS: Missing Authentication in `cleanExport` Route this entry
    Low · 3.1 CVE-2026-113648 < 3.7.1 3.7.1

Know which vulnerabilities affect your application

With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.

Connect your application
DockRay newsletter

Application security in your inbox

Important vulnerabilities, actionable guidance and practical advice for your applications. Choose your technologies and follow what matters to your project.

  • A daily digest of new vulnerabilities, critical ones included.
  • Notifications about important updates.
  • Practical advice on application security and monitoring.

Leave empty to receive updates for every technology.

Free to subscribe. Unsubscribe with one click in any email.