Medium

ApostropheCMS: Unauthenticated Unbounded Multipart Upload Leading to Disk-Exhaustion DoS

  • Disclosed: 20.10.2026
  • Updated: 20.10.2026 21:23

Summary

The form submission endpoint runs multer({ dest: os.tmpdir() }).any() before authentication, API-key, CSRF-equivalent, or form-existence logic, with no size, count, or rate limits. Unauthenticated users can stream unbounded bodies to disk per request; cleanup occurs only after the full body is received.

Details

packages/form/index.js apiRoutes.post.submit (L274–296): [ multer({ dest: os.tmpdir() }).any(), self.normalizeFiles, async function (req) { try { submitForm } finally { unlink files } } ]. No limits, no rate limiting, and no pre-validation. "CSRF" is a fixed-value double-submit cookie (vulnlab.csrf=csrf, set on any GET, express/index.js L694–703) — trivially obtainable anonymously.

PoC

bash
$ curl -s -c csrfjar.cookies http://localhost:3100/        # get vulnlab.csrf=csrf (any GET)
$ df -P /tmp                                                # before: used=1105212
$ curl -b csrfjar.cookies -X POST http://localhost:3100/api/v1/@apostrophecms/form/submit \
      -F "file=@/tmp/opencode/big.bin;type=application/octet-stream" &
   DURING transfer:    used=1148668
   still transferring: used=1226936        # +121MB mid-transfer on disk
   http=500 time=1.78s sent=209715411B     # generic error AFTER full staging
# Anonymous, zero credentials. 200MB written to /tmp pre-validation.

Impact

Any unauthenticated client can force the server to persist entire request bodies to the temporary filesystem and CPU-decode them; parallel requests exhaust disk /tmp (process/host crash) and saturate the event loop, resulting in a remote denial-of-service (DoS). Aborted transfers risk orphaning staged files (no req.aborted cleanup).

What to do

Upgrade @apostrophecms/form to version 1.5.5 or later.

Additionally, configure multer limits (fileSize, fields, parts, fieldSize); perform authentication, role, or existence checks before the multer mount or inside the checked handler; unlink staged files on first read and on req.aborted/error; and implement per-IP rate limiting.

Affected software

Click a technology to see all vulnerabilities affecting it.

PlatformPackageVulnerable versionsFixed in
npm package @apostrophecms/form < 1.5.5 1.5.5

References

CVSS score 5.3/10
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Weakness (CWE)
CWE-770
Platform
npm
Package
@apostrophecms/form
Disclosed
20.10.2026
Updated
20.10.2026 21:23

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

OSV / GitHub Advisory Database - GHSA-89mh-mm8c-mv7f - CC BY 4.0

Vulnerability history: @apostrophecms/form

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

Total entries
2
First → latest
10.2026 10.2026
Without a fix
0
Exploited in attacks
0

Severity breakdown

  • Medium 2

Disclosures per year

  1. 2026: 2
  1. ApostropheCMS: Unauthenticated Unbounded Multipart Upload Leading to Disk-Exhaustion DoS this entry
    Medium · 5.3 CVE-2026-113656 < 1.5.5 1.5.5
  2. Medium CVE-2026-113667 < 1.5.5 1.5.5

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.