
Lehrbeispiele zur Portierung von Linux-Kernel-Schwachstellen auf Rust, mit absichtlich verwundbarem Code und Exploits zum Erlernen von Kernel-Sicherheit und Rusts Sicherheit.
Dieses Quellcode-Repository ist eine Sammlung von Beispielen, die den Blogbeitrag unter https://research.nccgroup.com/?p=18577 begleiten.
Verwende diese Beispiele NICHT für irgendetwas anderes als zum Nachvollziehen des Blogbeitrags. Sie enthalten absichtlich Schwachstellen, und selbst die „behobenen" Versionen könnten Fehler enthalten.
Wenn du die Beispiele aus dem Blogbeitrag ausführen möchtest, sollten die folgenden Hinweise dir das hoffentlich erleichtern.
Besorge den Rust-für-Linux-Quellcode. Möglicherweise musst du einige Abhängigkeiten installieren, die auf [https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst](der Schnellstart-Seite) aufgeführt sind.
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
Besorge virtme. Möglicherweise musst du auch QEMU und einige andere Abhängigkeiten installieren.
git clone https://github.com/amluto/virtme
Ich finde virtme wirklich nützlich, um schnell eine Änderung entweder im Kernkernel oder in einem Kernelmodul zu testen.
Baue die Kernel-Basis, auf der die meisten Beispiele laufen werden:
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
Und Varianten mit leicht abweichenden Konfigurationsoptionen:
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
Verwende den folgenden Befehl, um den gebauten Kernel in QEMU zu starten:
../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
Ändere die Option --kdir, wenn du die anderen beiden Kernel ausführen musst.
Die Module werden anschließend mit dem folgenden Befehl kompiliert. Beachte, dass KDIR auf das Verzeichnis mit dem kompilierten Kernel zeigen muss und dass du für ../rust-for-linux.out.stackinit und ../rust-for-linux.out.ovf neu kompilieren musst, wenn du Beispiele testest, die unterschiedlich kompilierte Kernel erfordern.
cd ../rustproofing-linux
make LLVM=1 KDIR=../rust-for-linux.out
Die Module werden geladen und Proof-of-Concept-Exploits werden mit Hilfe des Skripts test.sh ausgeführt. Beispiele finden sich im Blogbeitrag.