Keirsgieter ، W. ، & Visser ، W. (2020). الكسب غير المشروع: التحليل الثابت لـ Java Bytecode مع قواعد بيانات الرسم البياني. مؤتمر معهد جنوب إفريقيا لعلماء الكمبيوتر وفني المعلومات 2020.
الكسب غير المشروع هو أداة تحليل ثابت لبرامج Java ، استنادًا إلى نظرية الرسوم البيانية لخصائص الكود (CPGs).
يتم إنشاء CPG من Java Bytecode وتخزينها في قاعدة بيانات الرسم البياني المحلي. يمكن اجتياز الرسم البياني للعثور على مختلف نقاط الضعف الأمنية المشتركة ، بما في ذلك نقاط الضعف المتعلقة بالثغرات.
يتم توفير قذيفة سطر الأوامر أيضًا التي تسمح للمستخدم بإجراء عمليات تعبيرية مخصصة على 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 قذيفة رائعة على 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 بشكل تفاعلي وتشغيل التمريرات عليه.
مثال تدفق العمل:
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>' )