Chromium 原型污染漏洞导致Sanitizer API 被绕过
编译:代码卫士
Sanitizer API 是一款内置浏览器库,用于删除受用户控制的输入中的潜在恶意代码。原型污染是一种JavaScript 漏洞,可导致攻击者利用JavaScript 编程语言的规则更改应用程序的行为并以多种方式攻陷该应用。
安全研究员 Michal Bentkowski 表示,该漏洞强调了防御客户端原型污染攻击面临的挑战。
原型污染可发生在客户端(浏览器)和服务器端(Node.js 服务器)。Bentkowski 在这一领域开展了大量研究工作,他在探索Chromium 中的客户端原型污染漏洞使发现了这个新漏洞。
Sanitizer API 被添加到Chromium 浏览器中,支持将原生清理取代第三方库如DOMPurify。
Bentkowski研究发现,如果JavaScript 对象Sanitizer 以空对象作为参数进行初始化,则会触发绕过清理流的内部机制。Bentkowski表示该空对象导致浏览器“遍历原型链”。
Bentkowski 展示了API如何缺乏对嵌入SVG对象的JavaScript片段的清理,进行概念验证。一旦将假设已清理的SVG插入该页面,就会执行JavaScript 代码。Bentkowski在报告中提到要利用该漏洞,必须启用浏览器的 #enable-experimental-web-platform-features。
他表示,“我认为启用该标记的人很少。然而,Sanitizer API 在Chrome 105(8月底发布)中是默认启用的,因此受影响人数要大得多。”
Chromium bug追踪工具上的讨论情况说明了原型污染漏洞边界的复杂性。操纵原型是JavaScript之所以灵活和用途广泛的特性之一,也就是说加固应用程序安全使其免受原型污染攻击将一直要求web开发人员的细致投入。
正如一名安全研究员在讨论中提到的那样,该原型污染向量并不是 Sanitizer API中应当解决的问题。这名研究员指出,“Object原型被污染的环境已遭攻陷,我认为选择加固所选web API不会提供更实际的好处,它可能只是会让人有一种关于安全和API认知复杂性花费的错觉。”
Bentkowski 指出,“在报告该bug前,我不知道WebIDL 标准的存在,该标准定义原型链必须由 Web APIs 遍历。这意味着它实际是一种特性,而且现在也无法改变它,因为改变后向后不兼容,也就是说很多应用程序将会崩溃。”因此,开发人员需要识别并从受用户控制的来源中删除所有污染原型的工具。
尽管如此,Bentkowski 的发现确实带来一些修复方案。他表示,“该bug仅在SVG实例中起作用。最后它是提交中的真实bug。原型污染本身是‘特性’。然而,它不应能够通过特殊构造的配置对象而绕过Sanitizer。”
关于原型污染漏洞的完整指南
【漏洞预警】jQuery 前端库出现罕见的原型污染漏洞,影响范围广泛(含技术分析)
原型污染 0day 漏洞影响所有流行的 Lodash 库版本(附详情和 PoC)
jQuery CVE-2019-11358 原型污染漏洞分析和修复建议
https://portswigger.net/daily-swig/prototype-pollution-bug-in-chromium-bypassed-sanitizer-api
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。