Keirsgieter, W., & Visser, W. (2020). 이식편 : 그래프 데이터베이스를 사용한 Java Bytecode의 정적 분석. 남아프리카 컴퓨터 과학자 및 정보 기술자 연구소 회의 2020.
이식은 코드 속성 그래프 (CPG) 이론을 기반으로 Java 프로그램을위한 정적 분석 도구입니다.
CPG는 Java Bytecode에서 생성되고 로컬 그래프 데이터베이스에 저장됩니다. 테인트 관련 취약점을 포함하여 다양한 일반적인 보안 취약점을 찾기 위해 그래프를 통과 할 수 있습니다.
사용자가 대화식으로 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 )를 실행하여 구축 할 수 있습니다.
빌드 중에는 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 실행 한 후에 만 한 번만 실행해야합니다. 프로그램이 변경되었고 CPG를 업데이트 해야하는 경우 사용자는 대신 graft update 실행해야합니다.
graft statusCPG의 상태 - 노드 및 모서리 수와 마지막 업데이트 이후 클래스가 변경되었습니다.
graft update이 명령은 클래스 파일의 해시 값을 비교하여 CPG에 아직 반영되지 않은 대상 프로그램의 변경 사항을 확인합니다. 일부 클래스가 변경되면 나머지 그래프에 영향을 미치지 않고 CPG에서 업데이트됩니다.
이 절차는 매번 전체 그래프를 재구성하는 것보다 훨씬 빠르며 프로그램의 각 점진적인 변경 후에 실행해야 할 것입니다.
graft run <analysis> 이 명령은 그래프에서 사전 정의 된 분석을 실행하는 데 사용할 수 있습니다. 이러한 두 가지 분석 ( TaintAnalysis 및 AliasAnalysis )은 각각 이식 graft run taint 및 graft run alias 로 실행할 수 있습니다.
graft dot <dotfile>이 명령은 CPG를 시각화를 위해 DOT 형식의 주어진 파일로 인쇄합니다. 사소한 작은 프로그램 이외의 다른 것에 대해 권장되지 않습니다 (이 명령은 실제로 디버깅에 더 유용합니다).
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>' )