原型污染(2020)

2021-04-22 11:30:12

2019年初,Snyk的安全研究人员披露了一个受欢迎的JavaScript库中Lodash中严重漏洞的细节,它允许黑客攻击多个Web应用程序。

安全漏洞是一个原型污染错误 - 一种漏洞,允许攻击者利用JavaScript编程语言的规则并以各种方式泄露应用程序。

JavaScript是基于原型的:当创建新对象时,它们会携带原型“对象”的属性和方法,其中包含基本功能,例如ToString,构造函数和HasowProperty。

基于对象的继承为JavaScript提供了Web程序员来爱的灵活性和效率 - 但它也使其变得易受篡改。

恶意演员可以通过修改对象对所有对象进行应用范围更改,因此名称原型污染。

有趣的是,攻击者甚至不需要直接修改对象 - 它们可以通过任何JavaScript对象的“__proto__”属性来访问它。一旦对对象进行了更改,它将适用于运行应用程序中的所有JavaScript对象,包括篡改后创建的对象。

这是一个原型污染工作原理的简单示例。以下代码将原型中的ToString函数的值更改为任意代码:

现在,每次在对象上调用toString()时,将弹出一个警报框,并将消息“污染”(除非对象显式覆盖Object.ToString()以其自己的实现)。由于ToString广泛用于客户端JavaScript,这将导致应用程序的执行中断。

其他原型污染攻击涉及将属性和方法添加到对象以操纵应用程序的行为。

“[原型污染]并不完全独特,因为它或多或少地是一种物体注射攻击,”安全研究员穆罕默德Aldoub告诉日常锯。 “但是,它特别特别的是,绝对不是大多数人都知道的主流漏洞类型之一。

“这是模糊的,因为它主要是针对特定语言/框架,而且因为它并不像其他人那样记录。然而,它与其他“主流”兽人的危险不那么危险。“

“原型污染的影响取决于申请,”安全研究员Michałbentkowski告诉每日Swig。

“在简单的时刻,每次JavaScript代码访问对象上不存在的属性(包括检查属性的存在),我们都可以使用原型污染更改检查的结果。”

他补充说:“取决于应用程序的确切逻辑,原型污染可能导致实际上所有流行的Web漏洞:远程代码执行(RCE),跨站点脚本(XSS),SQL注入等。”

在Web浏览器上,原型污染通常导致XSS攻击(见上文示例)。例如,在2019年,在JavaScript库jQuery中找到的原型污染错误留下了许多易受这种攻击的Web应用程序。

但其他漏洞可能会表面。 “对原型污染的客户端开发并未得到很好的涵盖,”Bentkowski说,他们目前正在进行详细说明本类别的利用如何绕过流行的HTML消毒者,例如HTML-Sanitize和Dompurify。

“通过使Node.js服务器崩溃,”安全研究员Posix告诉日常SWIG,至少拒绝服务服务器端的影响是至少拒绝服务。 “但是,它肯定有可能链接到其他漏洞,例如远程代码执行。”

去年,Bentkowski在KIBANA中发现了一个数据可视化库中的原型污染错误,这使得可以创建一个反向shell并实现RCE。

然后,7月,POSIX报告了流行的Express-FileUpload库中的相同类型的缺陷,这可能允许黑客获取对Node.js服务器的远程shell访问。

在同一月,安全研究员Francesco Soncina在对象映射JavaScript库类型中发现了一种原型污染漏洞,允许黑客逐步对Node.js应用程序的SQL注入攻击。

“如果根据库的最终应用程序具有动态代码评估或命令执行小工具,则攻击者可能会触发目标计算机上的任意命令执行,”Soncina写道。

与许多其他安全漏洞一样,攻击者通过Web应用程序中的用户输入来利用原型污染错误,并在文本字段,标题和文件中发送恶意代码。

“我猜信任用户输入是问题的实际根源,所以开发人员应该非常小心地对用户影响哪个对象字段,”Aldoub说。

另一个问题是写入许多JavaScript应用程序的方式。 “导致原型污染的编码模式在JavaScript代码中非常常见,”Bentkowski指出。

例如,许多JavaScript库接受选项对象,并检查对象是否存在特定属性。如果某些属性不存在,它们默认为某些预定义选项(下面的示例)。

在这种情况下,攻击者可以使用原型污染来覆盖某些选项并操纵应用程序的逻辑。

一种流行的防御它可以创建开发人员从输入字符串中删除危险字段的块列表。但这说服力比完成更容易。

“你必须枚举风险领域的所有可能性,以及编码这些领域的所有排列,这是一个不可估量的困难壮举,”Aldoub说。

例如,通过上述Lodash漏洞,开发人员最初检查了对字段__proto__的字符串,但是意识到构造函数也是原型污染的潜在目标。

另一个重要步骤是检查潜在原型污染漏洞的依赖性模块,这提出了自己的挑战。

“从应用程序开发人员的角度来看,很难检查在使用中的所有模块,”POSIX解释说。 “因此,在使用之前,有必要验证模块是否完全验证。”

所有的研究人员每日SWIG都发表了一种共同的关注:原型污染并没有得到足够的关注。

“我在这种脆弱性中感到无限潜力。但与可能性相比,我认为已经完成了足够的研究,“Posix说,他们一直专注于去年以来的原型污染袭击事件。

“社区需要在更多的深度和更多的关注中学习和练习这种类型的脆弱性,因为它仍然模糊不清,”Aldoub说。

Bentkowski补充说:“原型污染可能对Web应用程序的安全性产生严重影响,但在那里有许多来源,展示了实际世界案件的利用。

“所以,这是一个完美的研究目标,”研究人员说,与Java反序列化的类似危险类型的漏洞,多年来一直没有被注意到。 2015年FoxGlove的安全研究人员介绍了Java Deserialization的破坏性潜力,最后给了它所在安全社区中应得的牵引力。 “我觉得这种突破仍然是用于原型污染的突破,”Bentkowski说。