原出处: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。因此我们必须使用拥有 prototype 属性且未被列入黑名单的 constructor。
另一个例子:
npm run hack2
然而,在上述两个例子中,我们只能篡改值,而不能篡改函数的定义。
在针对 CVE-2020-7598(1.2.2 版本)的修复中,以及 1.2.3 版本中,开发者通过检查 __proto__、Arrary.prototype、Object.prototype、Number.prototype、String.prototype 修复了一些漏洞,
但他们忘记检查 Function.prototype。这就是为什么这个漏洞只能影响 Function 的属性。
针对此 CVE 的修复中,开发者同时检查了 Function.prototype 和 constructor:https://github.com/minimistjs/minimist/blob/v1.2.6/index.js#L73