إطار عمل أتمتة اكتشاف الهدف القابل للضرب مع تحليل ثابت
غالبًا ما يسخر الباحثون في الضعف الذين يقومون بتقييمات الأمن على البرمجيات إمكانيات التغذية الموجه من خلال أدوات قوية مثل AFL ++ و Libfuzzer. هذا أمر مهم لأنه يؤدي أتمتة عملية bughunting ويكشف عن الظروف القابلة للاستغلال في الأهداف بسرعة. ومع ذلك ، عند مواجهة قواعد الرموز الكبيرة والمعقدة أو الثنائيات المغلقة المصدر ، يتعين على الباحثين أن يكرسون الوقت بشكل شاق لمراجعة وعكسها يدويًا لتحديد الوظائف التي يمكن أن يكون فيها الاستكشاف القائم على الضباب مفيدًا.
Fuzzable هو إطار عمل يدمج كل من كود المصدر C/C ++ والثنائيات لمساعدة الباحثين في الضعف في تحديد أهداف الوظائف القابلة للتطبيق. يتم ذلك من خلال تطبيق العديد من الاستدلال القائم على التحليل الثابت لتحديد السلوكيات المحفوفة بالمخاطر في البرنامج والوظائف التي تنفذها. يمكن للباحثين بعد ذلك الاستفادة من الإطار لإنشاء قوالب تسخير أساسية ، والتي يمكن بعد ذلك استخدامها للبحث عن نقاط الضعف ، أو أن يتم دمجها كجزء من خط أنابيب مستمر ، مثل مشروع OSS-Fuzz من Google.
بالإضافة إلى التشغيل كأداة مستقلة ، تم دمج fuzzable أيضًا كمكون إضافي لفصل النينجا الثنائي ، مع دعم الخلفية الأخرى للتفكيك.
تحقق من منشور المدونة الأصلي الذي يوضح الأداة هنا ، والذي يسلط الضوء على المواصفات الفنية لاستدلال التحليل الثابت وكيف ظهرت هذه الأداة. تظهر هذه الأداة أيضًا في Black Hat Arsenal USA 2022.
قد تتطلب بعض الأهداف الثنائية بعض التعقيم (أي مطابقة التوقيع ، أو تحديد الوظائف من الإطار) ، وبالتالي يستخدم في المقام الأول النينجا الثنائية كخلفية تفكيك بسبب قدرتها على حل هذه المشكلات بفعالية. لذلك ، يمكن استخدامه كأداة ومكون من المكون الإضافي المستقل.
نظرًا لأن Binary Ninja لا يمكن الوصول إليه للجميع وقد يكون هناك طلب للاستفادة من تقييمات الأمان وربما يتقدم في السحابة ، يتم دعم الواجهة الخلفية لـ ANGR. أتوقع دمج أبرز الفكات الأخرى على الطريق أيضًا (الأولوية: Ghidra).
إذا كان لديك تجاري نينجا الثنائي ، فتأكد من تثبيت واجهة برمجة التطبيقات للاستخدام المستقل بدون مقطوعة الرأس:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
تثبيت مع pip :
$ pip install fuzzable
نحن نستخدم الشعر لإدارة التبعية وبناء. للقيام ببناء يدوي ، استنساخ المستودع مع وحدات الطرف الثالث:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
للتثبيت يدويًا:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
يمكنك الآن تحليل الثنائيات و/أو الكود المصدر مع الأداة!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
يمكن تثبيت Fuzzable بسهولة من خلال سوق المكون الإضافي Binary Ninja من خلال الانتقال إلى Binary Ninja > Manage Plugins والبحث عنها. فيما يلي مثال على تشغيل المكون الإضافي القابل للضخمة ، ودقة تحديد الأهداف لتقييم الضعف ومزيد من التقييم:

يأتي Fuzzable مع خيارات مختلفة للمساعدة في ضبط تحليلك بشكل أفضل. سيتم دعم المزيد في الخطط المستقبلية وأي طلبات ميزة يتم تقديمها.
لتحديد القابلية للضخمة ، يستخدم Fuzzable العديد من الاستدلال لتحديد الأهداف الأكثر قابلية للتطبيق على الهدف للتحليل الديناميكي. يتم تخصيص جميع هذه الاستدلال بشكل مختلف باستخدام مكتبة Scikit-Criteria ، والتي تستخدم تحليل القرار متعدد المعايير لتحديد أفضل المرشحين. يمكن رؤية هذه المقاييس وهل هناك أوزان هنا:
| إرشادي | وصف | وزن |
|---|---|---|
| اسم ودود الزغب | اسم الرمز يعني السلوك الذي يستوعب ملف/إدخال المخزن المؤقت | 0.3 |
| أحواض محفوفة بالمخاطر | الحجج التي تتدفق إلى مكالمات محفوفة بالمخاطر (أي memcpy) | 0.3 |
| حلقات طبيعية | عدد الحلقات المكتشفة مع حدود الهيمنة | 0.05 |
| التعقيد السيكلومي | تعقيد الهدف من الوظيفة على أساس الحواف + العقد | 0.05 |
| عمق التغطية | عدد العجول الذي يعبر الهدف إلى | 0.3 |
كما ذكرنا ، تحقق من منشور المدونة الفنية لإلقاء نظرة أكثر تعمقا في السبب وكيف يتم استخدام هذه المقاييس.
كانت العديد من المقاييس مستوحاة إلى حد كبير من عمل Vincenzo Iozzo الأصلي في المعرفة 0.
كل الأهداف التي تريد تحليلها متنوعة ، ولن تتمكن fuzzable من حساب كل سلوك حالة الحافة في هدف البرنامج. وبالتالي ، قد يكون من المهم أثناء التحليل ضبط هذه الأوزان بشكل مناسب لمعرفة ما إذا كانت النتائج المختلفة أكثر منطقية لحالة الاستخدام الخاصة بك. لضبط هذه الأوزان في CLI ، ما عليك سوى تحديد --score-weights :
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
بشكل افتراضي ، سوف يقوم fuzzable بتصفية أهداف الوظائف بناءً على المعايير التالية:
static ولا تتعرض من خلال الرؤوس. للاطلاع على المكالمات التي تم تصفيةها بواسطة fuzzable ، قم بتعيين العلم --list_ignored :
$ fuzzable analyze --list-ignored <TARGET>
في النينجا الثنائية ، يمكنك قلب هذا الإعداد في Settings > Fuzzable > List Ignored Calls .
في حالة أن قابلية الضبابية تقوم بتصفية المكالمات المهمة التي يجب تحليلها ، يوصى باستخدام --include-* وسيطات لتضمينها أثناء التشغيل:
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
في النينجا الثنائية ، يتم دعم هذا من خلال Settings > Fuzzable > Include non-top level calls Symbols to Exclude .
الآن بعد أن وجدت المرشحين المثاليين الخاص بك على fuzz ، سيساعدك fuzzable أيضًا على توليد تسخير مضغوط جاهزة (تقريبًا) للأداة وتجميعها للاستخدام مع Fuzzer المستند إلى الملف (أي AFL ++ ، Honggfuzz) أو Fuzzer (libfuzzer). للقيام بذلك في CLI:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
إذا كان هذا الهدف عبارة عن قاعدة كود مصدر ، فسيتم استخدام قالب المصدر العام.
إذا كان الهدف عبارة عن ثنائي ، فسيتم استخدام قالب صندوق الأسود العام ، والذي يمكن استخدامه بشكل مثالي مع وضع مضاهاة الغموض مثل AFL-QEMU. سيتم أيضًا إنشاء نسخة من الثنائي ككائن مشترك إذا لم يتم تصدير الرمز مباشرة ليكون dlopen ed باستخدام lief.
في الوقت الحالي ، تعتبر هذه الميزة بدائية للغاية ، حيث إنها ببساطة ستنشئ تسخيرًا مستقلًا C ++ مع المعلمات المناسبة ، ولن لن يتم ذلك رمزًا تلقائيًا مطلوبًا لأي سلوكيات وقت التشغيل (أي هياكل مثيرة للتنفيذ). ومع ذلك ، يجب أن تحصل القوالب التي تم إنشاؤها لـ Fuzzable على تشغيلك بسرعة. فيما يلي بعض الميزات الطموحة التي أود تنفيذها على الطريق:
يدعم fuzzable توليد تقارير بتنسيقات مختلفة. تلك الحالية المدعومة هي JSON و CSV و Markdown. قد يكون هذا مفيدًا إذا كنت تستخدم هذا كجزء من الأتمتة حيث ترغب في تناول الإخراج بتنسيق قابل للتسلسل.
في CLI ، ما عليك سوى تمرير الوسيطة --export باسم ملف مع الامتداد المناسب:
$ fuzzable analyze --export=report.json <TARGET>
في النينجا الثنائية ، انتقل إلى Plugins > Fuzzable > Export Fuzzability Report > ... وحدد التنسيق الذي تريد تصديره والمسار الذي تريد كتابته إليه.
سيتم تطوير هذه الأداة بشكل مستمر ، وأي مساعدة من المانترين الخارجيين موضع تقدير!
قابلة للترخيص مرخصة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.