
DR.CHECKER : أداة كشف ثغرات أمنية Soundy لبرامج تشغيل نواة لينكس

يحتوي هذا المستودع على جميع المصادر، بما في ذلك نصوص الإعداد. الآن مع واجهة مستخدم رائعة لعرض التحذيرات مع ملفات المصدر المقابلة.
Ubuntu >= 14.04.5 LTS
16 فبراير 2018:
راجع وثيقة استخدام دوكر للحصول على تفاصيل حول كيفية استخدام DR.CHECKER في حاوية دوكر مبنية مسبقًا.
يعتمد تنفيذنا على LLVM، وتحديداً LLVM 3.8. نحتاج أيضًا إلى أدوات مثل c2xml لتحليل ملفات الرأس.
أولاً، تأكد من أن لديك cmake (المستخدم في نصوص الإعداد/البناء) و libxml (المطلوب لـ c2xml):
sudo apt-get install cmake libxml2-dev
بعد ذلك، قمنا بإنشاء نص برمجي واحد يقوم بتنزيل وبناء جميع الأدوات المطلوبة.
cd helper_scripts
python setup_drchecker.py --help
usage: setup_drchecker.py [-h] [-b TARGET_BRANCH] [-o OUTPUT_FOLDER]
optional arguments:
-h, --help show this help message and exit
-b TARGET_BRANCH Branch (i.e. version) of the LLVM to setup. Default:
release_38 e.g., release_38
-o OUTPUT_FOLDER Folder where everything needs to be setup.
مثال:
python setup_drchecker.py -o drchecker_deps
لإكمال الإعداد، تحتاج أيضًا إلى تعديلات في متغير البيئة PATH المحلي. سيعطيك نص الإعداد التغييرات الدقيقة التي تحتاج إلى القيام بها.
يعتمد هذا على إكمال الإعداد بنجاح. لدينا نص برمجي واحد يبني كل شيء، مرحبًا بك.
cd llvm_analysis
./build.sh
يعتمد هذا على إكمال البناء بنجاح. لتشغيل DR.CHECKER على سائقي النواة، نحتاج أولاً إلى تحويلهم إلى كود بت LLVM.
أولاً، نحتاج إلى نواة قابلة للبناء. وهذا يعني أنه يجب أن تكون قادرًا على تجميع النواة باستخدام إعداد البناء العادي، أي make.
نقوم أولاً بالتقاط مخرجات أمر make، ومن هذه المخرجات نستخرج أمر التجميع الدقيق.
make (أو makeout.txt)ما عليك سوى تمرير V=1 وإعادة توجيه المخرجات إلى الملف.
مثال:
make V=1 O=out ARCH=arm64 > makeout.txt 2>&1
ملاحظة: لا تستخدم معالجات متعددة أي -j. تشغيل وضع المعالجة المتعددة سيعبث بملف المخرجات لأن عمليات متعددة تحاول الكتابة إلى ملف المخرجات.
هذا كل شيء. سيتولى DR.CHECKER الباقي من هنا.
هناك عدة خطوات لتشغيل تحليل DR.CHECKER، كل هذه الخطوات مغلفة في نص برمجي واحد helper_scripts/runner_scripts/run_all.py
كيفية التشغيل:
python run_all.py --help
usage: run_all.py [-h] [-l LLVM_BC_OUT] [-a CHIPSET_NUM] [-m MAKEOUT] [-g COMPILER_NAME] [-n ARCH_NUM] [-o OUT] [-k KERNEL_SRC_DIR] [-skb] [-skl] [-skp] [-ske] [-ski] [-f SOUNDY_ANALYSIS_OUT]
optional arguments:
-h, --help show this help message and exit
-l LLVM_BC_OUT Destination directory where all the generated bitcode files should be stored.
-a CHIPSET_NUM Chipset number. Valid chipset numbers are:
1(mediatek)|2(qualcomm)|3(huawei)|4(samsung)
-m MAKEOUT Path to the makeout.txt file.
-g COMPILER_NAME Name of the compiler used in the makeout.txt, This is
needed to filter out compilation commands. Ex: aarch64-linux-android-gcc
-n ARCH_NUM Destination architecture, 32 bit (1) or 64 bit (2).
-o OUT Path to the out folder. This is the folder, which
could be used as output directory during compiling
some kernels. (Note: Not all kernels needs a separate out folder)
-k KERNEL_SRC_DIR Base directory of the kernel sources.
-skb Skip LLVM Build (default: not skipped).
-skl Skip Dr Linker (default: not skipped).
-skp Skip Parsing Headers (default: not skipped).
-ske Skip Entry point identification (default: not
skipped).
-ski Skip Soundy Analysis (default: not skipped).
-f SOUNDY_ANALYSIS_OUT Path to the output folder where the soundy analysis output should be stored.
يقوم النص البرمجي ببناء وربط وتشغيل DR.CHECKER على جميع السائقين، وبالتالي قد يستغرق وقتًا كبيرًا (45-90 دقيقة). إذا كنت تريد تشغيل DR.CHECKER يدويًا على سائقين فرديين، راجع تشغيل مستقل
يقوم النص البرمجي أعلاه بالمهام التالية في وضع متعدد المعالجات للاستفادة من جميع أنوية وحدة المعالجة المركزية:
سيتم وضع جميع ملفات البت كود المنشأة في المجلد المقدم للوسيطة -l.
تستغرق هذه الخطوة وقتًا كبيرًا، اعتمادًا على عدد الأنوية لديك.
لذا، إذا كنت قد أجريت هذه الخطوة بالفعل، يمكنك تخطيها بتمرير -skb.
يقوم هذا بربط جميع ملفات البت كود وتحديد ملفات البت كود ذات الصلة التي تحتاج إلى ربط وربطها (باستخدام llvm-link) في ملف بت كود موحد (سيتم تخزينه بجانب ملف البت كود المقابل).
على غرار الخطوة أعلاه، يمكنك تخطي هذه الخطوة بتمرير -skl.
تبحث هذه الخطوة عن إعلانات نقاط الدخول في ملفات الرأس وتخزن تكوينها في الملف: hdr_file_config.txt تحت دليل بناء LLVM.
لتخطي: -skp
تحدد هذه الخطوة جميع نقاط الدخول عبر جميع ملفات البت كود الموحدة للسائق.
سيتم تخزين المخرجات في الملف: entry_point_out.txt تحت دليل بناء LLVM.
مثال على محتويات الملف entry_point_out.txt:
FileRead:hidraw_read:/home/drchecker/33.2.A.3.123/llvm_bc_out/drivers/hid/llvm_link_final/final_to_check.bc
FileWrite:hidraw_write:/home/drchecker/33.2.A.3.123/llvm_bc_out/drivers/hid/llvm_link_final/final_to_check.bc
IOCTL:hidraw_ioctl:/home/drchecker/33.2.A.3.123/llvm_bc_out/drivers/hid/llvm_link_final/final_to_check.bc
لتخطي: -ske
ستقوم هذه الخطوة بتشغيل DR.CHECKER على جميع نقاط الدخول في الملف entry_point_out.txt. سيتم تخزين المخرجات لكل نقطة دخول في المجلد المقدم للخيار -f.
لتخطي: -ski
الآن، سنعرض مثالاً من النقطة التي لديك فيها مصادر النواة إلى النقطة التي تحصل فيها على تحذيرات الثغرات الأمنية.
لقد قمنا برفع نواة mediatek 33.2.A.3.123.tar.bz2. أولاً قم بتنزيل واستخراج الملف أعلاه.
لنفترض أنك استخرجت الملف أعلاه في مجلد يسمى: ~/mediatek_kernel
cd ~/mediatek_kernel
source ./env.sh
cd kernel-3.18
# the following step may not be needed depending on the kernel
mkdir out
make O=out ARCH=arm64 tubads_defconfig
# this following command copies all the compilation commands to makeout.txt
make V=1 -j8 O=out ARCH=arm64 > makeout.txt 2>&1
cd <repo_path>/helper_scripts/runner_scripts
python run_all.py -l ~/mediatek_kernel/llvm_bitcode_out -a 1 -m ~/mediatek_kernel/kernel-3.18/makeout.txt -g aarch64-linux-android-gcc -n 2 -o ~/mediatek_kernel/kernel-3.18/out -k ~/mediatek_kernel/kernel-3.18 -f ~/mediatek_kernel/dr_checker_out
يستغرق الأمر أعلاه بعض الوقت (30 دقيقة - 1 ساعة).
أولاً، ستكون جميع نتائج التحليل في المجلد: ~/mediatek_kernel/dr_checker_out (الوسيطة المعطاة للخيار -f)، لكل نقطة دخول سيتم إنشاء ملف .json يحتوي على جميع التحذيرات بتنسيق JSON. تحتوي ملفات json هذه على تحذيرات منظمة حسب السياقات.
ثانيًا، يحتوي المجلد ~/mediatek_kernel/dr_checker_out/instr_warnings (بالنسبة للوسيطة المعطاة للخيار -f) على تحذيرات منظمة حسب موقع التعليمات.
يمكن تحليل هذه التحذيرات باستخدام المصور.
أخيرًا، سيتم كتابة ملخص لجميع التحذيرات لكل نقطة دخول منظمة حسب النوع إلى ملف CSV المخرجات: ~/mediatek_kernel/dr_checker_out/warnings_stats.csv (بالنسبة للوسيطة المعطاة للخيار -f).
-gلتقديم قيمة للخيار -g، تحتاج إلى معرفة اسم الثنائي *-gcc المستخدم لتجميع النواة.
طريقة سهلة لمعرفة ذلك هي البحث عن gcc باستخدام grep في makeout.txt وسترى أوامر المترجم التي يمكنك من خلالها معرفة اسم الثنائي *-gcc.
في مثالنا أعلاه، إذا قمت بتنفيذ grep gcc makeout.txt للبناء المثال، سترى الكثير من الأسطر مثل ما يلي:
aarch64-linux-android-gcc -Wp,-MD,fs/jbd2/.transaction.o.d -nostdinc -isystem ...
لذا، يجب أن تكون قيمة -g هي aarch64-linux-android-gcc.
إذا كانت النواة المراد بناؤها 32 بت، فمن المرجح أن يكون الثنائي arm-eabi-gcc
-aاعتمادًا على نوع مجموعة الشرائح، تحتاج إلى تقديم الرقم المقابل.
-oهذا هو مسار المجلد المقدم للخيار O= لأمر make أثناء بناء النواة.
ليست كل النوى تحتاج إلى مسار مخرجات منفصل. يمكنك بناء النواة بعدم تقديم الخيار O، وفي هذه الحالة يجب عليك عدم تقديم قيمة لذلك الخيار عند تشغيل run_all.py.
نقدم واجهة مستخدم قائمة على الويب لعرض جميع التحذيرات. يرجى الرجوع إلى التصور.
يمكنك تعطيل واحد أو أكثر من كاشفات الثغرات الأمنية عن طريق إلغاء تعليق الأسطر #define DISABLE_* المقابلة في BugDetectorDriver.cpp
حسب رغبتك، نقدم أيضًا نصًا برمجيًا لمعالجة النتائج لاحقًا. تفقدها.
استمتع!!