
Preuve de concept pour CVE-2021-44906 démontrant la pollution de prototype dans minimist via le contournement de Function.prototype, avec des exemples exécutables et une analyse technique détaillée de la chaîne d'exploitation.
Initialement issu de : https://github.com/Marynk/JavaScript-vulnerability-detection/blob/main/minimist%20PoC.zip
npm run hack
Et vous verrez que la propriété done de n'importe quelle fonction est modifiée en true.
L'explication de la ligne de commande node index.js --_.concat.constructor.prototype.done true :
-- est le tiret normalement utilisé dans les arguments de ligne de commande._ est la clé intégrée de minimist : https://github.com/minimistjs/minimist/blob/v1.2.5/index.js#L37.concat.constructor.prototype.done true définira set _.concat.constructor.prototype.done sur true.
Comme est de type , le prototype de toutes les verra une propriété appelée ajoutée._.concat.constructorFunctionFunctiondoneLa raison pour laquelle la chaîne de prototypes est si longue est que, dans les correctifs précédents, le développeur a interdit __proto__, Arrary.prototype, Object.prototype, Number.prototype et String.prototype. Nous devons donc utiliser constructor, qui possède une propriété prototype et qui n'est pas sur liste noire.
Un autre exemple est :
npm run hack2
Cependant, dans les deux exemples ci-dessus, nous ne pouvons que modifier les valeurs, pas la définition des fonctions.
Dans le correctif de CVE-2020-7598 (1.2.2), et dans 1.2.3, le développeur avait déjà corrigé certaines vulnérabilités en vérifiant __proto__, Arrary.prototype, Object.prototype, Number.prototype, String.prototype,
mais il a oublié de vérifier Function.prototye. C'est pourquoi cette exploitation ne peut affecter que la propriété de Function.
Pour le correctif de cette CVE, le développeur a vérifié Function.prototype ainsi que constructor : https://github.com/minimistjs/minimist/blob/v1.2.6/index.js#L73