Keirsgieter, W. & Visser, W. (2020). Transplantat: Statische Analyse von Java -Bytecode mit Diagrammdatenbanken. Konferenz des Südafrikanischen Instituts für Informatiker und Informationstechnologisten 2020.
Grantat ist ein statisches Analyse -Tool für Java -Programme, die auf der Theorie der Codemeigenschaftsgraphen (CPGs) basieren.
Das CPG wird aus Java -Bytecode generiert und in einer lokalen Graph -Datenbank gespeichert. Die Grafik kann durchquert werden, um verschiedene gängige Sicherheitslücken zu finden, einschließlich minderwertiger Schwachstellen.
Es wird auch eine Befehlszeilenschale bereitgestellt, mit der der Benutzer Ad-hoc-Traverals auf dem CPG interaktiv durchführen kann.
Sie können dieses Projekt für Forschungszwecke verwenden, aber bitte denken Sie daran, uns zu zitieren!
@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}
}
Transplantat ist ein Gradle -Projekt und kann durch einfaches gradle build (oder ./gradlew build ) erstellt werden.
Während des Builds werden zwei ausführbare Skripte erzeugt: graft und graft-shell . Alle Verweise auf das graft im Abschnitt Verwendungsabschnitt beziehen sich auf die ausführbare graft . graft-shell öffnet eine groovige Hülle auf dem Transplantatklassenpfad (siehe Abschnitt zur Nutzung graft-shell ).
Das Transplantat muss innerhalb des Projekts initialisiert werden, indem graft init vor dem Bau des CPG initialisiert und analysiert werden kann.
graft init Dieser Befehl initialisiert das Transplantatprojekt, indem Sie einen .graft -Ordner im Root -Verzeichnis des Projekts erstellen. Dieser Ordner enthält eine Eigenschaftendatei mit der Konfiguration des Projekts und einen db -Ordner, der die Graphendatenbank speichert.
Der Benutzer liefert einen Namen für das Projekt, das Zielverzeichnis des Projekts (in dem sich die Java -Klassen befinden) und ClassPath und wählt die Implementierung der Grafikdatenbank aus.
Nach der Initialisierung enthält die Datenbank nur einen einzelnen Stammknoten - das CPG kann mit graft build erstellt werden.
graft buildDieser Befehl führt die anfängliche Konstruktion des CPG durch. Wenn die Datenbank bereits einen CPG enthält, hat der Benutzer die Möglichkeit, sie zu überschreiben.
Der Bau des CPG dauert einige Zeit und sollte nur einmal nach dem Laufen graft init zum ersten Mal ausgeführt werden. Wenn sich das Programm geändert hat und das CPG aktualisiert werden muss, sollte der Benutzer stattdessen graft update ausführen.
graft statusDrucken Sie den Status des CPG - Anzahl der Knoten und Kanten sowie die Klassen seit dem letzten Update geändert.
graft updateDieser Befehl überprüft Änderungen im Zielprogramm, die sich im CPG noch nicht durch Vergleich von Hash -Werten der Klassendateien widerspiegeln. Wenn einige Klassen geändert wurden, werden sie im CPG aktualisiert, ohne den Rest des Diagramms zu beeinflussen.
Dieses Verfahren ist viel schneller als jedes Mal die gesamte Grafik zu rekonstruieren und sollte wahrscheinlich nach jeder inkrementellen Änderung des Programms ausgeführt werden.
graft run <analysis> Dieser Befehl kann verwendet werden, um eine vordefinierte Analyse im Diagramm auszuführen. Zwei solcher Analysen ( TaintAnalysis und AliasAnalysis ) sind in gebaut und können mit graft run taint bzw. graft run alias durchgeführt werden.
graft dot <dotfile>Dieser Befehl druckt die CPG in die angegebene Datei im DOT -Format zur Visualisierung. Nicht für etwas anderes als trivial kleine Programme empfohlen (dieser Befehl ist nützlicher für das Debuggen).
graft dump <dumpfile>Dieser Befehl bringt den CPG zur angegebenen Datei zur Portabilität. Wiederum nicht für größere Grafiken empfohlen.
graft-shellDieser Befehl öffnet die Transplantatschale. Von hier aus kann der Benutzer die CPG interaktiv inspizieren und Traverals darauf ausführen.
Beispiel Arbeitsfluss:
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>' )