关于原型污染漏洞的完整指南
聚焦源代码安全,网罗国内外最新资讯!
编译:奇安信代码卫士
原型污染漏洞是安全社区所知不多的漏洞之一。2017年左右,研究人员开始将其视作一个潜在的攻击向量;2018年,第一批漏洞在野现身。本文将深入分析原型污染漏洞是什么以及如何缓解。
文章大纲如下:
1、原型污染:从何开始?
2、_proto_特性
3、原型污染漏洞何时产生?
4、原型污染漏洞案例
5、 原型污染漏洞增多
6、 _proto_:漏洞还是特性?
7、 缓解原型污染漏洞
8、 原型污染漏洞会绝迹吗?
原型污染:从何开始?
一切始于2015年,当时欧洲计算机制造商协会 (ECMA) 发布新标准(ECMAScript 2015,第六版),说明了 JavaScript 标准,确保不同 web 浏览器之间网页的兼容性。该标准包括了 _proto_ 特性的标准化。
_Proto_ 特性
在解释 _proto_ 是什么之前,我们先来快速查看下 JavaScript 中的一些基本定义:
Object(“对象“)可视作键值对,“键”是字符串,“值”可以是任何内容(类似于其它语言中的 “map” 或 “dictionary”)。你在 JavaScript(除了原语)中输入的所有东西就是一个object。
“prototype (原型)”是和 object 相关的一个属性,用作使 JavaScript objects 互相继承特性的机制。由于JavaScript 中几乎所有一切都是一个 object,因此 prototype 也是一个 object。
一个 Objects Prototype 可能也具有一个 “Prototype”,从中它可继承 prototype 或其它属性等,这种情况被称为“原型链”。
我们需要了解的关于 _proto_ 的三大要点是:
1、它指的是一个 object 所有 prototype 的特殊属性
2、所有 Objects 的属性 (Prototype) 都是 _proto_
3、_proto_也是一个 Objects
显然,”_proto_“意在作为特性,支持诸如从 JavaScript 类中继承所有属性等进程。但最终,”所有一切都是任意一切,而任意一切都是所有一切“有其弱点,或者更确切地说,是一个漏洞。
原型污染漏洞何时产生?
当攻击者操纵 _proto_(通常通过在 _proto_ 上新增一个新的 Prototype方式操纵)时就会发生原型污染。由于每个 object 都存在 _proto_,而且每个 Objects 都从其 Prototype 中继承 Prototypes,所有 JavaScript Objects 都会通过原型链继承该新增。恶意人员可利用这一能力将属性插入已有 JavaScript 代码中,并通过触发 JavaScript 例外执行拒绝服务攻击,或者通过插入恶意代码的方式实现远程代码执行。
以上说明的是Prototypes 的 Objects,之后再另外一个 Object(Object_#3) 的 _proto_ 之上新增了要给新的 Prototype (Prototype_#4)。这就使得所有的 Objects包括其原型(它们也都是“对象“)继承新的 Prototype即 Prototype_#4。结果就是导致应用程序崩溃。
原型污染漏洞案例:CVE-2020-28282
npm 包 “getobject” 是协助轻松获取并设置 Object’s 进程的库。该包的周下载量超过60万次且多个包有赖于它。由于 “_proto_”是JavaScript 中的一个特性,因此“getobject”等库的开发人员并非使用它才易受攻击,攻击者只需拥有一个解析 “_proto_” 的流,无需任何清理或缓解即可利用该漏洞并执行原型污染攻击。
审计 POC 代码,发现 “getobject” 包中的 set() 函数旨在将属性分配给 Object,且接受三个参数即 Obj、parts 和 value。由于不存在验证,因此,攻击者如能调整 parts 使其包含 _proto_ 提供恶意值,传递给 parts 和 value 参数的值就可遭攻击者操控。接着,check 将被分配给值为 “polluted” 的 _proto_ 即可,从而污染了应用程序中的所有 Objects。
在输出中可知,在污染发生前,obj2.check 是未定义的,之后当运行参数为 (obj, “_proto_.check”, “polluted”) 的 set() 函数时,污染发生。当前,obj2.check 存在且值为 “polluted”。通过将新的“未知” Prototype 分配给应用程序中的所有 Object,导致整个应用程序拒绝服务。
POC 代码如下:
const getObject = require('getobject');var obj = {}; var obj2 = 1; console.log("Before Polluting : " + obj2.Check);getObject.set(obj, "__proto__.Check", "polluted");console.log("After Polluting: " + obj2.Check);
输出如下:
Before Polluting : undefinedAfter Polluting: polluted
原型污染漏洞增多
了解了原型污染源自何处以及原型污染漏洞如何运作后,我们看一下过去几年来社区如何解决原型污染漏洞。
从上表可了解到安全社区发现原型污染漏洞后,所公开的漏洞数量。上表显示在2019年有一个很大的上升趋势,尤其在2020年更是如此。虽然现在还不知道2021年的原型污染漏洞数量到底有多少,但目前来看这种上升趋势似乎会趋于稳定。
_proto_:漏洞还是特性?
在过去,”_proto_” 可能是一个有用的特性,但由于它已标准化以确保和 web 浏览器的兼容性,该功能不再受社区推崇。目前尚不清楚该功能会被删除还是保留为兼容性服务。流行的建议是避免使用该特性:MDN 甚至弃用该特性且建议使用 Object.getPrototypeof。鉴于当前的最佳实践,很难认为 _proto_ 不是漏洞。
这种情况使保护代码不受所使用编程语言特性的危害作为维护人员和开发人员的又一项工作。
缓解原型污染漏洞
缓解原型污染漏洞的方式有很多:
Object.freeze 将缓解几乎所有情况。冻结 Object 阻止添加新的 Prototype。
使用模式验证确保 JSON 数据包含预期属性,从而删除 JSON 中出现的 _proto_。
使用映射原语。它在 EcmaScript6 标准中引入,目前在 NodeJS 环境中备受支持。
使用 Object.creat(null) 函数创建的Objects 不具有 _proto_ 属性。
总体而言,在使用递归融合函数时要特别注意,因为相比其它函数更容易受原型污染漏洞影响。
原型污染漏洞会绝迹吗?
可以肯定地说,未来还会继续检测到新的原型污染漏洞。如之前所述,目前尚不清楚未来是否或者何时将删除 _proto_。在此之前,我们在开发代码时应将该漏洞考虑在内并缓解已有案例。
推荐阅读
jQuery CVE-2019-11358 原型污染漏洞分析和修复建议
原型污染 0day 漏洞影响所有流行的 Lodash 库版本(附详情和 PoC)
【漏洞预警】jQuery 前端库出现罕见的原型污染漏洞,影响范围广泛(含技术分析)
原文链接
https://www.whitesourcesoftware.com/resources/blog/prototype-pollution-vulnerabilities/
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。
觉得不错,就点个 “在看” 或 "赞” 吧~
关于原型污染漏洞的完整指南相关推荐
- NodeBB原型污染漏洞可导致账户遭接管
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 用于创建论坛应用的 Node.js 平台 NodeBB,已修复一个原型污染漏洞,它可导致攻击者模拟其它用户并接管管理员账户.该漏洞是由于错误地处 ...
- Node.js 沙箱易受原型污染攻击
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 研究人员表示,用于测试不可信 JavaScript 代码的沙箱 vm2 中存在一个漏洞,可使恶意人员规避该库的安全控制并执行远程代码执行攻击. ...
- jQuery 的“原型污染”安全漏洞
前两周发布的 jQuery 3.4.0 除了常规更新外,更重要的是修复了一个称为"原型污染(prototype pollution)"的罕见安全漏洞. 什么是原型污染?顾名思义,原 ...
- Kibana原型污染导致远程执行代码 CVE-2019-7609 漏洞复现
Kibana原型污染导致远程执行代码(CVE-2019-7609) by ADummy 0x00利用路线 0x01漏洞介绍 Kibana是Elasticsearch的开源数据可视化仪表板. 5 ...
- node.js 原型污染攻击的分析与利用
目录 简介 javaScript中的对象 constructor是什么? javaScript中的原型 原型污染 Merge()为什么不安全? 简介 原型污染攻击, 如名所示, 是通过污染一个基础对象 ...
- Java SE 12扩展Switch语句/表达式完整指南
本文提供了Java SE 12扩展Switch语句/表达式的完整指南.文章详细介绍了扩展Java switch语句将其用作增强版switch语句或表达式.为帮助理解本文提供了具体案例. 本文要点 现在 ...
- 原型软件 (Prototype Development)开发指南
原型设计是一种极好的方式,可以就所提议的系统以及它满足用户信息需求的难易程度获得反馈,如下图所示.原型制作的第一步是估算构建系统模块所涉及的成本.如果程序员和分析师的时间成本以及设备成本都在预算范围内 ...
- 如何防止跨站点脚本 (XSS) 攻击完整指南
跨站点脚本 (XSS) 攻击的完整指南.如何防止它以及 XSS 测试. 跨站点脚本 (XSS) 是每个高级测试人员都知道的最流行和易受攻击的攻击之一.它被认为是对 Web 应用程序最危险的攻击之一,也 ...
- 3ds Max V-Ray5 完整指南大师班视频教程
3ds Max V-Ray5 完整指南大师班视频教程 时长15小时 包括项目文件 1920X1080 MP4 语言:英语+中文字幕(机译) 标题:Gumroad–V-Ray 5 Masterclass ...
最新文章
- pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数
- 一、typescript介绍和安装
- ERP系统的一般构成示意图
- 隐藏html表格边框显示,table显示所有边框 table的边框怎么显示不出来
- Nginx server_name正则表达式匹配配置
- 内存容量出现异常的解决办法
- [vue] vue2.0不再支持v-html中使用过滤器了怎么办?
- mysql管理员就业_MySQL管理员必备的十大工具盘点
- 画等高线_课堂妙招 | 辣椒玩转等高线
- linux 6.8 多网卡绑定,Linux6.1/6.5 双网卡绑定
- Tri-training regression, 协同训练回归
- 环境监测设备中,使用GPS模拟器测试TTFF和灵敏度的注意点
- 社交APP软件开发流程解析
- 网易云音乐会员下载正常音乐格式
- 【信管1.1】信息系统与信息化
- Sixth season seventeenth episode,Ross‘s self defense concept,Unage!!!?????
- TypeScript配置、tsconfig.json配置文件,TypeScript使用详解
- 中国队输球是有原因滴
- WINCE 实用技巧 之 创建快捷方式详解
- Vmware虚拟机文件介绍、克隆及文件名称更改方法