Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
📦
📦 npm
Not in CISA KEV
LOW severity

ApostropheCMS: Missing Authentication in `cleanExport` RouteGHSA-rw26-wwfc-9wvm

LOWFix: apostrophecms/apostrophe@06e4b37

GHSA-rw26-wwfc-9wvm 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.

Also known asCVE-2026-113648
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Oct 23, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

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 GHSA-rw26-wwfc-9wvm.

EPSS Exploitation Probability

via FIRST.org ↗
0.3%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs25th percentile — riskier than 25% of all scored CVEsHighest risk

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

GHSA-rw26-wwfc-9wvm 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

1 pkg affected

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.

0other npm packages depend on this — each one inherits the vulnerability until it's patched upstream
@apostrophecms/import-exportnpm
986downloads / week

Description

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

  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:

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

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
📦npm@apostrophecms/import-exportall versions3.7.1npm install @apostrophecms/import-export@3.7.1

Detection & mitigation playbook

Open-source dependency
  1. Detect

    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.

  2. 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 GHSA-rw26-wwfc-9wvm is resolved across your whole dependency graph.

  3. 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

#### 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:
O3 Security · Impact-Aware SCA

Is GHSA-rw26-wwfc-9wvm in your dependencies?

Find it across npm, including transitive dependencies.

ApostropheCMS: Missing Authentication in `cleanExport`…