Keirsgieter, W. & Visser, W. (2020). Трансплантат: статический анализ байткода Java с графическими базами данных. Конференция Южноафриканского института компьютерных ученых и информационных технологов 2020.
RENSPT - это статический инструмент анализа для Java -программ, основанный на теории графиков свойств кода (CPG).
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) и Classpath и выбирает реализацию базы данных графиков.
После инициализации база данных содержит только один корневой узел - CPG может быть построен с помощью graft build .
graft buildЭта команда выполняет начальную конструкцию CPG. Если база данных уже содержит CPG, у пользователя есть возможность перезаписать его.
Строительство CPG занимает некоторое время, и должна быть запущена только один раз после первого запуска graft init . Если программа изменилась, и CPG необходимо обновить, пользователь должен вместо этого запустить graft update .
graft statusРаспечатайте статус CPG - количество узлов и краев, а также классы, измененные с момента последнего обновления.
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>' )