JavaScriptコードを静的に分析するツールを提案します。この目的のために、入力JavaScriptファイルのAST(要約構文ツリー)を構築します。特定の実行パスを取得するために満たさなければならない条件について推論するために、その後、ASTに制御フローエッジを追加します。結果のグラフをCFG(コントロールフローグラフ)と呼びます。次に、さまざまな依存関係について推論するために、CFGにデータフローエッジを追加します。最後に、可変値を計算するために、ポインター分析を実行します。結果のグラフをPDG(プログラム依存グラフ)と呼びます。
現在の状態では、コードはPOCであり、本格的な生産対応APIではないことに注意してください。
コントロールフローエッジでASTを強化するため、アレンのものとわずかに異なるCFGの定義を採用します。このようにして、制御フロー情報と細粒の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を参照)のタイムアウトと20GBのメモリ制限( src/build_pdg.pyの行115を参照)を追加したことに注意してください。
分析するいくつかのJavaScriptファイルを含むディレクトリDIRを考えてみましょう。これらすべてのファイルのPDGS(=制御フローとデータ分析で強化されたASTS)を生成するには、 srcフォルダーの場所から次のシェルコマンドを起動します。
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
対応するPDGは、 DIR/PDGに保存されます。
現在、1つのCPUを使用していますが、 src/utility_df.py (1行51 )から変数num_workersを変更することでそれを変更できます。
このプロジェクトは、 LICENSEで見つけることができるAGPL3ライセンスの条件に基づいてライセンスされています。