
EF/CF - اختبار عشوائي فائق السرعة للعقود الذكية
EF/CF هو نهج جديد للاختبار العشوائي (fuzzing) للعقود الذكية: بدلاً من استخدام أداة اختبار عشوائي جديدة مبنية خصيصًا، يعيد توظيف البنية التحتية الحالية للاختبار العشوائي الخاصة بأكواد C/C++ لتخدم العقود الذكية. حاليًا، AFL++ هي أداة الاختبار العشوائي المدعومة بشكل أساسي، مع وجود دعم بدائي جدًا لكل من libfuzzer وhonggfuzz أيضًا.
لماذا نستخدم البنية التحتية الحالية للاختبار العشوائي؟
ما هي بعض المشكلات التي نواجهها أثناء ذلك؟
./src/ethmutator/./src/evm2cpp/يُعد هذا المستودع نقطة الدخول الأساسية لمشروع EF/CF. يحتوي على جميع
الأكواد ذات الصلة كمشاريع فرعية في ./src/ وعلى عدة نصوص برمجية ملائمة
للتثبيت، ونصوص لإطلاق حملات الاختبار العشوائي، ومجموعات بيانات متنوعة
لاختبار أداة الاختبار العشوائي (والمقارنة مع الأدوات الأخرى).
./src/ - يحتوي على كل المصادر اللازمة لبناء وتشغيل EF/CF؛ ومن أجل
قابلية إعادة الإنتاج، تُضاف جميع التبعيات المباشرة كوحدات فرعية تابعة لـ git../data/ - يحتوي على مجموعات البيانات المستخدمة أثناء التقييم./scripts - يحتوي على نصوص لتشغيل التجارب والتثبيت، إلخ../docker - ملف Dockerfile لسير عمل قائم على الحاويات
./docker/tools/ يحتوي على ملفات Dockerfiles للأدوات التي قارنّا EF/CF
معها. حاولنا جاهدين تثبيت الإصدارات التي قيّمناها في ورقتنا البحثية
داخل ملفات Dockerfiles../EXPERIMENTS.md - يحتوي على دليل
لإعادة إنتاج التجارب من ورقتنا البحثية../examples - يحتوي على مخرجات أمثلة مولّدة بواسطة EF/CFنصف في ورقتنا البحثية بنية EF/CF وتنفيذها ونلخص نتائج تقييمنا: النسخة الأولية على arxiv.org
عند الإشارة إلى EF/CF في الأعمال الأكاديمية، يرجى استخدام إدخال BibTeX التالي للاستشهاد:```bibtex @InProceedings{efcf2023, author = "Michael Rodler and David Paaßen and Wenting Li and Lukas Bernhard and Thorsten Holz and Ghassan Karame and Lucas Davi", title = "EF/CF: High Performance Smart Contract Fuzzing for Exploit Generation", booktitle = "{IEEE} European Symposium on Security and Privacy ({EuroS&P})", publisher = "{IEEE}", year = "2023", }
## البدء السريع
الطريقة الموصى بها هي تشغيل EF/CF كحاوية docker تفاعلية.
1. ادخل إلى الحاوية باستخدام shell ```
docker run --rm -it ghcr.io/uni-due-syssec/efcf-framework
أو قم ببناء الحاوية من المستودع المُستنسَخ ``` make gitmodules # to fetch the git submodules make container-enter
1. قم بتجميع ثم بعمل fuzz على عقد Solidity حتى يتم
اكتشاف أول انهيار/خطأ: ```
efcfuzz --until-crash --out ./baby_bank_results/ --source ./data/examples/baby_bank.sol
ليس لديك Git؟ إذا كنت تستخدم إصدار tarball/docker، فتجاهل هذا.
شغّل git submodule update --init لجلب آخر التزامات الوحدات الفرعية على المستودعات المستنسخة بالفعل.
تأكد من تشغيل هذا أيضًا في ./src/eEVM.```
git submodule update --init; cd src/eEVM/; git submodule update --init; cd ../../
*تحذير:* تنفيذ `git clone --recursive $repo` أو تمرير وسيط `--recursive` إلى `git sumbodule (update|init)` سيجعل git يدخل بشكل تكراري إلى الوحدات الفرعية لمستودع AFL++، وهي غير مطلوبة لهذا المشروع. لذا، لتوفير بعض المساحة، من الأفضل تجنب عمليات السحب التكراري للوحدات الفرعية.
### الحاوية
نوفّر أهداف make الملائمة التالية لسير العمل القائم على الحاويات:```sh
make container-build # build default efcf container
make container-enter # enter default efcf container in current working dir
إذا كنت تريد ضمان بناء نظيف، يمكنك استخدام الأمر التالي```sh make container-build CLEAN_CHECKOUT=1
بدلاً من ذلك، يمكن بناء الحاوية باستخدام أمر docker التالي:```sh
docker build \
-f docker/ubuntu.Dockerfile \
-t efcf:latest \
.
لاحظ أنه يوجد أيضًا Dockerfile مبني على Archlinux و Fedora. يجب أن تعمل أيضًا، لكنها ليست مختبرة جيدًا.
لتوزيع صورة docker يدويًا (على سبيل المثال، إذا كنت تتضمن بعض التغييرات المحلية)، استخدم:``` make container-release docker load -i ./efcf*.tar
نوصي بخيارات docker التالية للتشغيل:
* `--security-opt seccomp=unconfined` - أداء أفضل لـ fuzzing
* `--net=host` - للوصول السهل إلى عقدة ethereum محلية
* `--tmpfs "/tmp/efcf/":exec,size=6g` - ضع الملفات المؤقتة لـ EF/CF على ramdisk إن أمكن (تآكل أقل للقرص)
* `--privileged` - لتشغيل `afl-system-config` أو `efcfuzz --configure-system`
* `-v` - لحفظ بيانات مخرجات EF/CF بشكل دائم
### VM / العتاد المادي
لسير العمل القائم على VM أو العتاد المادي:```sh
make system-install # install efcf to current system (requires root or sudo rights)
لاحظ أن الكثير من السكربتات تعمل على تخطيط الدليل النسبي على أي حال، لذا
فإن هذا الأمر يثبّت في الغالب التبعيات وبعض الأدوات التي من المفيد أن تكون في
PATH الخاص بك. لقد اختبرنا تشغيل EF/CF على توزيعات لينكس التالية:
(لا يهم التوزيعة كثيرًا، لقد اختبرنا LLVM 13 و14 مع كون 14 هو
الخيار المفضل. قد لا يزال LLVM 11 أو 12 يعمل أيضًا، ولكن كما هو الحال دائمًا - كلما كان أحدث
كان أفضل. الجزء المهم هو وجود LLVM متوافق مع fork الخاص بنا من AFL++.)
لم نختبر EF/CF على Mac OS بشكل أصلي. من المحتمل أن الأمور لن تعمل (على سبيل المثال، يبدو أن afl-clang-lto على Mac OS لا يعمل). الخيار الأفضل هو استخدام docker.```sh
make gitmodules
docker pull ubuntu:jammy --platform linux/amd64
docker build -t efcf:latest -f docker/ubuntu.Dockerfile --platform linux/amd64 .
docker run --tmpfs "/tmp/efcf/":exec,size=8g --platform linux/amd64 --rm -it -v $(pwd):$(pwd) -w $(pwd) efcf:latest
اختبرنا باستخدام Docker Desktop v4.21.1 ويعمل الاستخدام الأساسي لـ EF/CF بشكل صحيح. ومع ذلك، ضع في اعتبارك ما يلي:
* إذا رأيت أخطاء segfault أثناء البناء: حاول زيادة حد الذاكرة للجهاز الافتراضي الذي يستخدمه docker على Mac OS.
* حاول تمكين التسريع باستخدام rosetta داخل docker - نأمل أن يكون هذا أسرع قليلاً.
### الإعداد للتطوير
الأدوات بشكل عام لا تحتاج إلى تثبيت. قم بتثبيت التبعيات المطلوبة
كما هو موضح في سكربت `system-install.sh` أو كما في ملفات Dockerfiles.
للتيسير، لدينا بعض السكربتات لتحديث `PATH` الخاص بك:```sh
# POSIX-like shells (i.e., bash, ...)
source ./scripts/env.sh
# for the fish shell
source ./scripts/env.fish