Keirsgieter, W. , & Visser, W. (2020) กราฟต์: การวิเคราะห์แบบคงที่ของ Java bytecode พร้อมฐานข้อมูลกราฟ การประชุมสถาบันนักวิทยาศาสตร์คอมพิวเตอร์และนักเทคโนโลยีสารสนเทศแห่งแอฟริกาใต้ 2020
กราฟต์เป็นเครื่องมือวิเคราะห์แบบคงที่สำหรับโปรแกรม Java ตามทฤษฎีของ กราฟคุณสมบัติรหัส (CPGs)
CPG ถูกสร้างขึ้นจาก Java bytecode และเก็บไว้ในฐานข้อมูลกราฟท้องถิ่น กราฟสามารถข้ามไปเพื่อค้นหาช่องโหว่ด้านความปลอดภัยทั่วไปรวมถึงช่องโหว่ที่เกี่ยวข้องกับ Taint
นอกจากนี้ยังมีเชลล์บรรทัดคำสั่งที่ช่วยให้ผู้ใช้สามารถดำเนินการข้ามแบบ Ad-Hoc บน 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}
}
กราฟต์เป็นโครงการ Gradle และสามารถสร้างได้โดยเพียงแค่ใช้ gradle build (หรือ ./gradlew build )
ในระหว่างการสร้างสคริปต์ที่ปฏิบัติการได้สองรายการจะถูกสร้างขึ้น: graft และ graft-shell การอ้างอิงทั้งหมดเพื่อ graft ในส่วนการใช้งานอ้างถึงการรับ graft graft-shell เปิดเปลือกหอย groovy บนกราฟ ClassPath (ดูส่วน 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 แบบโต้ตอบและเรียกใช้ Traversals ได้
ตัวอย่างการทำงาน:
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>' )