原文标题:Modular Call Graph Construction for Security Scanning of Node.js Applications
原文作者:Benjamin Barslev Nielsen, Martin Toldam Torp, Anders Møller
原文链接:https://cs.au.dk/~amoeller/papers/jam/paper.pdf
原文来源:ISSTA'21
笔记作者:[email protected]
笔记小编:[email protected]
现如今大多数的 Node.js 应用都会采用大量的第三方库来帮助实现其功能,据调查显示,一个典型的 Node.js 应用 90% 的代码都来自第三方库。而这些第三方库的来源是当下最大的软件库 NPM ,其拥有超过 100 万个 JavaScript 包,但不幸的是在这些包直接存在着严重的依赖关系,高达 40% 的 npm 包依赖的代码至少包含一个公开漏洞,因此如何解决 Node.js 应用的安全性检测是一个十分重要的问题。
我们期望的安全检测是当程序依赖于包含已知安全漏洞的库时能够给出警告。当下安全检测工具主要有 Dependabot, npm audit, Snyk 等,但这些工具有一个共同的特性,就是只从 package.json 中寻找包依赖,不看程序源代码,无法判断程序是否真的使用了库中有漏洞的部分,导致出现很多 false-positive(假阳性),因此本文的作者便提出了构建调用图的方法来做更加准确的安全检测。
作者该篇文章主要做出了以下贡献:
针对一个 npm 应用 writex 1.0.4,作者首先使用 npm audit 工具进行了安全扫描并获取了 5 个不同的安全建议,但是在作者手动进行源码验证时,发现其中只有一个安全建议是有效的,因此发现该工具存在极大的假阳性。而之所以会存在上述情况,以下述代码为例:
该代码片段首先 lib.js 模块执行了一个 filter 函数,而该函数以 iteratee 函数作为参数,并返回另一个函数。这个函数通过接收 arr 作为参数,并遍历其中元素分别传递给 iteratee 函数,最终返回一个经过 iteratee 函数处理过的数组。
通过该片段可以发现,JS 代码极为灵活,存在着多种的调用方式,因此直接静态分析是比较困难的,主要概括为:
整个方法共分为三个阶段。这里可能不能很好的讲解清楚,具体可以详细看一下论文。这里一些专有名词的翻译如下:
1.构建概要
为每个模块(file f)构造一个概要 ,而不考虑模块之间的调用关系, 包含:
其中:Loc = <file name, begin line>,Prop:属性名,Var:变量名/参数,Exp:表达式
2.表达式分析
对文件中每个表达式进行如下操作:别名分析、可达路径分析、概要构建。
1. 合并概要
合并 Node.js 应用所有模块的模块概要,例如:
2. 调用图定义
其中 V:各函数定义的Loc,E:调用边, :标注函数调用的访问路径,用于解析对高阶函数的参数调用等。
3. 调用图生成
提出一些约束规则,通过迭代地求解规则生成的约束来求解调用图。
1. 建立 npm 漏洞库中已知安全漏洞的模式
2. 如果待分析应用依赖于版本范围内某个包
findNodes:根据 API 模式和模块概要查找存在漏洞的函数在 f 中的位置。
3. 扫描器从入口点检查这些函数是否在应用程序的调用图中可达
如果可达,系统给出警告信息和调用路径。
实验选择了 12 个 Node.js 应用,这些应用使用 npm audit 工具检测往往存在 1 个及以上的警告,下面通过回答三个问题来证实其工具的有效性。
这里的 precision 指的是只有唯一被调用者的调用点所占的百分比。
作者针对其方法所带来的贡献进行了简要概括但未提及相关的不足,而针对未来针对调用图可能的研究目标包括:
个人认为从实验数据来看,本文所使用的图构建方法相比现有技术有着很大的提升,在召回率、精度、时间方法都取得了巨大的进步,是值得我们学习思考的;此外在 FP 上面的提升也能够帮助我们更好的解决一些问题,整体方法具有极好的效果,但实验个人认为还不够丰富,并且其中一些小问题可能还需要继续说明一些。
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com