Keirsgieter,W。和W. Visser(2020)。移植:使用圖數據庫對Java字節碼的靜態分析。南非計算機科學家與信息技術人員2020會議。
Graft是基於代碼屬性圖理論(CPG)的Java程序的靜態分析工具。
CPG是從Java字節碼生成的,並存儲在本地圖數據庫中。該圖可以遍歷以找到各種常見的安全漏洞,包括與污染相關的漏洞。
還提供了命令線外殼,該命令殼允許用戶在交互式上執行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}
}
Graft是一個Gradle項目,可以通過簡單地運行gradle build (或./gradlew build )來構建。
在構建過程中,生成了兩個可執行的腳本: graft和graft-shell 。在“使用”部分中,所有對graft的引用均指graft可執行文件。 graft-shell在移植類路徑上打開了一個時髦的外殼(請參閱用法中的graft-shell部分)。
需要通過運行graft init在項目中初始化移植物,然後才能構建和分析CPG。
graft init該命令通過在項目的根目錄中創建.graft文件夾來初始化移植項目。該文件夾包含帶有項目配置的屬性文件,以及一個存儲圖形數據庫的db文件夾。
用戶為項目提供名稱,項目的目標目錄(Java類位置)和類Path,並選擇圖形數據庫實現。
初始化後,數據庫僅包含一個根節點 - CPG可以使用graft build 。
graft build此命令執行CPG的初始結構。如果數據庫已經包含CPG,則用戶可以選擇覆蓋它。
CPG的構建需要一些時間,首次運行graft init後應僅運行一次。如果程序已更改並且需要更新CPG,則用戶應運行graft update 。
graft status打印CPG的狀態 - 節點和邊緣的數量以及自上次更新以來的類別更改。
graft update該命令檢查目標程序中尚未通過比較類文件的哈希值而反映的目標程序中的更改。如果某些類已更改,則將在CPG中更新它們,而不會影響圖表的其餘部分。
此過程比每次重建整個圖都要快得多,並且可能在程序中的每個增量更改後運行。
graft run <analysis>該命令可用於在圖表上運行預定義的分析。內置了兩種這樣的分析( TaintAnalysis和AliasAnalysis ),並且可以分別以graft run taint和graft run alias運行。
graft dot <dotfile>此命令以點格式將CPG打印到給定文件以進行可視化。除了瑣碎的小程序外,不建議任何其他方法(此命令實際上對調試更有用)。
graft dump <dumpfile>此命令將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>' )