我們提出了一個工具來靜態分析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中找到。