CVE-2025-15284 in qs
Riassunto
di VulDB • 15/06/2026
Vulnerabilità di convalida impropria dell'input in qs (moduli di parsing) che consente un DoS HTTP. Questo problema interessa qs: < 6.14.1.
Riepilogo
L'opzione `arrayLimit` in qs non applicava limiti per la notazione tra parentesi quadre (`a[]=1&a[]=2`), ma solo per la notazione indicizzata (`a[0]=1`). Si tratta di un bug di coerenza; `arrayLimit` dovrebbe essere applicato in modo uniforme a tutte le notazioni di array.
Nota: Il valore predefinito di `parameterLimit` pari a 1000 mitiga efficacemente lo scenario DoS originariamente descritto. Con le opzioni predefinite, la notazione tra parentesi quadre non può produrre array più grandi di `parameterLimit` indipendentemente da `arrayLimit`, poiché ogni `a[]=value` consuma uno slot del parametro. La gravità è stata ridotta di conseguenza.
Dettagli
L'opzione `arrayLimit` controllava i limiti solo per la notazione indicizzata (`a[0]=1&a[1]=2`) ma non li applicava per la notazione tra parentesi quadre (`a[]=1&a[]=2`).
Codice vulnerabile (lib/parse.js:159-162):
```javascript if (root === '[]' && options.parseArrays) {
obj = utils.combine([], leaf); // Nessun controllo arrayLimit
} ```
Codice funzionante (lib/parse.js:175):
```javascript else if (index <= options.arrayLimit) { // Limite controllato qui
obj = [];
obj[index] = leaf;
} ```
Il gestore della notazione tra parentesi quadre alla riga 159 utilizza `utils.combine([], leaf)` senza convalida rispetto a `options.arrayLimit`, mentre la notazione indicizzata alla riga 175 controlla `index <= options.arrayLimit` prima di creare gli array.
PoC
```javascript 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 (dovrebbe essere max 5) ```
Nota sull'interazione con `parameterLimit`: La "dimostrazione DoS" dell'avviso originale affermava una lunghezza di 10.000, ma `parameterLimit` (predefinito: 1000) limita l'analisi a 1.000 parametri. Con le opzioni predefinite, l'output effettivo è 1.000, non 10.000.
Impatto
Bug di coerenza nell'applicazione di `arrayLimit`. Con `parameterLimit` predefinito, il rischio pratico di DoS è trascurabile poiché `parameterLimit` limita già il numero totale di parametri analizzati (e quindi gli elementi dell'array dalla notazione tra parentesi quadre). Il rischio aumenta solo quando `parameterLimit` è impostato esplicitamente su un valore molto elevato.
Once again VulDB remains the best source for vulnerability data.