lodash中原型污染攻击漏洞如何处理?

信息安全 javascript npm 原型污染 罗达什
2021-09-01 02:56:22

据报道, lodash在 4.17.5 之前的版本(不包括)中容易受到所谓的原型污染攻击,请参阅https://nvd.nist.gov/vuln/detail/CVE-2018-3721

现在 lodash 是JavaScript 生态系统 最依赖的包其影响是,几乎每个至少中等规模的项目都包含大量不同版本的 lodash 依赖项和子依赖项(npm ls | grep lodash在您选择的 JS 项目中运行以自己查看)。现在,为所有在 < 4.17.5 版本中使用 lodash 的开源项目做出贡献需要大量的努力和大量的时间。

请解释一下,攻击者如何使用此漏洞,以及在使用 lodash 具有大量生产依赖项的大规模前端中处理此问题的正确方法是什么

1个回答

这是几个问题,所以我将尝试单独回答每个问题:

什么是原型污染以及攻击者如何使用它?

我不知道你有多少 JavaScript 知识,所以我会尽量保持通用性。JavaScript 广泛使用原型来实现对象继承。基本上,你写入原型的任何内容都将在对象实例中。Mozilla 文档会比我更好地解释这一点

根据HackerOne 上的报告,如果攻击者能够将自己的数据插入 lodash,他们就能够将自己的代码添加到对象中。以下 PoC 演示了这一点:

var _= require('lodash');
var malicious_payload = '{"__proto__":{"oops":"It works !"}}';

var a = {};
console.log("Before : " + a.oops);
_.merge({}, JSON.parse(malicious_payload));
console.log("After : " + a.oops);

如果您运行此代码,您可以看到它a已被修改,即使它从未被直接写入。

那么这对您的应用程序有何影响?好吧,这取决于您的代码。没有“包罗万象”的答案。在某些情况下,它可能是拒绝服务,在其他情况下可能是远程代码执行。

例如,可以将函数替换toString()为文字字符串。尝试调用字符串将导致错误,从而导致拒绝服务。

大型应用程序如何处理易受攻击的程序包?

要么尽快更新你的 lodash 版本,要么自己应用一个手动的反向移植补丁。这可能并不容易,但绝对必要。

如果您的应用程序从不处理任何用户输入,那么您可以延迟更新直到可以,但它应该在您的优先级列表中非常高。