静态代码扫描方法及工具介绍

安全工具 2019-11-09

本文作者:国勇(信安之路特约作者)

静态扫描就是不运行程序,通过扫描源代码的方式检查漏洞,常见的方法也有多种,如把源代码生成 AST(抽象语法树)后对 AST 进行分析,找出用户可控变量的使用过程是否流入到了危险函数,从而定位出漏洞;或者通过正则规则来匹配源代码,根据平常容易产生漏洞的代码定制出规则,把这些规则代入到代码中进行验证来定位漏洞。当然静态扫描由于不运行程序也有好多事情处理不了,如程序通过运算得到的一个结果后,就没办法分析这个结果了,所以需要动态运行程序来解决这个问题,也就是动态扫描,动态扫描可以通过单元测试或人工扫描等方式,下面分别介绍一下 AST 扫描 与 正则匹配两种常见静态扫描方式。

AST(抽象语法树)扫描

img

此方式把源码生成 AST(抽象语法树),找出用户可控的 source (如 location.hrefdocument.urldocument.documentURI) 是否流入到了敏感的 skin (如 evilnew functionsetTImeoutsetInterval) 中,常见的 source 与 skin 可参考这个文档:

https://docs.google.com/spreadsheets/d/1Mnuqkbs9L-s3QpQtUrOkPx6t5dR3QyQo24kCVYQy7YY/edit#gid=0

扫描程序负责把所有的 source 与 skin 查找出来,并找出 source 已流入到了 skin 中的代码已及行号,并存入到结果中,举个例子:

document.getElement('girl').innerHTML = location.href.split(#)[1]

这句代码命中了 source 流入到了敏感 skin 中,从而产生了漏洞,也很明显能看出产生了 domXss,不过在实际情况中更加复杂,如把 source 当成了函数参数,经过了多个函数处理,扫描程序就需要跟踪这些这种流入到不同的函数中的情况。

正则匹配

这种方式比较简单,就是匹配程序中是否出现了哪些敏感字符,如 bodyParse() 或者敏感代码,当函数中的代码命中了设置的规则,则就产生了漏洞,举个例子

(.readFile()(.{0,40000})(req.|req.query|req.body|req.param)

上面是一条正则规则,当函数中有一行代码为 fs.readFile('/etc/'+req.param.path),则命中了规则并报出有漏洞。

Javascript 扫描工具介绍

下面分别介绍两款工具,jsprimeNodeJSScan 的介绍与实现原理,其中 jsprime 是通过分析 AST 扫描,NodeJSScan 是通过正则表达式扫描。

jsprime

img

效果图,左边是源码,右边是分析结果

jsprime 是一个静态代码分析工具,其核心是基于 Esprima ECMAScript 生成 AST 进行扫描,此工具有在 blackhat 上演讲过,他的主要功能有:

https://www.slideshare.net/nishantdp/jsprime-bhusa13new

1、JS 库 source 与 skin 识别

2、JQuery 及 YUI 框架识别

3、变量与函数追踪(这项功能作为我们代码流分析算法的组成部分)。

4、变量与函数内容识别分析(这项功能作为我们代码流分析算法的组成部分)。

5、已知过滤器功能识别。

6、遵循面向对象程序与原型设计合规标准。

7、最大程度降低误报机率。

8、支持 JavaScript 代码精简。

9、极高运行速度。

10、只需点击即可操作.

JSPrime 是怎么工作的?

1、把源代


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论