Keirsgieter、W。、&Visser、W。(2020)。グラフト:グラフデータベースを使用したJava Bytecodeの静的分析。南アフリカのコンピューター科学者および情報技術者研究所2020の会議。
グラフトは、コードプロパティグラフ(CPG)の理論に基づいたJavaプログラムの静的分析ツールです。
CPGはJava Bytecodeから生成され、ローカルグラフデータベースに保存されます。グラフを通過して、TANT関連の脆弱性を含むさまざまな一般的なセキュリティの脆弱性を見つけることができます。
また、ユーザーがCPGでアドホックトラバーサルをインタラクティブに実行できるようにするコマンドラインシェルも提供されます。
このプロジェクトを研究目的で使用することを歓迎しますが、私たちを引用することを忘れないでください!
@article{Keirsgieter2020GraftSA,
title={Graft: Static Analysis of Java Bytecode with Graph Databases},
author={Wim Keirsgieter and Willem Visser},
journal={Conference of the South African Institute of Computer Scientists and Information Technologists 2020},
year={2020}
}
グラフトはGradleプロジェクトであり、 gradle build (または./gradlew build )を実行するだけで構築できます。
ビルド中に、2つの実行可能なスクリプトが生成されます: graftとgraft-shell 。使用法のgraftへのすべての参照は、 graft実行可能ファイルを参照しています。 graft-shellグラフトクラスパスにグルーヴィーなシェルを開きます(使用法のgraft-shellセクションを参照)。
CPGを構築および分析する前に、 graft init実行することにより、プロジェクト内でグラフトを初期化する必要があります。
graft initこのコマンドは、プロジェクトのルートディレクトリに.graftフォルダーを作成することにより、グラフトプロジェクトを初期化します。このフォルダーには、プロジェクトの構成を備えたプロパティファイルと、グラフデータベースを保存するdbフォルダーが含まれています。
ユーザーは、プロジェクトの名前、プロジェクトのターゲットディレクトリ(Javaクラスが配置されている場所)およびClassPathを提供し、グラフデータベースの実装を選択します。
初期化後、データベースには単一のルートノードのみが含まれています-CPGはgraft buildで構築できます。
graft buildこのコマンドは、CPGの初期構造を実行します。データベースに既にCPGが含まれている場合、ユーザーはそれを上書きするオプションがあります。
CPGの建設には時間がかかり、 graft initを初めて実行した後に1回だけ実行する必要があります。プログラムが変更され、CPGを更新する必要がある場合、ユーザーは代わりにgraft updateを実行する必要があります。
graft statusCPGのステータスを印刷 - ノードとエッジの数、および最後の更新以降にクラスが変更されました。
graft updateこのコマンドは、クラスファイルのハッシュ値を比較してCPGにまだ反映されていないターゲットプログラムの変更をチェックします。いくつかのクラスが変更されている場合、それらはグラフの残りの部分に影響を与えることなくCPGで更新されます。
この手順は、毎回グラフ全体を再構築するよりもはるかに高速であり、おそらくプログラムの増分変更ごとに実行する必要があります。
graft run <analysis>このコマンドを使用して、グラフで事前定義された分析を実行できます。このような2つの分析( TaintAnalysisとAliasAnalysis )が組み込まれており、それぞれgraft run taintとgraft run aliasを使用して実行できます。
graft dot <dotfile>このコマンドは、視覚化のために特定のファイルにドット形式で指定されたファイルに印刷します。些細な小さなプログラム以外には推奨されません(このコマンドは、実際にデバッグするのに役立ちます)。
graft dump <dumpfile>このコマンドは、PortabilityのためにCPGを指定されたファイルにダンプします。再び、より大きなグラフにはお勧めしません。
graft-shellこのコマンドは移植片シェルを開きます。ここから、ユーザーはCPGをインタラクティブに検査し、その上のトラバーサルを実行できます。
ワークフローの例:
import graft . cpg . structure . CodePropertyGraph
import static graft . traversal . __ .*
import static graft . Const .*
cpg = CodePropertyGraph . fromFile ( '<db_filename>' )
// get a list of all method entry nodes in the CPG
entries = cpg . traversal (). entries (). toList ()
// get a list of all assignments to the variable 'x'
assigns = cpg . traversal (). getAssignStmts (). where ( getTgt (). has ( NAME , 'x' )). toList ()
// dump the current CPG to a file
cpg . dump ( '<filename>' )
// write the current CPG to a dotfile
cpg . toDot ( '<filename>' )