Prototype pollution: avvelenare Object.prototype
In JavaScript ogni oggetto eredita da Object.prototype. Se un merge ricorsivo o un parser scrive una chiave __proto__ da input dell'utente, inquina il prototipo condiviso da tutti gli oggetti.
Il meccanismo
merge({}, JSON.parse('{"__proto__":{"isAdmin":true}}'))
({}).isAdmin // true -> ogni oggetto ora ha isAdminLe conseguenze dipendono dal codice: bypass di controlli (if (user.isAdmin)), DoS, e nei casi giusti RCE (una proprietà inquinata che finisce in child_process o in un template).
Difesa
Non fare merge ricorsivi ciechi di input non fidato. Blocca le chiavi __proto__, constructor, prototype. Usa Object.create(null) per mappe di dati, Map invece di oggetti, Object.freeze(Object.prototype). Librerie con guardie note (lodash aggiornato).