来自:信安之路(微信号:xazlsec)
本文作者:国勇(信安之路特约作者)
静态扫描就是不运行程序,通过扫描源代码的方式检查漏洞,常见的方法也有多种,如把源代码生成 AST(抽象语法树)后对 AST 进行分析,找出用户可控变量的使用过程是否流入到了危险函数,从而定位出漏洞;或者通过正则规则来匹配源代码,根据平常容易产生漏洞的代码定制出规则,把这些规则代入到代码中进行验证来定位漏洞。当然静态扫描由于不运行程序也有好多事情处理不了,如程序通过运算得到的一个结果后,就没办法分析这个结果了,所以需要动态运行程序来解决这个问题,也就是动态扫描,动态扫描可以通过单元测试或人工扫描等方式,下面分别介绍一下 AST 扫描 与 正则匹配两种常见静态扫描方式。
AST(抽象语法树)扫描
此方式把源码生成 AST(抽象语法树),找出用户可控的 source (如 location.href
,document.url
,document.documentURI
) 是否流入到了敏感的 sink (如 evil
,new function
,setTImeout
,setInterval
) 中,常见的 source 与 sink 可参考这个文档:
https://docs.google.com/spreadsheets/d/1Mnuqkbs9L-s3QpQtUrOkPx6t5dR3QyQo24kCVYQy7YY/edit#gid=0。