
مُشوِّه ثنائي موجَّه بالتغطية لنظامي Windows وmacOS وLinux وAndroid
Copyright 2020 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Jackalope هو أداة fuzzing قابلة للتخصيص وموزعة وموجهة بالتغطية (coverage-guided) قادرة على العمل مع الملفات التنفيذية ذات الصندوق الأسود (black-box binaries).
بينما يوجد الكثير من أدوات fuzzing الجيدة الموجهة بالتغطية التي تعمل على الأهداف التي يتوفر لها الكود المصدري، هناك عدد قليل نسبيًا منها يعمل على الملفات التنفيذية ذات الصندوق الأسود، خاصة على أنظمة تشغيل Windows وmacOS، وتلك الموجودة منها تعتمد بشكل أساسي على قواعد برمجية ليست سهلة التخصيص كثيرًا. الأهداف الأولية لـ Jackalope هي:
يمكن استخدام Jackalope بشكل مستقل، لكنه أكثر قوة عند استخدامه كمكتبة، حيث يمكن للمستخدمين إضافة مكونات مخصصة تحل محل السلوك الافتراضي. بشكل افتراضي، يأتي Jackalope مزودًا بـ:
يمكن تشغيل Jackalope بالتوازي
-nthreads-start_server) وجعل أدوات الـ fuzzer على أجهزة العمال تتصل بهذا الخادم (علم سطر الأوامر -server). يقوم الخادم بعد ذلك بجمع وتوزيع العينات والانهيارات والتغطية عبر العمال.لا يتضمن Jackalope حاليًا استراتيجيات تحوير متقدمة. بدلاً من ذلك، يأتي مزودًا بمجموعة من Mutators العامة، والتي ستعمل مع العديد من الأهداف، ومع ذلك يُشجَّع المستخدمون على كتابة Mutators واستراتيجيات تحوير مخصصة وفقًا للأهداف التي يريدون عمل fuzzing لها.
حاليًا، يتم دعم عمل fuzzing للملفات التنفيذية ذات الصندوق الأسود على أنظمة تشغيل Windows وmacOS وLinux وAndroid.
على Linux، يمكن لـ Jackalope أيضًا العمل مع Sanitizer Coverage (يتطلب الكود المصدري للهدف). هذا الوضع موثق في مستند منفصل.
المتطلب الأساسي: Python 3
افتح طرفية وأعدّ بيئة البناء الخاصة بك إذا لزم الأمر. على Windows، بدلاً من فتح موجه أوامر عام، ستحتاج إلى فتح موجه أوامر Visual Studio للمنصة التي تبني لها، أو تشغيل vcvars64.bat / vcvars32.bat.
انتقل إلى الدليل الذي يحتوي على الكود المصدري.
شغّل الأوامر التالية:
cd Jackalope
git clone --recurse-submodules [email protected]:googleprojectzero/TinyInst.git
(alternately: git clone --recurse-submodules https://github.com/googleprojectzero/TinyInst.git)
mkdir build
cd build
cmake <generator arguments> ..
cmake --build . --config Release
تعتمد معاملات المولّد (generator arguments) على بيئتك. على macOS ستحتاج إلى استخدام -G Xcode، بينما على سبيل المثال على Windows مع Visual Studio 2019 ولبناء 64-بت ستستخدم -G "Visual Studio 16 2019" -A x64. على Linux، لا تُطلب أي معاملات مولّد. عند الترجمة المتقاطعة (cross-compiling) لـ Android، هناك حاجة إلى معاملات cmake إضافية، وهي نفسها الموصوفة في تعليمات بناء TinyInst لـ Android. إذا كنت تعمل على fuzzing لـ Android على جهاز افتراضي يدعم الذاكرة المشتركة عبر /dev/shm، فإن -DANDROID_TARGET=VM يفعّل توصيل العينات عبر الذاكرة المشتركة.
للبناء للتشغيل مقابل ملفات arm64e التنفيذية على macOS، انظر هنا.
هل تحصل على خطأ No CMAKE_C_COMPILER could be found على macOS؟ جرّب تحديث cmake. تأكد أيضًا من تثبيت Xcode وأنك شغّلته مرة واحدة على الأقل (فهو يثبّت بعض المكونات عند التشغيل الأول).
الاستخدام:
./fuzzer <fuzzer arguments> <instrumentation and other components arguments> -- <target command line>
معاملات سطر الأوامر التالية مدعومة:
-in - دليل الإدخال (الدليل الذي يحتوي على مجموعة العينات الأولية). إذا كان دليل الإدخال هو "-"، يحاول الـ fuzzer استعادة الجلسة السابقة (نفس استخدام علم -restore).
-out - دليل الإخراج
-t - مهلة العينة بالمللي ثانية
-t1 - مهلة تهيئة الهدف (على سبيل المثال قبل الوصول إلى دالة الهدف إذا كانت محددة). القيمة الافتراضية هي مهلة العينة.
-nthreads - عدد خيوط الـ fuzzer. القيمة الافتراضية هي 1.
-delivery <file|shmem> - آلية توصيل العينات المراد استخدامها. إذا كانت file، يتم إخراج كل عينة كملف ويُستبدل "@@" في معاملات الهدف بمسار الملف. إذا كانت shmem، ينشئ الـ fuzzer ذاكرة مشتركة بدلاً من ذلك ويستبدل "@@" في معاملات الهدف باسم الذاكرة المشتركة. في هذه الحالة تقع على عاتق الهدف مسؤولية فتح الذاكرة المشتركة واستخراج العينة. القيمة الافتراضية هي file.
-file_extension - عند استخدام توصيل العينات عبر file، يضيف الامتداد المحدد إلى اسم الملف. مفيد إذا كان الهدف يتوقع أن يكون لملفات الإدخال امتداد معين.
-restore أو -resume - يستعيد ويستأنف جلسة fuzzing سابقة. يدعم كل من عملية الـ fuzzer وعملية الخادم الاستعادة.
-server - يحدد خادم التغطية المراد استخدامه.
-start_server - تشغيل عملية خادم بدلاً من عملية fuzzing.
-crash_retry - عدد المرات لمحاولة إعادة إنتاج انهيار. القيمة الافتراضية هي 10. الانهيارات التي لا يُعاد إنتاجها خلال هذا العدد من المحاولات أو لا يُعاد إنتاجها عند التشغيل بدون instrumentation تُصنَّف كمتقلبة (flaky).
-coverage_retry - عدد المرات لإعادة محاولة إنتاج تغطية جديدة. التغطية التي لا يمكن إعادة إنتاجها بشكل موثوق خلال هذا العدد من المحاولات تُعتبر متقلبة. العينات التي تحتوي فقط على تغطية متقلبة لا يتم حفظها.
-clean_target_on_coverage - إعادة تشغيل الهدف عند إعادة إنتاج التغطية. القيمة الافتراضية هي true.
-minimize_samples - محاولة تصغير العينات الجديدة قبل حفظها في المجموعة (corpus). القيمة الافتراضية هي true.
-iterations_per_round - عدد المرات لتحوير وتشغيل عينة من المجموعة قبل الانتقال إلى العينة التالية. القيمة الافتراضية هي 1000. قد تفكر في تقليل هذه القيمة للأهداف البطيئة جدًا.
-deterministic_mutations - استخدام التحويرات الحتمية بالإضافة إلى غير الحتمية. القيمة الافتراضية هي true ما لم يُستخدم علم -server.
-deterministic_only - إعطاء الأولوية للتحويرات الحتمية. ملاحظة: حتى مع هذا العلم، سيظل الـ fuzzer يستخدم تحويرات غير حتمية، ولكن فقط بعد استنفاد جميع التحويرات الحتمية. قد يكون مفيدًا عند التشغيل مع -server أن تقوم نسخة عميل واحدة بتنفيذ التحويرات الحتمية.
-max_sample_size - الحد الأقصى لحجم العينة المراد استخدامه. يتم تقليم جميع عينات الإدخال الأكبر من max_sample_size ولا يمكن للـ mutators إنتاج عينات جديدة تتجاوز هذا الحجم. القيمة الافتراضية هي 1000000. تحذير: عند استخدام توصيل العينات عبر الذاكرة المشتركة، يجب أن يتطابق max_sample_size مع الحد الأقصى لحجم العينة المتوقع من الهدف، على سبيل المثال كما في الهدف الاختباري هنا.
-keep_samples_in_memory - ما إذا كان يجب الاحتفاظ دائمًا بجميع العينات في الذاكرة. القيمة الافتراضية هي true. يُوصى به ما لم تكن المجموعة كبيرة جدًا بحيث لا تتسع في الذاكرة.
-track_ranges - تفعيل ميزة تتبع نطاق القراءة. مزيد من المعلومات هنا.
-dry_run - يجعل Jackalope يخرج بعد معالجة جميع عينات الإدخال، ولكن قبل بدء الـ fuzzing الفعلي. مفيد لتصغير المجموعة (ملاحظة: Jackalope يضيف فقط العينات التي تحتوي على تغطية لم تُشاهد سابقًا إلى مجموعة الإخراج) أو إعادة إنتاج عدد كبير من الانهيارات.