
أمثلة تعليمية لنقل ثغرات نواة لينكس إلى Rust، تتضمن كودًا مُعرَّضًا للثغرات عمدًا واستغلالات (exploits) لتعلّم أمن النواة وسلامة لغة Rust.
مستودع الشيفرة المصدرية هذا عبارة عن مجموعة أمثلة مرافقة لمنشور المدونة على https://research.nccgroup.com/?p=18577.
لا تستخدم هذه الأمثلة لأي غرض سوى متابعة منشور المدونة. فهي تحتوي عمدًا على ثغرات أمنية، وحتى النسخ «المصححة» قد تحتوي على أخطاء برمجية.
إذا كنت ترغب في تشغيل الأمثلة الواردة في منشور المدونة، فمن المؤمل أن تسهّل عليك الإرشادات التالية ذلك.
احصل على الشيفرة المصدرية لـ Rust for Linux. قد تحتاج إلى تثبيت بعض التبعيات المذكورة في [https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst](صفحة البدء السريع) .
git clone https://github.com/Rust-for-Linux/linux rust-for-linux
cd rust-for-linux
git checkout bd123471269354fdd504b65b1f1fe5167cb555fc # latest commit at the point of writing
احصل على virtme. قد تحتاج أيضًا إلى تثبيت QEMU وبعض التبعيات الأخرى.
git clone https://github.com/amluto/virtme
أجد أن virtme مفيد جدًا لاختبار أي تغيير بسرعة، سواء في نواة النظام نفسها أو في وحدة نواة.
ابنِ النواة الأساسية التي ستعمل عليها معظم الأمثلة:
cd rust-for-linux
mkdir `pwd`.out
cp ../rustproofing-linux/configs/config-base `pwd`.out/.config
KBUILD_OUTPUT=`pwd`.out make -j$(nproc) LLVM=1
وكذلك نُسخ مختلفة باختلاف طفيف في خيارات التكوين:
mkdir `pwd`.out.ovf
cp `pwd`.out/.config `pwd`.out.ovf
scripts/config --file `pwd`.out.ovf/.config -d CONFIG_RUST_OVERFLOW_CHECKS
KBUILD_OUTPUT=`pwd`.out.ovf make -j$(nproc) LLVM=1
mkdir `pwd`.out.stackinit
cp `pwd`.out/.config `pwd`.out.stackinit
scripts/config --file `pwd`.out.stackinit/.config -e CONFIG_INIT_STACK_ALL_ZERO
KBUILD_OUTPUT=`pwd`.out.stackinit make -j$(nproc) LLVM=1
استخدم الأمر التالي لتشغيل النواة المبنية داخل QEMU:
../virtme/virtme-run --kdir `pwd`.out --show-command --show-boot-console --mods=auto -a "kasan_multi_shot" --qemu-opts -cpu core2duo -m 1G -smp 2
غيّر خيار --kdir عندما تحتاج إلى تشغيل النواتين الأخريين.
ثم تُترجم الوحدات بالأمر التالي. لاحظ أن KDIR يجب أن يشير إلى الدليل الذي يحتوي على النواة المترجمة، وأنك ستحتاج إلى إعادة الترجمة من أجل ../rust-for-linux.out.stackinit و ../rust-for-linux.out.ovf عند اختبار أمثلة تتطلب نوى مترجمة بشكل مختلف.
cd ../rustproofing-linux
make LLVM=1 KDIR=../rust-for-linux.out
تُحمَّل الوحدات وتُشغَّل استغلالات إثبات المفهوم بمساعدة سكربت test.sh. الأمثلة موجودة في منشور المدونة.