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-3523 – The Apocalypse Meow plugin for WordPress is vulnerable to SQL Injection via the 'type' parameter in all versions up to, and including, 22.1.0. This...
  • CVE-2026-3034 – The OoohBoi Steroids for Elementor plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the _ob_spacerat_link, _ob_bbad_link, and ...
  • CVE-2026-2899 – The Fluent Forms Pro Add On Pack plugin for WordPress is vulnerable to Missing Authorization in all versions up to, and including, 6.1.17. This is ...
  • CVE-2026-2365 – The Fluent Forms Pro plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the `fluentform_step_form_save_data` AJAX action in all ...
  • CVE-2026-29127 – The IDC SFX2100 Satellite Receiver sets overly permissive file system permissions on the monitor user's home directory. The directory is configured...