Cloudanix VulnDB

CVE-2025-15284

Low · 3.7

CVSS

3.7

EPSS

0.4%

Published

Dec 29, 2025

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

Some web applications may let specially crafted requests consume more server resources than intended, but the risk is low for default configurations and is fixed by updating the affected software.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Moderate
Impact
Denial Of Service
Component
Library
Class
Denial of service
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The flaw is an improper input validation issue in the qs query-string parsing library before version 6.14.1. When applications parse query strings or URL-encoded request bodies using bracket array notation such as a[]=1&a[]=2, the arrayLimit option is not enforced, even though it is enforced for indexed notation such as a[0]=1&a[1]=2. This can allow a request to create arrays larger than the application intended. With the default parameterLimit of 1000, practical denial-of-service impact is limited because each bracketed array element still consumes a parameter slot; risk is higher for applications that explicitly raise parameterLimit to a large value or parse very large attacker-controlled query strings or form bodies.

Why it matters to the business

The most likely consequence is reduced service availability or increased CPU and memory consumption in web applications that use vulnerable qs versions and permissive parser settings. For most default configurations, the operational risk is low because qs already limits the total number of parameters, and the CVSS and EPSS values indicate low severity and low near-term exploitation likelihood. Organizations with high-traffic internet-facing Node.js services, API gateways, or middleware that increased parser parameter limits should still patch to avoid request-driven resource exhaustion and unexpected parsing behavior.

How an attack unfolds

An unauthenticated remote attacker sends HTTP requests containing a large number of repeated bracket-notation parameters, for example many instances of a[]=value, to an endpoint that parses query strings or application/x-www-form-urlencoded request bodies with a vulnerable qs version. If the application relies on arrayLimit to restrict array size, qs incorrectly applies that limit only to indexed arrays and not to bracket arrays. In configurations where parameterLimit has been raised significantly, the parser may allocate and combine a large array despite the intended arrayLimit, consuming CPU and memory and potentially slowing or disrupting the application. There is no indication from the provided intelligence that this issue is in CISA KEV, used in ransomware campaigns, or associated with named threat actors.

How to fix it

Upgrade qs to version 6.14.1 or later. For source builds tracking ljharb/qs directly, ensure the fix commit 3086902ecf7f088d0d1803887643ac6c03d415b9 or a later revision is present. For Debian-packaged references in the supplied data, use the vendor-fixed package version listed as 4.1-1 for Debian 11, Debian 12, and Debian 13 where applicable. As defense in depth, keep qs parameterLimit at the default or another low, justified value; set explicit request body and URL length limits in the web framework, reverse proxy, and load balancer; reject unusually large application/x-www-form-urlencoded bodies; and apply rate limiting to endpoints that parse user-controlled parameters.

How to confirm the fix worked

Confirm dependency resolution shows qs version 6.14.1 or later, or that the patched upstream commit is included for vendored copies. Use package-lock.json, npm ls qs, yarn why qs, pnpm why qs, SBOM output, container image scans, and source-code searches to find direct and transitive qs usage. Validate runtime behavior with a safe test: parse a query such as a[]=1&a[]=2&a[]=3&a[]=4&a[]=5&a[]=6 using a low arrayLimit and verify bracket notation is constrained consistently with indexed notation. Also verify that application, proxy, and framework request-size limits are active and that large query strings or URL-encoded bodies are rejected before they can consume significant application resources.

Typical attack path

  1. Identify an internet-facing endpoint that accepts query-string parameters or URL-encoded request bodies.
  2. Send requests containing many repeated bracket-notation array parameters such as a[]=1&a[]=2&a[]=3.
  3. Target applications using qs before 6.14.1, especially where parser parameterLimit has been increased above the default.
  4. Cause the application to parse more array elements than intended by arrayLimit.
  5. Repeat or parallelize requests to increase CPU, memory, request latency, or worker exhaustion impact.

How to detect it

Review HTTP access logs, WAF logs, reverse proxy logs, application logs, APM traces, and Node.js process telemetry for requests containing unusually long query strings or URL-encoded bodies with many repeated bracket-notation parameters. Focus on patterns such as repeated a[]=, ids[]=, tags[]=, filter[]=, or other parameter names appearing hundreds or thousands of times in one request. Correlate these requests with elevated response times, 408/429/500/502/503/504 responses, Node.js heap growth, out-of-memory events, process restarts, high garbage-collection time, or worker saturation. If body logging is not enabled, use WAF/request metadata such as query length, request body size, parameter count, and content type application/x-www-form-urlencoded. There are no known actor-specific indicators from the supplied intelligence; detection should be behavior-based around resource-exhaustion attempts using bracket array notation.

  • a[]=
  • %5B%5D=
  • application/x-www-form-urlencoded
  • parameterLimit
  • arrayLimit
  • JavaScript heap out of memory
  • FATAL ERROR: Reached heap limit Allocation failed
  • FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed
  • ENOMEM
  • out of memory
  • Request-URI Too Long
  • 414 Request-URI Too Long
  • 413 Payload Too Large
  • upstream timed out
  • worker process exited
  • a[]=1&a[]=2&a[]=3&a[]=4&a[]=5&a[]=6

What your security team should do

  • Inventory all applications and containers that include qs before 6.14.1, including transitive dependencies in Express-compatible middleware and other Node.js web stacks.
  • Prioritize patching internet-facing services and any service that increased qs parameterLimit or accepts large URL-encoded request bodies.
  • Upgrade to qs 6.14.1 or later and regenerate lockfiles so transitive dependency resolution cannot retain a vulnerable version.
  • Add or verify request body size, URL length, parameter count, and per-IP rate limits at the edge and application layer.
  • Search recent HTTP access logs and application performance telemetry for spikes in long query strings, repeated bracket-notation parameters, 4xx/5xx responses, memory pressure, garbage collection spikes, or request latency anomalies.
  • Because this is not KEV-listed, has no known exploit maturity in the supplied data, and has low EPSS, handle as routine patching unless local exposure includes permissive parser settings on high-value internet-facing services.

The record

Improper Input Validation vulnerability in qs (parse modules) allows HTTP DoS.This issue affects qs: < 6.14.1. Summary The arrayLimit option in qs did not enforce limits for bracket notation (a[]=1&a[]=2), only for indexed notation (a[0]=1). This is a consistency bug; arrayLimit should apply uniformly across all array notations. Note: The default parameterLimit of 1000 effectively mitigates the DoS scenario originally described. With default options, bracket notation cannot produce arrays larger than parameterLimit regardless of arrayLimit, because each a[]=valueconsumes one parameter slot. The severity has been reduced accordingly. Details The arrayLimit option only checked limits for indexed notation (a[0]=1&a[1]=2) but did not enforce it for bracket notation (a[]=1&a[]=2). Vulnerable code (lib/parse.js:159-162): if (root === '[]' && options.parseArrays) { obj = utils.combine([], leaf); // No arrayLimit check } Working code (lib/parse.js:175): else if (index <= options.arrayLimit) { // Limit checked here obj = []; obj[index] = leaf; } The bracket notation handler at line 159 uses utils.combine([], leaf) without validating against options.arrayLimit, while indexed notation at line 175 checks index <= options.arrayLimit before creating arrays. PoC const qs = require('qs'); const result = qs.parse('a[]=1&a[]=2&a[]=3&a[]=4&a[]=5&a[]=6', { arrayLimit: 5 }); console.log(result.a.length); // Output: 6 (should be max 5) Note on parameterLimit interaction: The original advisory's "DoS demonstration" claimed a length of 10,000, but parameterLimit (default: 1000) caps parsing to 1,000 parameters. With default options, the actual output is 1,000, not 10,000. Impact Consistency bug in arrayLimit enforcement. With default parameterLimit, the practical DoS risk is negligible since parameterLimit already caps the total number of parsed parameters (and thus array elements from bracket notation). The risk increases only when parameterLimit is explicitly set to a very high value.

Affected packages

Ecosystem Package Introduced Fixed
npm qs 0 6.14.1
Chainguard arangodb-3.11 0 3.11.14.2-r3
Chainguard arangodb-3.11-compat 0 3.11.14.2-r3
Chainguard arangodb-3.12 0 3.12.7.1-r1
Chainguard arangodb-3.12-compat 0 3.12.7.1-r1
Chainguard argo-workflow-cli-3.6 0 3.6.15-r1
Chainguard argo-workflow-cli-3.7 0 3.7.6-r1
Chainguard argo-workflow-controller-3.6 0 3.6.15-r1
Chainguard argo-workflow-controller-3.6-compat 0 3.6.15-r1
Chainguard argo-workflow-controller-3.7 0 3.7.6-r1
Chainguard argo-workflow-controller-3.7-compat 0 3.7.6-r1
Chainguard argo-workflow-executor-3.6 0 3.6.15-r1
Chainguard argo-workflow-executor-3.6-compat 0 3.6.15-r1
Chainguard argo-workflow-executor-3.7 0 3.7.6-r1
Chainguard argo-workflow-executor-3.7-compat 0 3.7.6-r1
Chainguard argo-workflows-3.6 0 3.6.15-r1
Chainguard argo-workflows-3.7 0 3.7.6-r1
Chainguard argo-workflows-known-hosts-3.6 0 3.6.15-r1
Chainguard argo-workflows-known-hosts-3.7 0 3.7.6-r1
Chainguard argo-workflows-ui-3.6 0 3.6.16-r0
Chainguard argo-workflows-ui-3.7 0 3.7.7-r0
Chainguard code-server 0 4.106.3-r1
Chainguard code-server-compat 0 4.106.3-r1
Chainguard json-server 0 0.17.4-r3
Chainguard kibana-9.1 0 9.1.9-r1
Chainguard kibana-9.1-bitnami 0 9.1.9-r1
Chainguard kibana-9.1-iamguarded 0 9.1.9-r1
Chainguard kibana-9.2 0 9.2.3-r1
Chainguard kibana-9.2-iamguarded 0 9.2.3-r1
Chainguard kubeflow-centraldashboard 0 1.10.0-r8
Chainguard kubeflow-pipelines 0 2.15.0-r5
Chainguard kubeflow-pipelines-apiserver 0 2.15.0-r5
Chainguard kubeflow-pipelines-cache-deployer 0 2.15.0-r5
Chainguard kubeflow-pipelines-cache-deployer-compat 0 2.15.0-r5
Chainguard kubeflow-pipelines-cache_server 0 2.15.0-r5
Chainguard kubeflow-pipelines-frontend 0 2.15.0-r12
Chainguard kubeflow-pipelines-metadata-envoy-config 0 2.15.0-r5
Chainguard kubeflow-pipelines-metadata-writer 0 2.15.0-r5
Chainguard kubeflow-pipelines-metadata-writer-compat 0 2.15.0-r5
Chainguard kubeflow-pipelines-persistence_agent 0 2.15.0-r5
Chainguard kubeflow-pipelines-scheduledworkflow 0 2.15.0-r5
Chainguard kubeflow-pipelines-viewer-crd-controller 0 2.15.0-r5
Chainguard langfuse-2 0 2.95.12-r4
Chainguard langfuse-2-compat 0 2.95.12-r4
Chainguard langfuse-2-worker 0 2.95.12-r4
Chainguard langfuse-3 0 3.143.0-r1
Chainguard langfuse-3-compat 0 3.143.0-r1
Chainguard langfuse-3-worker 0 3.143.0-r1
Chainguard langfuse-fips-2 0 2.95.12-r4
Chainguard langfuse-fips-2-compat 0 2.95.12-r4
Chainguard langfuse-fips-2-worker 0 2.95.12-r4
Chainguard langfuse-fips-3 0 3.144.0-r0
Chainguard langfuse-fips-3-compat 0 3.143.0-r1
Chainguard langfuse-fips-3-worker 0 3.143.0-r1
Chainguard langfuse-web-3 0 3.143.0-r1
Chainguard langfuse-web-compat 0 3.143.0-r1
Chainguard langfuse-worker-3 0 3.143.0-r1
Chainguard librechat 0 0.8.1-r2
Chainguard librechat-compat 0 0.8.1-r2
Chainguard librechat-dev 0 0.8.1-r2
Chainguard opensearch-dashboards-2 0 2.19.4-r10
Chainguard opensearch-dashboards-2-alerting-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-anomaly-detection-dashboards-plugin 0 2.19.4-r5
Chainguard opensearch-dashboards-2-config 0 2.19.4-r4
Chainguard opensearch-dashboards-2-dashboards-maps 0 2.19.4-r5
Chainguard opensearch-dashboards-2-dashboards-notifications 0 2.19.4-r10
Chainguard opensearch-dashboards-2-dashboards-observability 0 2.19.4-r15
Chainguard opensearch-dashboards-2-dashboards-query-workbench 0 2.19.4-r10
Chainguard opensearch-dashboards-2-dashboards-reporting 0 2.19.4-r10
Chainguard opensearch-dashboards-2-dashboards-search-relevance 0 2.19.5-r4
Chainguard opensearch-dashboards-2-dashboards-visualizations 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-alerting-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-anomaly-detection-dashboards-plugin 0 2.19.4-r5
Chainguard opensearch-dashboards-2-fips-config 0 2.19.4-r4
Chainguard opensearch-dashboards-2-fips-dashboards-maps 0 2.19.4-r5
Chainguard opensearch-dashboards-2-fips-dashboards-notifications 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-dashboards-observability 0 2.19.4-r11
Chainguard opensearch-dashboards-2-fips-dashboards-query-workbench 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-dashboards-reporting 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-dashboards-search-relevance 0 2.19.4-r11
Chainguard opensearch-dashboards-2-fips-dashboards-visualizations 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-index-management-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-ml-commons-dashboards 0 2.19.4-r5
Chainguard opensearch-dashboards-2-fips-security-analytics-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-fips-security-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-index-management-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-ml-commons-dashboards 0 2.19.4-r5
Chainguard opensearch-dashboards-2-security-analytics-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-2-security-dashboards-plugin 0 2.19.4-r10
Chainguard opensearch-dashboards-3 0 3.5.0-r0
Chainguard opensearch-dashboards-3-alerting-dashboards-plugin 0 3.5.0-r0
Chainguard opensearch-dashboards-3-anomaly-detection-dashboards-plugin 0 3.4.0-r0
Chainguard opensearch-dashboards-3-config 0 3.2.0-r2
Chainguard opensearch-dashboards-3-dashboards-maps 0 3.4.0-r0
Chainguard opensearch-dashboards-3-dashboards-notifications 0 3.5.0-r1
Chainguard opensearch-dashboards-3-dashboards-observability 0 3.5.0-r5
Chainguard opensearch-dashboards-3-dashboards-query-workbench 0 3.5.0-r1
Chainguard opensearch-dashboards-3-dashboards-reporting 0 3.5.0-r1
Chainguard opensearch-dashboards-3-dashboards-search-relevance 0 3.5.0-r5
Chainguard opensearch-dashboards-3-fips 0 3.5.0-r0
Chainguard opensearch-dashboards-3-fips-alerting-dashboards-plugin 0 3.5.0-r0
Chainguard opensearch-dashboards-3-fips-anomaly-detection-dashboards-plugin 0 3.4.0-r0
Chainguard opensearch-dashboards-3-fips-config 0 3.2.0-r3
Chainguard opensearch-dashboards-3-fips-dashboards-maps 0 3.4.0-r0
Chainguard opensearch-dashboards-3-fips-dashboards-notifications 0 3.5.0-r1
Chainguard opensearch-dashboards-3-fips-dashboards-observability 0 3.5.0-r3
Chainguard opensearch-dashboards-3-fips-dashboards-query-workbench 0 3.5.0-r1
Chainguard opensearch-dashboards-3-fips-dashboards-reporting 0 3.5.0-r1
Chainguard opensearch-dashboards-3-fips-dashboards-search-relevance 0 3.5.0-r3
Chainguard opensearch-dashboards-3-fips-index-management-dashboards-plugin 0 3.5.0-r1
Chainguard opensearch-dashboards-3-fips-ml-commons-dashboards 0 3.4.0-r0
Chainguard opensearch-dashboards-3-fips-security-analytics-dashboards-plugin 0 3.5.0-r1
Chainguard opensearch-dashboards-3-fips-security-dashboards-plugin 0 3.5.0-r1
Chainguard opensearch-dashboards-3-index-management-dashboards-plugin 0 3.5.0-r1
Chainguard opensearch-dashboards-3-ml-commons-dashboards 0 3.4.0-r0
Chainguard opensearch-dashboards-3-security-analytics-dashboards-plugin 0 3.5.0-r1
Chainguard opensearch-dashboards-3-security-dashboards-plugin 0 3.5.0-r1
Chainguard redisinsight 0 3.0.0-r1
Chainguard redisinsight-docker-entrypoint 0 3.0.0-r1
Chainguard renovate 0 42.71.4-r0
Chainguard saf 0 1.5.3-r1
Chainguard sqlpad 0 7.5.7-r5
Chainguard sqlpad-compat 0 7.5.7-r4
Chainguard thingsboard 0 4.2.1.1-r0
Chainguard thingsboard-tb-js-executor 0 4.2.1.1-r0
Chainguard thingsboard-tb-mqtt-transport 0 4.2.1.1-r0
Chainguard thingsboard-tb-node 0 4.2.1.1-r0
Chainguard thingsboard-tb-web-ui 0 4.2.1.1-r0
Chainguard tileserver-gl 0 5.5.0-r0
Chainguard tileserver-gl-compat 0 5.5.0-r0
Chainguard tileserver-gl-fips 0 5.5.0-r0
Chainguard tileserver-gl-fips-compat 0 5.5.0-r0
Wolfi argo-workflow-cli-3.7 0 3.7.6-r1
Wolfi argo-workflow-controller-3.7 0 3.7.6-r1
Wolfi argo-workflow-controller-3.7-compat 0 3.7.6-r1
Wolfi argo-workflow-executor-3.7 0 3.7.6-r1
Wolfi argo-workflow-executor-3.7-compat 0 3.7.6-r1
Wolfi argo-workflows-3.7 0 3.7.6-r1
Wolfi argo-workflows-known-hosts-3.7 0 3.7.6-r1
Wolfi argo-workflows-ui-3.7 0 3.7.7-r0
Wolfi code-server 0 4.106.3-r1
Wolfi code-server-compat 0 4.106.3-r1
Wolfi json-server 0 0.17.4-r3
Wolfi kubeflow-centraldashboard 0 1.10.0-r8
Wolfi kubeflow-pipelines 0 2.15.0-r5
Wolfi kubeflow-pipelines-apiserver 0 2.15.0-r5
Wolfi kubeflow-pipelines-cache-deployer 0 2.15.0-r5
Wolfi kubeflow-pipelines-cache-deployer-compat 0 2.15.0-r5
Wolfi kubeflow-pipelines-cache_server 0 2.15.0-r5
Wolfi kubeflow-pipelines-frontend 0 2.15.0-r12
Wolfi kubeflow-pipelines-metadata-envoy-config 0 2.15.0-r5
Wolfi kubeflow-pipelines-metadata-writer 0 2.15.0-r5
Wolfi kubeflow-pipelines-metadata-writer-compat 0 2.15.0-r5
Wolfi kubeflow-pipelines-persistence_agent 0 2.15.0-r5
Wolfi kubeflow-pipelines-scheduledworkflow 0 2.15.0-r5
Wolfi kubeflow-pipelines-viewer-crd-controller 0 2.15.0-r5
Wolfi langfuse-3 0 3.143.0-r1
Wolfi langfuse-3-compat 0 3.143.0-r1
Wolfi langfuse-3-worker 0 3.143.0-r1
Wolfi langfuse-web-3 0 3.143.0-r1
Wolfi langfuse-web-compat 0 3.143.0-r1
Wolfi langfuse-worker-3 0 3.143.0-r1
Wolfi opensearch-dashboards-2 0 2.19.4-r10
Wolfi opensearch-dashboards-2-alerting-dashboards-plugin 0 2.19.4-r10
Wolfi opensearch-dashboards-2-anomaly-detection-dashboards-plugin 0 2.19.4-r5
Wolfi opensearch-dashboards-2-config 0 2.19.4-r4
Wolfi opensearch-dashboards-2-dashboards-maps 0 2.19.4-r5
Wolfi opensearch-dashboards-2-dashboards-notifications 0 2.19.4-r10
Wolfi opensearch-dashboards-2-dashboards-observability 0 2.19.4-r15
Wolfi opensearch-dashboards-2-dashboards-query-workbench 0 2.19.4-r10
Wolfi opensearch-dashboards-2-dashboards-reporting 0 2.19.4-r10
Wolfi opensearch-dashboards-2-dashboards-search-relevance 0 2.19.5-r4
Wolfi opensearch-dashboards-2-dashboards-visualizations 0 2.19.4-r10
Wolfi opensearch-dashboards-2-index-management-dashboards-plugin 0 2.19.4-r10
Wolfi opensearch-dashboards-2-ml-commons-dashboards 0 2.19.4-r5
Wolfi opensearch-dashboards-2-security-analytics-dashboards-plugin 0 2.19.4-r10
Wolfi opensearch-dashboards-2-security-dashboards-plugin 0 2.19.4-r10
Wolfi opensearch-dashboards-3 0 3.5.0-r0
Wolfi opensearch-dashboards-3-alerting-dashboards-plugin 0 3.5.0-r0
Wolfi opensearch-dashboards-3-anomaly-detection-dashboards-plugin 0 3.4.0-r0
Wolfi opensearch-dashboards-3-config 0 3.2.0-r2
Wolfi opensearch-dashboards-3-dashboards-maps 0 3.4.0-r0
Wolfi opensearch-dashboards-3-dashboards-notifications 0 3.5.0-r1
Wolfi opensearch-dashboards-3-dashboards-observability 0 3.5.0-r5
Wolfi opensearch-dashboards-3-dashboards-query-workbench 0 3.5.0-r1
Wolfi opensearch-dashboards-3-dashboards-reporting 0 3.5.0-r1
Wolfi opensearch-dashboards-3-dashboards-search-relevance 0 3.5.0-r5
Wolfi opensearch-dashboards-3-index-management-dashboards-plugin 0 3.5.0-r1
Wolfi opensearch-dashboards-3-ml-commons-dashboards 0 3.4.0-r0
Wolfi opensearch-dashboards-3-security-analytics-dashboards-plugin 0 3.5.0-r1
Wolfi opensearch-dashboards-3-security-dashboards-plugin 0 3.5.0-r1
Wolfi renovate 0 42.71.4-r0
Wolfi saf 0 1.5.3-r1
Wolfi sqlpad 0 7.5.7-r5
Wolfi sqlpad-compat 0 7.5.7-r4
Wolfi thingsboard 0 4.2.1.1-r0
Wolfi thingsboard-tb-js-executor 0 4.2.1.1-r0
Wolfi thingsboard-tb-mqtt-transport 0 4.2.1.1-r0
Wolfi thingsboard-tb-node 0 4.2.1.1-r0

Related vulnerabilities