Keirsgieter, W., et Visser, W. (2020). Graft: analyse statique de Java Bytecode avec bases de données graphiques. Conférence de l'Institut sud-africain des informaticiens et technologues de l'information 2020.
Graft est un outil d'analyse statique pour les programmes Java, basé sur la théorie des graphiques de la propriété de code (CPG).
Le CPG est généré à partir de Java Bytecode et stocké dans une base de données de graphiques locale. Le graphique peut être traversé pour trouver diverses vulnérabilités de sécurité communes, y compris les vulnérabilités liées à la souillure.
Un shell de ligne de commande est également fourni qui permet à l'utilisateur d'effectuer des traversées ad hoc sur le CPG de manière interactive.
Vous êtes invités à utiliser ce projet à des fins de recherche, mais n'oubliez pas de nous citer!
@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 est un projet Gradle et peut être construit en exécutant simplement gradle build (ou ./gradlew build ).
Pendant la construction, deux scripts exécutables sont générés: graft et graft-shell . Toutes les références à graft dans la section d'utilisation se réfèrent à l'exécutable graft . graft-shell ouvre une coquille groovy sur le chemin de classe Graft (voir la section graft-shell en usage).
La greffe doit être initialisée dans le projet en exécutant graft init avant que le CPG puisse être construit et analysé.
graft init Cette commande initialise le projet Graft en créant un dossier .graft dans le répertoire racine du projet. Ce dossier contient un fichier de propriétés avec la configuration du projet et un dossier db qui stocke la base de données de graphiques.
L'utilisateur fournit un nom pour le projet, le répertoire cible du projet (où se trouvent les classes Java) et ClassPath, et sélectionne l'implémentation de la base de données de graphiques.
Après initialisation, la base de données ne contient qu'un seul nœud racine - le CPG peut être construit avec graft build .
graft buildCette commande effectue la construction initiale du CPG. Si la base de données contient déjà un CPG, l'utilisateur a la possibilité de l'écraser.
La construction du CPG prend un certain temps et ne devrait être exécutée qu'une seule fois après avoir exécuté graft init pour la première fois. Si le programme a changé et que le CPG doit être mis à jour, l'utilisateur doit faire graft update à la place.
graft statusImprimez l'état du CPG - Nombre de nœuds et de bords, ainsi que les classes ont changé depuis la dernière mise à jour.
graft updateCette commande vérifie les modifications du programme cible qui ne sont pas encore reflétées dans le CPG en comparant les valeurs de hachage des fichiers de classe. Si certaines classes ont été modifiées, elles seront mises à jour dans le CPG sans affecter le reste du graphique.
Cette procédure est beaucoup plus rapide que de reconstruire le graphique entier à chaque fois, et devrait probablement être exécuté après chaque changement incrémentiel du programme.
graft run <analysis> Cette commande peut être utilisée pour exécuter une analyse prédéfinie sur le graphique. Deux de ces analyses ( TaintAnalysis et AliasAnalysis ) sont intégrées et peuvent être exécutées avec graft run taint et graft run alias respectivement.
graft dot <dotfile>Cette commande imprime le CPG dans le fichier donné au format DOT pour la visualisation. Pas recommandé pour autre chose que des programmes trivialement petits (cette commande est vraiment plus utile pour le débogage).
graft dump <dumpfile>Cette commande vide le CPG vers le fichier donné pour la portabilité. Encore une fois, non recommandé pour les graphiques plus grands.
graft-shellCette commande ouvre la coque de greffe. De là, l'utilisateur peut inspecter de manière interactive le CPG et y exécuter des traversées.
Exemple de flux de travail:
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>' )