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>' )