
اختبار Fuzzing لاستدعاءات النظام على OpenBSD amd64 باستخدام TriforceAFL (أي AFL و QEMU)
هذه مجموعة ملفات تُستخدم لإجراء اختبار Fuzzing لاستدعاءات النظام على OpenBSD amd64 باستخدام TriforceAFL (أي AFL و QEMU). لاستخدامها ستحتاج إلى TriforceAFL (https://github.com/nccgroup/TriforceAFL)، وتوزيعة FlashRD 2.0 (http://www.nmedia.net/flashrd/)، وجهاز OpenBSD لبناء برنامج التشغيل وصورة القرص، وجهاز Linux كمضيف لتشغيل أداة الاختبار (قد تعمل مضيفات أخرى أيضًا، لكننا شغّلنا TriforceAFL من مضيف Linux فقط، وتحديدًا Debian/Ubuntu).
سنقوم بكل شيء بصلاحية root على جهاز OpenBSD، لأن هذا الجهاز يُستخدم فقط لتجهيز بيئتنا. إذا كان لديك جهاز OpenBSD حالي، فلا بأس من تنفيذ قدر أقل من ذلك بصلاحية root. إذا كنت مستخدمًا متمرسًا في OpenBSD، فكثير من هذه الخطوات سيكون مطولًا بشكل مفرط. على أي حال، لنتابع!
على جهاز OpenBSD:
export PKG_PATH=http://mirrors.sonic.net/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/
pkg_add git
pkg_add python # pick python 2.7
بعد ذلك ستحتاج إلى تنزيل مصادر OpenBSD ومصادر النواة، ثم فك ضغطها:
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/src.tar.gz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/sys.tar.gz
cd /usr/src; tar -xzpf $HOME/src.tar.gz; tar -xzpf $HOME/sys.tar.gz;
إذا كان لديك قرص التثبيت بالفعل، فلست بحاجة إلى تنزيل الملفات التالية (ستكون موجودة في $CDMOUNT/5.9/amd64/*.tgz). ستحتاج فقط إلى ضبط $DISTDIR بشكل مناسب. وإلا...
cd ~
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/base59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/man59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/comp59.tgz
ftp http://mirrors.sonic.net/pub/OpenBSD/5.9/amd64/game59.tgz
export DISTDIR=~
أصبحت لدينا الآن التبعيات الضرورية مثبتة، ويمكننا البدء في بناء الأشياء.
ادخل إلى دليل TriforceOpenBSDFuzzer. توجد أدلة منفصلة تحتوي على ملفات OpenBSD (targ) وملفات مضيف أداة الاختبار (fuzzHost).
على مضيف OpenBSD، ادخل إلى دليل targ وشغّل make. يجب أيضًا بناء ملفات الإدخال من هذا الدليل
mkdir inputs
./gen.py # build simple tests
./genTempl.py templ.txt # build most syscall tests
./gen2.py # build complex syscall tests
tar -czf ../inputs.tgz inputs
بعد ذلك ستحتاج إلى بناء صورة قرص تحتوي على برنامج التشغيل، باستخدام توزيعة FlashRD (http://www.nmedia.net/flashrd/). على مضيف OpenBSD (مع وجود المصادر في /usr/src ومصادر النواة في /usr/src/sys من القسم السابق)، سنقوم الآن بعدة أمور:
cd ~ #make sure this is on your /home parition, you will need significant disk space for this
ftp http://www.nmedia.net/flashrd/flashrd-2.0.tar.gz
tar xzf flashrd-2.0.tar.gz
cd flashrd-2.0
patch -p1 < $FUZZER/image-diff.txt #set $FUZZER to where you cloned TriforceOpenBSDFuzzer
mkdir obsd
cd obsd
tar xzpf $DISTDIR/base59.tgz
tar xzpf $DISTDIR/man59.tgz
tar xzpf $DISTDIR/comp59.tgz
tar xzpf $DISTDIR/game59.tgz
tar xzpf /var/sysmerge/etc.tgz
cp $FUZZER/image-etc-rc etc/rc
cp $FUZZER/targ/inputs/ex1 root/ex1
cd ..
يمكنك الآن إنشاء صورة بتشغيل هذه الأوامر:
cp $FUZZER/targ/driver obsd/bin/driver
./flashrd obsd
mv flashimg* $FUZZER/flashimg.bin
mv bsd.gdb $FUZZER/bsd.gdb
احتفظ بنسخة من flashimg.bin و bsd.gdb. ستحتاج إليهما على مضيف أداة الاختبار.
قد ترغب في إنشاء صورة ثانية لأغراض التصحيح تتيح لك تشغيل قشرة تفاعلية. عدّل obsd/etc/rc واستبدل /bin/driver -v بـ /bin/sh -i وأنشئ صورة ثانية. ثم سنحفظ نسخة من flashimg-sh.bin و bsd-sh.gdb لاستخدامها لاحقًا.
./flashrd obsd
mv flashimg* $FUZZER/flashimg-sh.bin
mv bsd.gdb $FUZZER/bsd-sh.gdb
يمكننا الآن مغادرة جهاز OpenBSD والعودة إلى مضيف الاختبار (تأكد من نسخ $FUZZER إلى الخارج، حتى نتمكن من استخدامه على مضيف الاختبار).
نقوم بتشغيل أداة الاختبار على مضيف Linux (يجب أن تعمل على أي مضيف يُبنى ويعمل عليه TriforceAFL، لكن النتائج قد تختلف، خاصة على مضيف غير Linux). على مضيف الاختبار، ثبّت TriforceAFL في ../TriforceAFL. انسخ flashimg*.bin وbsd*.gdb إلى دليل fuzzhost، وفك ضغط المدخلات في دليل fuzzHost:
cd TriforceOpenBSDFuzzer # this should now have the files we made on the BSD host in it
cp flashimg* fuzzHost/
cp bsd* fuzzHost/
cd fuzzhost
tar xzf ../inputs.tgz
نحن الآن جاهزون للاختبار! ادخل إلى دليل fuzzHost وابدأ أداة الاختبار بالأمر ./runFuzz -M M0.
لاحظ أن سكربت runFuzz يتطلب اسم master أو slave، لأنه يعمل دائمًا في وضع master/slave. راجع سكربت runFuzz لمزيد من معلومات الاستخدام.
لإعادة إنتاج حالات الاختبار (مثل حالات الانهيار)، شغّل على مضيف الاختبار:
./runTest inputs/ex1
./runTest outputs/crashes/id*
يمكنك أيضًا تشغيل برنامج التشغيل خارج البيئة المُحاكاة باستخدام الخيار -t، مع تسجيل مفصّل باستخدام -vv، ودون تنفيذ استدعاءات النظام فعليًا باستخدام -x. على سبيل المثال، على مضيف OpenBSD شغّل:
./driver -tvvx < inputs/ex1
ktrace ./driver -t < inputs/ex1
من المفيد أحيانًا أن تتمكن من إقلاع النواة وتشغيل الاختبارات بشكل تفاعلي. يمكنك تشغيل ./runSh للإقلاع إلى قشرة تفاعلية.
ستحتاج غالبًا إلى إضافة ملفات إضافية (مثل حالات الاختبار) إلى ملف flashimg-sh.bin للاختبار. للقيام بذلك، انسخ الملفات الإضافية إلى flashrd-2.0/obsd/root على مضيف OpenBSD وأعد بناء صورة flash. انقل الملفات مرة أخرى إلى مضيف الاختبار ونفّذ runSh مرة أخرى. ستجد الملفات الإضافية في دليل /root. يمكنك أيضًا إضافة ملفات إلى صورة flash بعد إنشائها، بصلاحية root على مضيف OpenBSD:
vnconfig vnd0 ./flashimg.bin
mount /dev/vnd0a /mnt
cp file /mnt
umount /mnt
vnconfig -u vnd0
ستظهر الملفات المضافة هنا في /flash عند إقلاع الصورة
التصحيحات التي طُبقت سابقًا على توزيعة flashrd ستمكّن التصحيح وتعطّل تحسين الأداء عند بناء النواة. وهذا يجعل التصحيح أسهل بكثير.
لتصحيح النواة من مضيف fuzzHost، انسخ /usr/src/sys من مضيف OpenBSD، وانسخ bsd-sh.gdb إلى sys/x/x/x/x. في نافذة واحدة شغّل ./runSh وبعد إقلاع النظام شغّل:
cd sys
mkdir -p x/x/x/x
cd x/x/x/x
cp $FUZZER/bsd-sh.gdb .
gdb -ex "target remote :1234" ./bsd-sh.gdb