CVE-2026-2391 Vulnerability Analysis & Exploit Details

CVE-2026-2391
Vulnerability Scoring

3.7
/10
Moderate Risk

Exploiting CVE-2026-2391 requires specific conditions, leading to a moderate security impact.

Attack Complexity Details

  • Attack Complexity: High
    Exploits require significant effort and special conditions.
  • Attack Vector: Network
    Vulnerability is exploitable over a network without physical access.
  • Privileges Required: None
    No privileges are required for exploitation.
  • Scope: Unchanged
    Exploit remains within the originally vulnerable component.
  • User Interaction: None
    No user interaction is necessary for exploitation.

CVE-2026-2391 Details

Status: Analyzed

Last updated: 🕗 24 Feb 2026, 20:13 UTC
Originally published on: 🕔 12 Feb 2026, 05:17 UTC

Time between publication and last update: 12 days

CVSS Release: version 3

CVSS3 Source

7ffcee3d-2c14-4c3e-b844-86c6a321a158

CVSS3 Type

Secondary

CVSS3 Vector

CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L

CVE-2026-2391 Vulnerability Summary

CVE-2026-2391: ### Summary The `arrayLimit` option in qs does not enforce limits for comma-separated values when `comma: true` is enabled, allowing attackers to cause denial-of-service via memory exhaustion. This is a bypass of the array limit enforcement, similar to the bracket notation bypass addressed in GHSA-6rw7-vpxm-498p (CVE-2025-15284). ### Details When the `comma` option is set to `true` (not the default, but configurable in applications), qs allows parsing comma-separated strings as arrays (e.g., `?param=a,b,c` becomes `['a', 'b', 'c']`). However, the limit check for `arrayLimit` (default: 20) and the optional throwOnLimitExceeded occur after the comma-handling logic in `parseArrayValue`, enabling a bypass. This permits creation of arbitrarily large arrays from a single parameter, leading to excessive memory allocation. **Vulnerable code** (lib/parse.js: lines ~40-50): ```js if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {     return val.split(','); } if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) {     throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.'); } return val; ``` The `split(',')` returns the array immediately, skipping the subsequent limit check. Downstream merging via `utils.combine` does not prevent allocation, even if it marks overflows for sparse arrays.This discrepancy allows attackers to send a single parameter with millions of commas (e.g., `?param=,,,,,,,,...`), allocating massive arrays in memory without triggering limits. It bypasses the intent of `arrayLimit`, which is enforced correctly for indexed (`a[0]=`) and bracket (`a[]=`) notations (the latter fixed in v6.14.1 per GHSA-6rw7-vpxm-498p). ### PoC **Test 1 - Basic bypass:** ``` npm install qs ``` ```js const qs = require('qs'); const payload = 'a=' + ','.repeat(25); // 26 elements after split (bypasses arrayLimit: 5) const options = { comma: true, arrayLimit: 5, throwOnLimitExceeded: true }; try {   const result = qs.parse(payload, options);   console.log(result.a.length); // Outputs: 26 (bypass successful) } catch (e) {   console.log('Limit enforced:', e.message); // Not thrown } ``` **Configuration:** - `comma: true` - `arrayLimit: 5` - `throwOnLimitExceeded: true` Expected: Throws "Array limit exceeded" error. Actual: Parses successfully, creating an array of length 26. ### Impact Denial of Service (DoS) via memory exhaustion.

Assessing the Risk of CVE-2026-2391

Access Complexity Graph

The exploitability of CVE-2026-2391 depends on two key factors: attack complexity (the level of effort required to execute an exploit) and privileges required (the access level an attacker needs).

Exploitability Analysis for CVE-2026-2391

CVE-2026-2391 presents a challenge to exploit due to its high attack complexity, but the absence of privilege requirements still makes it a viable target for skilled attackers. A thorough security review is advised.

Understanding AC and PR

A lower complexity and fewer privilege requirements make exploitation easier. Security teams should evaluate these aspects to determine the urgency of mitigation strategies, such as patch management and access control policies.

Attack Complexity (AC) measures the difficulty in executing an exploit. A high AC means that specific conditions must be met, making an attack more challenging, while a low AC means the vulnerability can be exploited with minimal effort.

Privileges Required (PR) determine the level of system access necessary for an attack. Vulnerabilities requiring no privileges are more accessible to attackers, whereas high privilege requirements limit exploitation to authorized users with elevated access.

CVSS Score Breakdown Chart

Above is the CVSS Sub-score Breakdown for CVE-2026-2391, illustrating how Base, Impact, and Exploitability factors combine to form the overall severity rating. A higher sub-score typically indicates a more severe or easier-to-exploit vulnerability.

CIA Impact Analysis

Below is the Impact Analysis for CVE-2026-2391, showing how Confidentiality, Integrity, and Availability might be affected if the vulnerability is exploited. Higher values usually signal greater potential damage.

  • Confidentiality: None
    CVE-2026-2391 has no significant impact on data confidentiality.
  • Integrity: None
    CVE-2026-2391 poses no threat to data integrity.
  • Availability: Low
    CVE-2026-2391 may slightly degrade system performance without fully affecting service availability.

CVE-2026-2391 References

External References

CWE Common Weakness Enumeration

NVD-CWE-noinfo

Vulnerable Configurations

  • cpe:2.3:a:qs_project:qs:6.7.0:*:*:*:*:*:*:*
    cpe:2.3:a:qs_project:qs:6.7.0:*:*:*:*:*:*:*
  • cpe:2.3:a:qs_project:qs:6.7.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.7.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.7.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.7.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.7.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.7.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.7.3:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.7.3:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.8.0:*:*:*:*:*:*:*
    cpe:2.3:a:qs_project:qs:6.8.0:*:*:*:*:*:*:*
  • cpe:2.3:a:qs_project:qs:6.8.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.8.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.8.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.8.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.8.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.8.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.8.3:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.8.3:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.0:*:*:*:*:*:*:*
    cpe:2.3:a:qs_project:qs:6.9.0:*:*:*:*:*:*:*
  • cpe:2.3:a:qs_project:qs:6.9.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.3:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.3:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.4:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.4:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.5:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.5:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.6:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.6:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.9.7:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.9.7:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.3:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.3:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.4:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.4:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.10.5:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.10.5:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.11.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.11.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.11.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.11.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.11.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.11.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.12.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.12.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.12.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.12.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.12.2:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.12.2:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.12.3:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.12.3:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.13.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.13.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.13.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.13.1:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.14.0:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.14.0:*:*:*:*:node.js:*:*
  • cpe:2.3:a:qs_project:qs:6.14.1:*:*:*:*:node.js:*:*
    cpe:2.3:a:qs_project:qs:6.14.1:*:*:*:*:node.js:*:*

Protect Your Infrastructure against CVE-2026-2391: Combat Critical CVE Threats

Stay updated with real-time CVE vulnerabilities and take action to secure your systems. Enhance your cybersecurity posture with the latest threat intelligence and mitigation techniques. Develop the skills necessary to defend against CVEs and secure critical infrastructures. Join the top cybersecurity professionals safeguarding today's infrastructures.

Other 5 Recently Published CVEs Vulnerabilities

  • CVE-2026-4324 – A flaw was found in the Katello plugin for Red Hat Satellite. This vulnerability, caused by improper sanitization of user-provided input, allows a ...
  • CVE-2026-3888 – Local privilege escalation in snapd on Linux allows local attackers to get root privilege by re-creating snap's private /tmp directory when systemd...
  • CVE-2025-62320 – HTML Injection can be carried out in Product when a web application does not properly check or clean user input before showing it on a webpage. Bec...
  • CVE-2026-4271 – A flaw was found in libsoup, a library for handling HTTP requests. This vulnerability, known as a Use-After-Free, occurs in the HTTP/2 server imple...
  • CVE-2025-31966 – HCL Sametime is vulnerable to broken server-side validation. While the application performs client-side input checks, these are not enforced by the...