Keirsgieter, W., & Visser, W. (2020). Graft: Analisis statis java bytecode dengan database grafik. Konferensi Institut Ilmuwan Komputer dan Teknologi Informasi Afrika Selatan 2020.
Graft adalah alat analisis statis untuk program Java, berdasarkan teori grafik properti kode (CPG).
CPG dihasilkan dari java bytecode dan disimpan dalam database grafik lokal. Grafik dapat dilintasi untuk menemukan berbagai kerentanan keamanan umum, termasuk kerentanan terkait noda.
Shell baris perintah juga disediakan yang memungkinkan pengguna untuk melakukan traversal ad-hoc pada CPG secara interaktif.
Anda dipersilakan untuk menggunakan proyek ini untuk tujuan penelitian, tetapi harap diingat untuk mengutip kami!
@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 adalah proyek Gradle, dan dapat dibangun dengan hanya menjalankan gradle build (atau ./gradlew build ).
Selama pembangunan, dua skrip yang dapat dieksekusi dihasilkan: graft dan graft-shell . Semua referensi untuk graft di bagian penggunaan merujuk pada graft yang dapat dieksekusi. graft-shell membuka cangkang asyik pada cangkok cangkok (lihat bagian graft-shell dalam penggunaan).
Graft perlu diinisialisasi dalam proyek dengan menjalankan graft init sebelum CPG dapat dibangun dan dianalisis.
graft init Perintah ini menginisialisasi proyek graft dengan membuat folder .graft di direktori root proyek. Folder ini berisi file properti dengan konfigurasi proyek, dan folder db yang menyimpan database grafik.
Pengguna memberikan nama untuk proyek, direktori target proyek (di mana kelas Java berada) dan ClassPath, dan memilih implementasi database grafik.
Setelah inisialisasi, database hanya berisi satu simpul akar - CPG dapat dibangun dengan graft build .
graft buildPerintah ini melakukan konstruksi awal CPG. Jika database sudah berisi CPG, pengguna memiliki opsi untuk menimpanya.
Konstruksi CPG membutuhkan waktu, dan harus dijalankan hanya sekali setelah menjalankan graft init untuk pertama kalinya. Jika program telah berubah dan CPG perlu diperbarui, pengguna harus menjalankan graft update sebagai gantinya.
graft statusCetak status CPG - Jumlah node dan tepi, serta kelas berubah sejak pembaruan terakhir.
graft updatePerintah ini memeriksa perubahan dalam program target yang belum tercermin dalam CPG dengan membandingkan nilai hash dari file kelas. Jika beberapa kelas telah diubah, mereka akan diperbarui di CPG tanpa mempengaruhi sisa grafik.
Prosedur ini jauh lebih cepat daripada merekonstruksi seluruh grafik setiap kali, dan mungkin harus dijalankan setelah setiap perubahan tambahan dalam program.
graft run <analysis> Perintah ini dapat digunakan untuk menjalankan analisis yang telah ditentukan pada grafik. Dua analisis tersebut ( TaintAnalysis dan AliasAnalysis ) dibangun dan dapat dijalankan dengan graft run taint dan graft run alias masing -masing.
graft dot <dotfile>Perintah ini mencetak CPG ke file yang diberikan dalam format DOT untuk visualisasi. Tidak direkomendasikan untuk apa pun selain program kecil yang sepele (perintah ini lebih berguna untuk debugging).
graft dump <dumpfile>Perintah ini membuang CPG ke file yang diberikan untuk portabilitas. Sekali lagi tidak direkomendasikan untuk grafik yang lebih besar.
graft-shellPerintah ini membuka cangkang cangkok. Dari sini, pengguna dapat secara interaktif memeriksa CPG dan menjalankan traversal di atasnya.
Contoh Aliran Kerja:
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>' )