← Back to Feed CACHED · 2026-08-29 13:42:21 · CACHE_KEY CVE-2026-82333
CVE-2026-82333 · CWE-400 · Disclosed 2026-08-28

multer is a middleware for handling multipart/form-data in Node.js.

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Leaving a doorstop jammed in the revolving door so nobody else can get through

CVE-2026-82333 is a denial-of-service flaw in multer, the dominant file-upload middleware for Express / Node.js (~20 million weekly npm downloads). A crafted multipart request containing two text fields — one with a huge numeric array index (e.g. field[4294967294]), and a second with a non-numeric key — forces the internal append-field dependency to synchronously iterate a maximum-length sparse array. Because Node.js is single-threaded, this blocks the event loop and the entire process stops serving traffic. All versions before 2.3.0 are affected. The fix in 2.3.0 adds a limits.fieldArrayIndexLimit option that rejects oversized indexes before allocation.

The vendor severity of HIGH / 7.5 is honest. The CVSS vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) correctly reflects unauthenticated, zero-interaction, network-reachable availability destruction. Some teams reflexively dismiss DoS bugs, but this one deserves respect: the payload is measured in bytes, requires zero authentication, works on every default multer installation, and the installed base is enormous. A single HTTP request can flatline a production API. The vendor score is fair — noisgate leaves it unchanged.

"One tiny multipart POST blocks the entire Node.js event loop — trivial DoS at massive scale."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify a multer-backed upload endpoint

The attacker locates any route that accepts multipart/form-data — file upload forms, avatar endpoints, import wizards. These are trivially discoverable via HTML source, OpenAPI specs, or by sending a multipart POST and watching for multer-specific error shapes. No authentication is required if the endpoint is publicly reachable.
Conditions required:
  • Network access to a Node.js application using multer < 2.3.0
  • At least one route accepting multipart/form-data
Where this breaks in practice:
  • Endpoint may sit behind a WAF or API gateway that enforces request-body size limits
  • Load balancer health checks may restart the worker, limiting sustained impact
Detection/coverage: Standard web scanners (Nuclei, npm audit, Snyk) flag vulnerable multer versions. WAF logs will show unusual field names with very large numeric indexes.
STEP 02

Craft a two-field multipart payload

The attacker constructs a minimal multipart body with two fields. The first field name uses a massive numeric index like data[4294967294], causing V8 to allocate a maximum-length sparse array internally. The second field uses a non-numeric key (e.g. data[trigger]), which forces append-field to iterate the entire sparse array synchronously looking for the insertion point. No special tooling is needed — curl suffices.
Conditions required:
  • Knowledge of the sparse-array iteration behavior in append-field
Where this breaks in practice:
  • Payload is trivially simple — essentially no friction for the attacker
STEP 03

Send the request to block the event loop

The attacker sends one or more of these crafted requests. Each request blocks the Node.js event loop for seconds to minutes depending on hardware, during which the process cannot serve any other request. In a single-worker deployment this is a complete outage. In a clustered deployment (e.g. PM2, Kubernetes pods), one request takes out one worker; the attacker sends N requests to take out N workers.
Conditions required:
  • HTTP connectivity to the target endpoint
Where this breaks in practice:
  • Clustered deployments require one request per worker to achieve full outage
  • Rate limiting or connection caps may throttle the attacker
  • CDN or reverse proxy may cache/reject malformed requests
Detection/coverage: APM tools (Datadog, New Relic) will show event-loop lag spikes. Process monitors will detect unresponsive workers.
STEP 04

Sustained denial of service

The attacker repeats the request at intervals matching the target's auto-restart cadence. Since the payload is tiny and the effect is immediate, sustaining the attack requires minimal bandwidth. The application remains unavailable to legitimate users for the duration of the attack.
Conditions required:
  • Ability to send repeated HTTP requests (no rate-limit enforcement)
Where this breaks in practice:
  • Automated restarts (PM2, systemd, k8s liveness probes) restore service between bursts
  • IP-based rate limiting or geo-blocking reduces sustained impact
Detection/coverage: SIEM correlation on repeated event-loop stalls from the same source IP or user-agent pattern.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo confirmed active exploitation as of 2026-08-29. Not listed on CISA KEV. No campaigns or threat-actor reporting found.
Proof-of-ConceptNo standalone PoC repository found, but the attack is trivially reproducible with a two-line curl command. The advisory description itself is effectively a recipe. Credited reporter: O4FDev.
EPSS ScoreNot yet scored (disclosed 2026-08-28, EPSS typically lags 24–72 hours). Expect a moderate EPSS given network/unauth/low-complexity vector.
KEV StatusNot listed as of 2026-08-29.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H — unauthenticated remote DoS, no confidentiality or integrity impact. Availability-only HIGH.
Affected VersionsAll multer versions < 2.3.0 (including the entire 1.x LTS line). This covers the vast majority of the installed base.
Fixed Versionmulter 2.3.0 — adds limits.fieldArrayIndexLimit (opt-in). Remediation developers: UlisesGascon, arpitjain099.
Exposure / Installed Base~20 million weekly npm downloads. Multer is the de facto file-upload middleware for Express.js. Shodan/Censys won't directly fingerprint it, but the npm footprint implies massive exposure across SaaS, internal tools, and APIs.
Disclosure Date2026-08-28 via GitHub Security Advisory GHSA-535w-7cp7-47q4.
Related CVEsCVE-2026-5079 (nested field names DoS, fixed in 2.2.0), CVE-2026-3304 (malformed request DoS, fixed in 2.1.0), CVE-2025-47935 (unclosed streams DoS, fixed in 2.0.0). Multer has had a cluster of DoS fixes across 2025–2026.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (7.5/10)

The single most decisive factor is the trivial exploitability against a massive installed base — one unauthenticated HTTP request with a bytes-sized payload can freeze any multer-backed Node.js process. The availability-only impact ceiling (no RCE, no data breach) keeps this at HIGH rather than CRITICAL, but the zero-friction attack path and 20M-weekly-download footprint make any downgrade indefensible.

HIGH Vulnerability description and attack mechanics
HIGH Affected and fixed version ranges
MEDIUM Absence of in-the-wild exploitation (1-day-old disclosure, limited visibility)

Why this verdict

  • Zero-friction exploit: The attack requires no authentication, no user interaction, no special tooling — a single curl command suffices. There are no meaningful prerequisites that narrow the attacker population.
  • Massive installed base: ~20 million weekly npm downloads means this vulnerability is present across a huge swath of production Node.js applications. The 'all versions before 2.3.0' scope covers nearly the entire user population since 2.3.0 was just released.
  • Event-loop monopolization is process-fatal: Unlike memory-leak DoS bugs that degrade gradually, this blocks the event loop synchronously — the process is instantly unresponsive. In single-worker deployments, one request = full outage.
  • Role multiplier: Multer is application-tier middleware, not infrastructure. It runs in web application servers, API backends, and SaaS platforms. While some CI/CD systems (Jenkins plugins, GitLab integrations) or internal tools may use it, the canonical role is a line-of-business application server. The blast radius per exploit is process-level (not domain/fleet/supply-chain), and the impact is availability only. No high-value-role floor override is triggered because DoS on an app process does not chain into domain takeover, credential theft, or lateral movement.

Why not higher?

CRITICAL would require either confidentiality/integrity impact (RCE, data exfiltration) or a fleet-scale blast radius from a single exploitation event. This bug is availability-only — it freezes one process per request. Clustered deployments require proportionally more requests. There is no path from this DoS to code execution or data breach, and the affected component is application-tier middleware, not a canonical high-value infrastructure role (hypervisor, DC, IdP, backup).

Why not lower?

Downgrading to MEDIUM would ignore the reality that this is an unauthenticated, zero-complexity, network-reachable attack against one of the most widely deployed npm packages in existence. The payload is trivial, no PoC is even needed — the advisory description is the PoC. DoS bugs in middleware this ubiquitous cause real production outages, and the upgrade path from 1.x to 2.3.0 is non-trivial for many teams, meaning exposure will persist for months.

05 · Compensating Control

What to do — in priority order.

  1. Set multer field limits immediately — If you cannot upgrade to 2.3.0 right away, configure limits.fields to the minimum number your application actually needs (e.g. limits: { fields: 10 }). This won't block the sparse-array allocation but reduces attack surface. Deploy within the noisgate HIGH mitigation SLA of 30 days.
  2. Deploy a WAF rule rejecting oversized field-name indexes — Add a WAF or reverse-proxy rule (nginx, Cloudflare, AWS WAF) that blocks multipart field names matching patterns like field[\d{6,}] — any numeric array index over 5–6 digits. This stops the payload before it reaches multer. Deploy within 30 days.
  3. Run Node.js in cluster mode with health checks — Use PM2 cluster mode, Kubernetes liveness probes, or systemd watchdog timers so that a blocked worker is automatically restarted. This limits sustained impact to brief availability blips per attack request.
  4. Enforce per-IP rate limiting on upload endpoints — Apply rate limits (e.g. 10 req/min per IP) on any route accepting multipart/form-data. This prevents an attacker from sustaining a prolonged outage by continuously re-sending the payload.
  5. Upgrade to multer 2.3.0 — The definitive fix. After upgrading, explicitly set limits.fieldArrayIndexLimit to your application's actual maximum (e.g. 100). Complete within the noisgate HIGH remediation SLA of 180 days.
What doesn't work
  • Request body size limits alone — the malicious payload is tiny (under 1 KB). A 10 MB upload cap won't stop it.
  • Content-Type filtering — the attack uses a legitimate multipart/form-data Content-Type; blocking it would break your upload functionality.
  • Network-layer DDoS protection (e.g. Cloudflare DDoS mitigation) — this is an application-layer attack using a single valid HTTP request, not a volumetric flood. L3/L4 DDoS shields won't catch it.
06 · Verification

Crowdsourced verification payload.

Run this on any host where your Node.js application is deployed, or in your CI pipeline against your package-lock.json / node_modules. Requires read access to the project directory. Example: bash check_multer_cve_2026_82333.sh /opt/myapp

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_multer_cve_2026_82333.sh — Detect multer versions vulnerable to CVE-2026-82333
# Usage: bash check_multer_cve_2026_82333.sh <path-to-node-project>
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN

set -euo pipefail

PROJECT_DIR="${1:-.}"

if [ ! -d "$PROJECT_DIR" ]; then
  echo "UNKNOWN — directory '$PROJECT_DIR' does not exist"
  exit 2
fi

# Try package-lock.json first
LOCKFILE="$PROJECT_DIR/package-lock.json"
if [ -f "$LOCKFILE" ]; then
  MULTER_VER=$(python3 -c "
import json, sys
with open('$LOCKFILE') as f:
    lock = json.load(f)
# npm v2+ lockfile structure
packages = lock.get('packages', {})
for key, val in packages.items():
    if key.endswith('/multer') or key == 'multer':
        print(val.get('version', ''))
        sys.exit(0)
# npm v1 lockfile structure
deps = lock.get('dependencies', {})
if 'multer' in deps:
    print(deps['multer'].get('version', ''))
    sys.exit(0)
print('')
" 2>/dev/null)
else
  # Fallback: check installed node_modules
  PKGJSON="$PROJECT_DIR/node_modules/multer/package.json"
  if [ -f "$PKGJSON" ]; then
    MULTER_VER=$(python3 -c "import json; print(json.load(open('$PKGJSON')).get('version',''))" 2>/dev/null)
  else
    echo "UNKNOWN — multer not found in $PROJECT_DIR"
    exit 2
  fi
fi

if [ -z "$MULTER_VER" ]; then
  echo "UNKNOWN — could not determine multer version"
  exit 2
fi

echo "Detected multer version: $MULTER_VER"

# Compare version — vulnerable if < 2.3.0
IS_PATCHED=$(python3 -c "
from packaging.version import Version
try:
    v = Version('$MULTER_VER')
    print('yes' if v >= Version('2.3.0') else 'no')
except Exception:
    print('unknown')
" 2>/dev/null || echo "unknown")

if [ "$IS_PATCHED" = "yes" ]; then
  echo "PATCHED — multer $MULTER_VER >= 2.3.0"
  exit 0
elif [ "$IS_PATCHED" = "no" ]; then
  echo "VULNERABLE — multer $MULTER_VER < 2.3.0 (CVE-2026-82333)"
  exit 1
else
  echo "UNKNOWN — could not parse version '$MULTER_VER'"
  exit 2
fi
07 · Bottom Line

If you remember one thing.

TL;DR
CVE-2026-82333 dropped yesterday and affects virtually every multer installation in your fleet. Monday morning: run npm ls multer across your Node.js estate to identify every affected service. Immediately deploy WAF rules blocking multipart field names with large numeric indexes (e.g. reject field[\\d{6,}] patterns) — this buys time. Under the noisgate mitigation SLA for HIGH, get compensating controls (WAF rules, rate limits, cluster-mode health checks) in place within 30 days. Under the noisgate remediation SLA, complete the upgrade to multer 2.3.0 (and explicitly set limits.fieldArrayIndexLimit) within 180 days. Prioritize internet-facing services and any single-worker deployments first, as these are most exposed to instant full outage from a single request.

Sources

  1. GitHub Security Advisory GHSA-535w-7cp7-47q4
  2. CVE-2026-82333 — THREATINT
  3. GBHackers — Critical Multer Vulnerability
  4. Express.js June 2026 Security Releases
  5. multer on npm
  6. NestJS Issue #9489 — Multer CVE Discussion
  7. Snyk — multer package security
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.