
लिनक्स कर्नेल कमजोरियों को रस्ट में पोर्ट करने के शैक्षिक उदाहरण, जिनमें कर्नेल सुरक्षा और रस्ट की सुरक्षा सीखने के लिए जानबूझकर कमजोर कोड और एक्सप्लॉइट शामिल हैं।
यह सोर्स कोड रिपॉज़िटरी https://research.nccgroup.com/?p=18577 पर ब्लॉग पोस्ट के साथ दिए गए उदाहरणों का संग्रह है।
इन उदाहरणों का उपयोग ब्लॉग पोस्ट को फॉलो करने के अलावा किसी और चीज़ के लिए न करें। इनमें जानबूझकर कमज़ोरियाँ (vulnerabilities) हैं, और यहाँ तक कि "फिक्स किए गए" संस्करणों में भी बग्स हो सकते हैं।
यदि आप ब्लॉग पोस्ट के उदाहरणों को चलाना चाहते हैं, तो निम्नलिखित दिशानिर्देश इसे आसान बना देंगे।
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 स्क्रिप्ट की सहायता से प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट चलाए जाते हैं। उदाहरण ब्लॉग पोस्ट में मिलते हैं।