CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-88932

CVE-2026-88932: Uncontrolled Resource Consumption (Denial of Service) via orphaned disk writes on aborted uploads in multer

Alon Barad
Alon Barad
Software Engineer

Sep 29, 2026·6 min read·3 visits

Executive Summary (TL;DR)

Unauthenticated remote attackers can exhaust server disk space and trigger a denial of service (DoS) by initiating and immediately aborting multipart file uploads before multer completes file path resolution.

An uncontrolled resource consumption vulnerability exists in the multer middleware for Node.js (versions 2.2.0 through 2.3.0) when handling aborted multipart uploads using disk storage. Due to an asynchronous race condition in path resolution, files can become permanently orphaned on disk, leading to storage exhaustion and denial of service.

Vulnerability Overview

The Node.js middleware multer is widely used to handle multipart/form-data uploads in Express-based applications. When handling file uploads, the middleware relies on storage engines such as diskStorage or memoryStorage to manage stream ingestion. The disk storage engine provides configurable parameters to define destination directories and file naming conventions. These configuration options often execute asynchronously to allow integrations with databases, UUID generators, or filesystem calls.

In versions 2.2.0 through 2.3.0, multer suffers from a state synchronization deficiency that results in uncontrolled resource consumption. When a client initiates a file upload and subsequently aborts the HTTP request, the middleware attempts to clean up active and completed writes. However, if the abort event occurs during the asynchronous name-resolution phase, the cleaning mechanism fails to detect the in-progress write operation.

This vulnerability is classified under CWE-400 (Uncontrolled Resource Consumption) and CWE-459 (Incomplete Cleanup). Unauthenticated remote attackers can abuse this state-tracking failure to consume all available disk space on the host operating system. The resulting storage exhaustion can degrade application performance, disrupt database write operations, and cause a complete system denial of service.

Root Cause Analysis

The underlying issue stems from a race condition between the HTTP request termination lifecycle and the file storage engine's lifecycle. When a multipart upload begins, multer tracks files inside two internal arrays: uploadedFiles (completed writes) and pendingFiles (active writes). When using asynchronous filename or destination callbacks, the storage engine takes a non-zero duration to assign a unique file path on the filesystem. During this initial async window, the file object is placed in pendingFiles but does not yet possess a populated path property.

If the client connection is aborted or terminated before the async callbacks resolve, the middleware intercepts the abort event and invokes finishAbort(). This function is responsible for gathering all files that must be removed and calling the appropriate cleanup methods. To identify files currently being written, the cleanup routine filters the pendingFiles list using a check for the path attribute.

// Vulnerable filtering logic in finishAbort
var filesToRemove = uploadedFiles.concat(
  pendingFiles.filter(function (f) { return f.path })
);

Because the path assignment callback is still pending, f.path resolves to undefined. The filtering logic consequently omits the file from the filesToRemove list. When the asynchronous path resolution eventually completes, the storage engine proceeds to open a write stream and write the payload to the disk. Because the abort cleanup routine has already executed and returned, no further cleanup processes are scheduled, and the late-arriving file is permanently orphaned in the upload directory.

Code Analysis and Patch Assessment

To address this vulnerability, the patch introduced in version 2.4.0 (commit 53337f9713619ef3381ee6b4e541f926dbaac305) establishes explicit state tracking for the abort sequence. The middleware now maintains an abortCleanupDone boolean and an abortRemovedFiles tracking set.

The fix updates lib/make-middleware.js to modify the completion callback inside _handleFile. If the storage engine completes file creation after finishAbort has already completed, the middleware intercepts this state and checks if the file has already been scheduled for deletion.

// Patched logic handling late-completion files
if (abortCleanupDone) {
  if (abortRemovedFiles.has(file)) {
    appender.removePlaceholder(placeholder)
    decrementPendingWrites()
    return
  }
 
  return storage._removeFile(req, fileInfo, function () {
    appender.removePlaceholder(placeholder)
    decrementPendingWrites()
  })
}

This code ensures that if abortCleanupDone is set to true, any file whose storage engine completes writing afterwards is immediately deleted using _removeFile(). This modification completely closes the race condition window. Even if the path is resolved and the write succeeds after the connection terminates, the file is guaranteed to be deleted immediately upon completion.

Exploitation Methodology

Exploiting this vulnerability does not require authentication or complex payload generation. An attacker only needs to manipulate the timing of the request abort relative to the server's file storage resolution. The attack is highly effective when the target application uses slow, complex, or database-backed asynchronous operations within the filename or destination hooks.

An attacker begins by preparing a standard multipart/form-data POST request containing a large file attachment. The attacker transmits the request headers and the initial portion of the boundary wrapper. Immediately after transmission of the boundary, the attacker forcefully closes or destroys the TCP socket. This action triggers the aborted event on the HTTP request object.

To maximize the impact, the attacker can execute this sequence concurrently across multiple connections. Because the cleanup routine fails to track the pending files whose paths have not yet been assigned, every connection abort leaves a file on the disk. This systematic bypass of the cleanup routine allows an attacker to exhaust the host filesystem's inode limits or available disk blocks, triggering application crashes or wider host denial of service.

Impact Assessment

The severity of CVE-2026-88932 is rated as CVSS 5.3 (Medium). While the vulnerability cannot lead to remote code execution or data exposure directly, it presents a substantial risk to service availability. The attack is unauthenticated, requires zero user interaction, and can be executed via simple network tools over standard HTTP ports.

The direct consequence of successful exploitation is uncontrolled disk space consumption. In containerized environments sharing a storage volume with other critical microservices, a disk-full condition can lead to database corruption, logging failures, and broader platform instability. Since the orphaned files are completely untracked by multer and the parent Node.js application, they remain in the temporary folder until manual intervention occurs.

Furthermore, because no exceptions are raised to the Node.js application process during the orphaned write, traditional application-level monitoring tools will not report any runtime errors or warning logs. This silent failure mode makes detection difficult without active monitoring of disk usage and directory sizes.

Remediation and Long-Term Mitigation

The primary remediation path is upgrading the multer package to version 2.4.0 or newer. This version implements the stateful tracking mechanism that reliably cleans up files completing post-abort. If an immediate upgrade is not feasible, several defensive strategies should be deployed to reduce exposure.

Implementing strict rate-limiting on upload endpoints can restrict the volume of concurrent requests a single IP can initiate. Additionally, web application firewalls (WAFs) or reverse proxies can be configured to enforce strict connection timeouts and reject abnormally slow or incomplete uploads.

# Example Nginx configuration to restrict client timeouts
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s;
send_timeout 10s;

For deployments utilizing temporary storage directories, administrators should configure automated system tasks to regularly prune files that have been inactive for more than a defined threshold. If the application handles smaller uploads, switching to memory storage (memoryStorage) entirely eliminates disk writes, although this shifts the resource exposure to RAM and requires strict file size boundary configuration.

Official Patches

ExpressJSOfficial patch fixing file orphaning race condition

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
EPSS Probability
0.53%
Top 57% most exploited

Affected Systems

multer (Node.js middleware)

Affected Versions Detail

Product
Affected Versions
Fixed Version
multer
ExpressJS
>= 2.2.0, <= 2.3.02.4.0
AttributeDetail
CWE IDCWE-400, CWE-459
Attack VectorNetwork (AV:N)
CVSS Score5.3 (Medium)
EPSS Score0.00532
ImpactDenial of Service via Disk Storage Exhaustion
Exploit StatusNo public weaponized exploits available
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

The software does not properly control the allocation and maintenance of a limited resource, enabling an actor to exhaust that resource.

Vulnerability Timeline

Vulnerability reported privately to OpenJS Foundation
2026-02-10
Patch commit pushed to multer repository
2026-02-12
Multer version 2.4.0 released
2026-02-13
GitHub Security Advisory GHSA-3pph-fpjx-jg34 published
2026-02-14

References & Sources

  • [1]GitHub Security Advisory GHSA-3pph-fpjx-jg34
  • [2]OpenJS Foundation Security Advisories
  • [3]Official Patch Commit
  • [4]Multer v2.4.0 Release Notes

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-85024
5.9

CVE-2026-85024: Denial of Service via Uncaught Exception in undici WebSocket Client

A high-severity Denial of Service (DoS) vulnerability exists in the undici WebSocket client implementation when processing compressed frames. The vulnerability is caused by a race condition where event listeners, including error handlers, are stripped from the active zlib stream during cleanup before the stream is fully terminated, leading to an unhandled exception.

Alon Barad
Alon Barad
4 views•7 min read
•about 3 hours ago•GHSA-6VJ9-MWQ6-2F5V
5.9

GHSA-6VJ9-MWQ6-2F5V: Cross-Tenant SMTP Credential Disclosure via Shared-State DNS Cache Pollution in Nodemailer

Nodemailer versions 5.0.0 up to 10.0.1 are vulnerable to process-global state contamination inside the DNS caching subsystem. When SMTPS connections are established in a multi-tenant Node.js process targeting a shared gateway, a lower-privilege attacker can seed the global DNS cache with a malicious TLS servername. When a victim subsequently resolves the same gateway host, Nodemailer retrieves the polluted servername, overwrites the victim's connection settings, redirects the TLS session to the attacker's virtual host, and transmits the victim's cleartext SMTP credentials directly to the attacker.

Alon Barad
Alon Barad
7 views•7 min read
•about 4 hours ago•CVE-2026-83557
5.6

CVE-2026-83557: Polymorphic Deserialization Bypass in FasterXML jackson-databind via java.lang.Comparable

An incomplete denylist vulnerability in FasterXML jackson-databind's DefaultBaseTypeLimitingValidator allows unauthenticated remote attackers to bypass polymorphic type limitations. By declaring properties of type java.lang.Comparable, attackers can instantiate arbitrary Comparable subclasses on the classpath, leading to path traversal, local file access, or application-specific state manipulation.

Alon Barad
Alon Barad
8 views•6 min read
•about 5 hours ago•CVE-2026-101914
6.5

CVE-2026-101914: Authorization Bypass via Case-Insensitive Path Matching in @grpc/grpc-js-xds

An authorization bypass vulnerability exists in the @grpc/grpc-js Node.js package (specifically within the xDS plugin wrapper @grpc/grpc-js-xds) due to a logical error in its Role-Based Access Control (RBAC) path matching component. When case-insensitive path matching is enabled, the matching logic performs a prefix comparison using the startsWith method instead of a strict equality comparison. This logic flaw allows unauthenticated or low-privilege clients with access to a shorter path to gain unauthorized access to longer, more privileged method names that share the same prefix.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 10 hours ago•CVE-2026-61834
4.3

CVE-2026-61834: Prototype Pollution and Mutation of Inherited Built-in Method Objects in scim-patch

A vulnerability in the scim-patch library allows authenticated users to pollute the global JavaScript execution environment. By transmitting a SCIM PATCH operation targeting inherited built-in methods, such as toString, valueOf, or hasOwnProperty, attackers bypass blocklist filters and mutate global prototype objects. This flaw occurs due to the library relying on standard prototype lookup and the 'in' operator during path-resolution and assignment, resolving to shared native functions instead of treating them as missing own-properties.

Alon Barad
Alon Barad
7 views•6 min read
•about 11 hours ago•GHSA-456V-XQ2P-R4CJ
7.8

GHSA-456V-XQ2P-R4CJ: OS Command Injection in code-ollama grep_search Tool

An OS command injection vulnerability in the grep_search tool of the code-ollama package allows remote code execution. This vulnerability is triggered when a local client executes the CLI against a malicious or compromised Ollama server. Due to grep_search being classified as a read-only tool, the CLI executes it automatically in Plan mode without human-in-the-loop validation, leading to zero-interaction local system compromise.

Amit Schendel
Amit Schendel
8 views•5 min read