我们提出了一个工具来静态分析JavaScript代码。为此,我们构建了输入JavaScript文件的AST(抽象语法树)。为了理解要采取特定的执行路径必须满足的条件,我们随后将控制流动边添加到AST。我们将结果图称为CFG(控制流程图)。接下来,为了理解可变依赖性,我们将数据流动边缘添加到CFG。最后,为了计算变量值,我们执行指针分析。我们将结果图称为PDG(程序依赖图)。
请注意,在当前状态下,代码是POC,而不是完整的生产就绪API。
我们采用CFG的定义,与艾伦的定义略有不同,因为我们通过控制流动边缘增强了AST。这样,我们构建了一个联合结构,将控制流信息与细粒的AST节点和边缘结合在一起。我们的PDG也与Ferrante等人的定义略有不同。当我们选择将数据流添加到我们的CFG时。这样,我们保留有关陈述顺序的信息,并在可变级别(在AST上构建CFG)直接对数据流的细粒度表示。
可以在我的论文中找到其他详细信息。
该代码已用于静态分析浏览器扩展。请参阅Doublex Paper&Code。
此代码的初步版本也用于检测恶意JavaScript样本:Hidenoseek Paper&Code和JSTAP Paper&Code。
并研究JavaScript代码转换技术:纸张和代码。
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
要安装GraphViz(仅用于绘图图,尚未记录,请在有兴趣的情况下打开问题)
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
要生成特定 *.js文件的PDG,请从src文件夹位置启动以下Python3命令:
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
根据默认值,将不会存储相应的PDG。要将其存储在现有的PDG_Path文件夹中,请致电:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
请注意,我们为数据流/指针分析(参见src/build_pdg.py的第149行)添加了10分钟的超时,并且内存限制为20GB(参见src/build_pdg.py的第115行)。
让我们考虑一个目录DIR ,其中包含几个用于分析的JavaScript文件。要生成所有这些文件的PDG(通过控制和数据流以及指针分析增强的ASTS),请从src文件夹位置启动以下shell命令:
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
相应的PDG将存储在DIR/PDG中。
当前,我们使用1个CPU,但是您可以通过从src/utility_df.py (一行51 )修改变量num_worker来更改它。
该项目是根据AGPL3许可条款获得许可的,您可以在LICENSE中找到。