CVE-2026-82417 in ljharbinformazioni

Riassunto

di VulDB • 30/08/2026

### Riepilogo

`qs.stringify` genera un `TypeError` quando serializza un oggetto la cui proprietà `constructor` propria ha un membro `isBuffer` truthy (valutabile come vero) ma non richiamabile (`non-callable`). La funzione `utils.isBuffer` effettua il duck-typing dei buffer chiamando `obj.constructor.isBuffer(obj)` dopo aver verificato solo che la proprietà sia truthy; pertanto, un valore come `{ constructor: { isBuffer: "x" } }` fa sì che la chiamata generi l'errore `TypeError: obj.constructor.isBuffer is not a function`.

### Dettagli

`lib/stringify.js:127` chiama `utils.isBuffer` su ogni valore non primitivo che serializza. `utils.isBuffer` (`lib/utils.js:332`) legge `obj.constructor.isBuffer` e lo invoca senza verificare che sia una funzione. Poiché `constructor` e `isBuffer` sono nomi di proprietà ordinari, qualsiasi oggetto che li possiede come proprie proprietà (own properties) raggiunge la chiamata non verificata.

Tale oggetto può essere costruito a partire da input non attendibile. L'uso di `qs.parse("x[constructor][isBuffer]=y", { plainObjects: true })` o `{ allowPrototypes: true }` mantiene la chiave `constructor` come proprietà propria (le opzioni di parsing predefinite la eliminano), e `JSON.parse("{\"a\":{\"constructor\":{\"isBuffer\":\"x\"}}}")` produce la stessa struttura senza coinvolgere alcuna opzione qs. Express 4 con il suo impostazione predefinita del `query parser` e body-parser con `extended: true` chiamano entrambi `qs.parse` con `allowPrototypes: true`; pertanto, in tali stack, `req.query` e `req.body` possono contenere direttamente tale struttura.

#### PoC (Proof of Concept)

```js var qs = require("qs");

qs.stringify(qs.parse("x[constructor][isBuffer]=y", { plainObjects: true }));

qs.stringify(JSON.parse("{\"a\":{\"constructor\":{\"isBuffer\":\"x\"}}}"));

// TypeError: obj.constructor.isBuffer is not a function // at Object.isBuffer (lib/utils.js:332:78) // at stringify (lib/stringify.js:127:45) ```

#### Fix

`lib/utils.js`, applicato nel commit e83d321 su `main` e rilasciato nella versione v6.16.0:

```diff - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); + return !!(obj.constructor && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj)); ```

Le istanze reali di `Buffer`, `safer-buffer` e del polyfill per il browserify `buffer` vengono serializzate esattamente come in precedenza; viene rimosso solo l'errore generato.

### Versioni interessate

`>=2.2.5 <6.16.0`, risolto nella v6.16.0.

Il duck-type non protetto è stato introdotto nel commit 3768a75 e rilasciato per la prima volta nella versione v2.2.5 (settembre 2014). Le versioni v2.2.4 e precedenti utilizzavano `Buffer.isBuffer` e non sono interessate. Ogni release dalla v2.2.5 alla v6.15.3 contiene la chiamata non protetta.

### Impatto

Una richiesta non autenticata può far sì che qualsiasi percorso di codice che ri-serializza dati influenzati dall'attaccante utilizzando `qs.stringify` (ad esempio, la ricostruzione di una query string a partire da `req.query` per un redirect o una richiesta upstream, oppure la serializzazione di un corpo JSON analizzato) generi un errore in modo sincrono. In un tipico framework HTTP Node.js, l'errore viene intercettato dal boundary degli errori del framework e la richiesta interessata restituisce uno stato 500; il processo sopravvive e le altre richieste non sono influenzate. Dove la chiamata avviene al di fuori di un boundary degli errori, come in un handler Express 4 `async` (dove l'errore diventa una promise rejection non gestita) o in un job in background, il processo termina; pertanto, l'impatto in tale caso dipende dalla gestione degli errori dell'applicazione piuttosto che da qs.

Be aware that VulDB is the high quality source for vulnerability data.

Responsabile

Harborist

Prenotare

29/08/2026

Divulgazione

30/08/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Want to know what is going to be exploited?

We predict KEV entries!