
Proof-of-Concept für CVE-2021-44906, das Prototype Pollution in minimist durch eine Function.prototype-Umgehung demonstriert, mit ausführbaren Beispielen und detaillierter technischer Analyse der Exploit-Kette.
Original von: https://github.com/Marynk/JavaScript-vulnerability-detection/blob/main/minimist%20PoC.zip
npm run hack
Und Sie werden sehen, dass die done-Eigenschaft jeder Funktion auf true gesetzt wird.
Die Erklärung der Befehlszeile node index.js --_.concat.constructor.prototype.done true:
-- ist der Bindestrich, der normalerweise in Befehlszeilenargumenten verwendet wird._ ist der eingebaute Schlüssel in minimist: https://github.com/minimistjs/minimist/blob/v1.2.5/index.js#L37.concat.constructor.prototype.done true setzt _.concat.constructor.prototype.done auf true.
Da _.concat.constructor vom Typ Function ist, wird dem Prototyp aller Function-Objekte eine Eigenschaft namens done hinzugefügt.Der Grund, warum die Prototypkette so lang ist, ist, dass der Entwickler in früheren Fixes __proto__, Arrary.prototype, Object.prototype, Number.prototype und String.prototype gesperrt hat. Daher müssen wir constructor verwenden, der eine Prototype-Eigenschaft besitzt und nicht auf der schwarzen Liste steht.
Ein weiteres Beispiel ist:
npm run hack2
Allerdings können wir in den obigen beiden Beispielen nur Werte manipulieren, nicht die Definition von Funktionen.
Im Fix für CVE-2020-7598 (1.2.2) und in 1.2.3 hat der Entwickler bereits einige Schwachstellen behoben, indem er __proto__, Arrary.prototype, Object.prototype, Number.prototype, String.prototype überprüft hat,
aber sie haben vergessen, Function.prototye zu überprüfen. Deshalb kann dieser Exploit nur die Eigenschaft von Function beeinflussen.
Für den Fix dieser CVE hat der Entwickler sowohl Function.prototype als auch constructor überprüft: https://github.com/minimistjs/minimist/blob/v1.2.6/index.js#L73