这是几个问题,所以我将尝试单独回答每个问题:
什么是原型污染以及攻击者如何使用它?
我不知道你有多少 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 版本,要么自己应用一个手动的反向移植补丁。这可能并不容易,但绝对必要。
如果您的应用程序从不处理任何用户输入,那么您可以延迟更新直到可以,但它应该在您的优先级列表中非常高。