Keirsgieter, W., & Visser, W. (2020). Enxerto: Análise estática do bytecode Java com bancos de dados de gráficos. Conferência do Instituto Sul -Africano de Cientistas da Computação e Tecnologistas da Informação 2020.
O enxerto é uma ferramenta de análise estática para programas Java, com base na teoria dos gráficos de propriedades de código (CPGs).
O CPG é gerado a partir de Java Bytecode e armazenado em um banco de dados de gráficos local. O gráfico pode ser percorrido para encontrar várias vulnerabilidades de segurança comuns, incluindo vulnerabilidades relacionadas a manchas.
Também é fornecido um shell da linha de comando que permite ao usuário executar travessias ad-hoc no CPG interativamente.
Você pode usar este projeto para fins de pesquisa, mas lembre -se de nos citar!
@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}
}
O enxerto é um projeto gradle e pode ser construído simplesmente executando gradle build (ou ./gradlew build ).
Durante a construção, dois scripts executáveis são gerados: graft e graft-shell . Todas as referências ao graft na seção de uso consulte o executável graft . graft-shell abre uma concha groovy no caminho de classe do enxerto (consulte a seção de graft-shell em uso).
O enxerto precisa ser inicializado dentro do projeto executando graft init antes que o CPG possa ser construído e analisado.
graft init Este comando inicializa o projeto do enxerto criando uma pasta .graft no diretório raiz do projeto. Esta pasta contém um arquivo de propriedades com a configuração do projeto e uma pasta db que armazena o banco de dados do gráfico.
O usuário fornece um nome para o projeto, o diretório de destino do projeto (onde as classes Java estão localizadas) e ClassPath e seleciona a implementação do banco de dados de gráficos.
Após a inicialização, o banco de dados contém apenas um nó raiz único - o CPG pode ser construído com graft build .
graft buildEste comando executa a construção inicial do CPG. Se o banco de dados já contiver um CPG, o usuário terá a opção de substituí -lo.
A construção do CPG leva algum tempo e deve ser executada apenas uma vez após a execução graft init pela primeira vez. Se o programa foi alterado e o CPG precisar ser atualizado, o usuário deve executar graft update .
graft statusImprima o status do número CPG - de nós e bordas, bem como as classes mudaram desde a última atualização.
graft updateEste comando verifica as alterações no programa de destino que ainda não estão refletidas no CPG comparando os valores de hash dos arquivos de classe. Se algumas classes forem alteradas, elas serão atualizadas no CPG sem afetar o restante do gráfico.
Esse procedimento é muito mais rápido que a reconstrução de todo o gráfico a cada vez e provavelmente deve ser executada após cada alteração incremental no programa.
graft run <analysis> Este comando pode ser usado para executar uma análise predefinida no gráfico. Duas dessas análises ( TaintAnalysis e AliasAnalysis ) são incorporadas e podem ser executadas com graft run alias graft run taint e corrida de enxerto de enxerto, respectivamente.
graft dot <dotfile>Este comando imprime o CPG para o arquivo fornecido no formato DOT para visualização. Não é recomendado para nada além de programas trivialmente pequenos (esse comando é mais útil para depurar realmente).
graft dump <dumpfile>Este comando despeja o CPG no arquivo fornecido para portabilidade. Novamente não recomendado para gráficos maiores.
graft-shellEste comando abre a concha do enxerto. A partir daqui, o usuário pode inspecionar interativamente o CPG e executar travessias nele.
Exemplo de fluxo de trabalho:
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>' )