
元の出典: https://github.com/Marynk/JavaScript-vulnerability-detection/blob/main/minimist%20PoC.zip
npm run hack
そして、任意の関数の done プロパティが true に変更されるのを確認できます。
コマンドライン node index.js --_.concat.constructor.prototype.done true の説明:
-- は通常コマンドライン引数で使用されるハイフンマークです。_ は minimist の組み込みキーです: https://github.com/minimistjs/minimist/blob/v1.2.5/index.js#L37.concat.constructor.prototype.done true は _.concat.constructor.prototype.done を true に設定します。
_.concat.constructor は Function 型であるため、すべての Function のプロトタイプに done というプロパティが追加されます。プロトタイプチェーンがこれほど長い理由は、以前の修正で開発者が __proto__、Arrary.prototype、Object.prototype、Number.prototype、String.prototype を禁止したためです。そのため、プロトタイププロパティを持ち、ブラックリストに載っていない constructor を使用する必要があります。
別の例:
npm run hack2
ただし、上記の2つの例では、値を改ざんできるだけで、関数の定義は改ざんできません。
CVE-2020-7598 (1.2.2) の修正、および 1.2.3 では、開発者は __proto__、Arrary.prototype、Object.prototype、Number.prototype、String.prototype をチェックすることでいくつかの脆弱性をすでに修正していましたが、
Function.prototye のチェックを忘れていました。これが、このエクスプロイトが Function のプロパティにしか影響しない理由です。
このCVEの修正では、開発者は Function.prototype と constructor をチェックしました: https://github.com/minimistjs/minimist/blob/v1.2.6/index.js#L73