原文标题:DAPP: automatic detection and analysis of prototype pollution vulnerability in Node.js modules
原文作者:Hee Yeon Kim, Ji Hoon Kim, Ho Kyun Oh, Beom Jin Lee, Si Woo Mun, Jeong Hoon Shin, Kyounggon Kim
原文链接:https://link.springer.com/article/10.1007/s10207-020-00537-0#Sec6
发表会议:IJIS’22
笔记作者:NING@安全学术圈
笔记小编:黄诚@安全学术圈
1 研究介绍
NodeJS 作为当下 Web 服务端的主要开发平台,其安全性一直是这两年研究的热点问题,由于 Javascript 万物皆对象的特性,其对象最终的原型 Object 会影响到其他对象的属性、方法,因此出现了一种名为 原型污染(Prototype pollution) 的新兴漏洞类型,而这也是本文的主要研究对象。本文的主要工作如下:
-
开发了一个新型自动漏洞分析工具 DAPP,并在近 100w 个模块进行了自动分析
-
对原型链污染的脆弱性进行分析,是首次对于原型污染中可能的代码模式进行的研究
-
发现了 37 个以前未发现的漏洞
2 主要架构
上图能够看到,整个 DAPP 有三个主要的分析器:AST(Abstract Syntax Tree, 抽象语法树)、CFG(Control Flow Graph, 控制流图)、DFA(Data Flow Analysis, 数据流分析)。源代码经过不同的表述方式下进行模式过滤(即判断预定的 Vulnerability Pattern 是否出现在对应的代码表述方式中),从而判断其是否存在原型污染的脆弱性。
AST & CFG
这里 AST 解析器选用的是 esprima。这里不选择其他解析器的原因在于下一步使用的 CFG 生成器 esgraph 是依赖于 esprima,因此选择它是最合适的。CFG 和 AST 的关系在于,AST 负责解析 JS 代码,而 CFG 则是在 AST 的节点基础上,显示节点间的顺序关系,从而判断控制流的流向。
DFA analyzer
DFA 分析主要是在 AST 输出的函数/变量信息 和 CFG 输出的节点上进行进一步的数据可达性分析,判断数据流如何影响变量,以及会产生的影响等。
这里是我对于其 DFA 的一些理解。由于 JS 中每个对象都有原型,而其最原始的对象为 Object,因此其对象图可以构建成一个树。于是这里首先使用 DFS(深度优先)中后序遍历来对 CFG 的节点进行遍历并编号,从而获取拓扑排序。然而这里的 CFG 中可能存在循环的情况,于是这里选择使用 Lengauer Tarjan 算法来构建支配树,并使用支配树来生成一个合适的反向后序算法来确定优先级,在完成遍历后,将每个 CFG 流节点添加其上下文信息(变量信息),在所有在先前流节点中评估的上下文信息被连接并复制到当前流节点。基于上下文信息,计算当前流节点,并改变映射成变量的数据信息,最终确定数据的流向。反向后序算法具体如图 2 所示。
3 实验效果
实验有两个重要部分,第一部分是与其他工具 Olivier 的比较,第二部分是在真实场景下的漏洞发现。
真实效果
在真实场景下对最受欢迎的 3w 个包进行了测试,发现了 75 个脆弱点,并手工验证 37 个存在原型污染漏洞。
对比实验
首先模型性能,DAPP 能正确处理 100,000 模块中的 74,342 个,并且平均处理时间 6.1748s,除去安装、移除和捆绑外,DAPP 测试时间为 0.3554s;而 Olivier 成功运行 58,882,会出现无限循环等问题。
并且 Olivier 在 DAPP 检测出的 37 个漏洞中,有 26 个都检测不到任何漏洞,说明 DAPP 的检测效果更全面,算法更为完善。
4 个人思考
-
整体效果相比较 Olivier 确实有着很大的提升,但执行成功率 75% 确实还有这一些提升的空间;这里漏报率确实没法验证,而对于误报率 37/75 也是可以进一步进行优化
-
整体分析过程需要对代码分析有着一定的基础,同时在细节考虑上有些内容需要深度理解,这里我也仅是对主要内容进行了理解,而具体细节和 JS 特性部分还需要进一步研究
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com
原文始发于微信公众号(安全学术圈):DAPP: 自动检测并分析 NodeJS 模块原型漏洞