
مدعّم بتوجيه التغطية لمتغيرات NVRAM في UEFI باستخدام محاكاة Qiling و AFL++ لاكتشاف ثغرات البرامج الثابتة من خلال التغيير الآلي للمدخلات واكتشاف الأعطال.
أداة بسيطة للفحص الموجّه بتغطية لمتغيرات NVRAM في UEFI.
مبني على Qiling و AFL++.
كتب بواسطة Itai Liba (@liba2k) و Assaf Carlsbad (@assaf_carlsbad).
بناء الصورة:
docker build -t efi_fuzz .
اختبار البيئة:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
استخدام البيئة:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
تحضير بيئة NVRAM المحاكاة (سيكون عليك توفير صورة الروم):
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
تحضير المجموعة الأولية لمتغيرات NVRAM:
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
إجراء تشغيل جاف للفاحص:
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
إذا نجح الأمر، انتقل إلى الفحص الكامل:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
إذا كنت تعمل على Windows، قم بتثبيت WSL. نوصي باستخدام WSL2 بدلاً من WSL الأصلي، لأنه قد يكون بطيئاً أحياناً. يمكن العثور على تعليمات التثبيت الكاملة لنظام Windows 10 هنا: https://docs.microsoft.com/en-us/windows/wsl/install-win10
داخل توزيعة WSL، قم بتثبيت بعض الحزم الضرورية التي ستسمح لنا بتجميع كود المصدر بلغة C:
sudo apt install build-essential automake
قم بتثبيت AFL++ مع دعم وضع Unicorn.
3.1. استنساخ المستودع:
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. بناء ملفات AFL++ الأساسية:
make
3.3. بناء ميزة دعم Unicorn:
cd unicorn_mode
./build_unicorn_support.sh
3.4. تثبيت كل شيء:
make install
احصل على البرامج الثابتة UEFI التي ترغب في فحصها وقم بفك ضغطها. للحصول على التفاصيل الفنية الكاملة حول كيفية القيام بذلك عملياً، انظر هنا أو هنا.
استنساخ الفاحص وتثبيت التبعيات المطلوبة:
git clone https://github.com/Sentinel-One/efi_fuzz
pip install -r efi_fuzz/requirements.txt
Triton مطلوب لنشر التلوث.
يمكن العثور على تعليمات تثبيت Triton هنا:
https://triton.quarkslab.com/documentation/doxygen/#install_sec
تحضير بيئة NVRAM المحاكاة:
python scripts/prepare_nvram.py rom.bin nvram.pickle
تحضير المجموعة الأولية لمتغيرات NVRAM:
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
إجراء تشغيل جاف للفاحص:
python efi_fuzz.py <target> <nvram> <varname> <seed>
إذا نجح الأمر، انتقل إلى الفحص الكامل:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end: تحديد عنوان نهاية للمحاكاة.-t, --timeout: تحديد قيمة مهلة جديدة للمحاكاة، بالمللي ثانية.-o, --output: تحديد تنسيق الإخراج لأغراض التصحيح. القيم الصالحة هي: trace، disasm، debug و off (القيمة الافتراضية هي off).-n, --no-sanitize: تعطيل منظف الذاكرة (القيمة الافتراضية هي False).-u, --track-uninitialized: تتبع الذاكرة غير المهيأة عبر Triton ونشر التلوث (تجريبي!).-x, --extra-modules: قائمة بالوحدات الإضافية لتحميلها لتلبية تبعيات الهدف.يمكن العثور على مزيد من المعلومات حول البرامج الثابتة UEFI بشكل عام و efi_fuzz بشكل خاص هنا: