
Exemples pédagogiques de portage de vulnérabilités du noyau Linux vers Rust, avec du code volontairement vulnérable et des exploits pour apprendre la sécurité du noyau et la sûreté de Rust.
Ce dépôt de code source est une collection d'exemples accompagnant l'article de blog à l'adresse https://research.nccgroup.com/?p=18577.
N'UTILISEZ PAS ces exemples à d'autres fins que pour suivre l'article de blog. Ils contiennent intentionnellement des vulnérabilités, et même les versions « corrigées » peuvent contenir des bugs.
Si vous souhaitez exécuter les exemples de l'article de blog, les instructions suivantes devraient, espérons-le, faciliter la tâche.
Obtenez le code source de Rust for Linux. Vous devrez peut-être installer certaines dépendances listées sur [https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst](la page de démarrage rapide) .
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
Obtenez virtme. Vous devrez peut-être aussi installer QEMU et quelques autres dépendances.
git clone https://github.com/amluto/virtme
Je trouve virtme très utile pour tester rapidement une modification dans le noyau principal ou dans un module du noyau.
Compilez le noyau de base sur lequel la plupart des exemples s'exécuteront :
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
Et les variantes avec des options de configuration légèrement différentes :
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
Utilisez la commande suivante pour démarrer le noyau compilé dans 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
Modifiez l'option --kdir lorsque vous devez exécuter les deux autres noyaux.
Les modules sont ensuite compilés avec la commande suivante. Notez que KDIR doit pointer vers le répertoire contenant le noyau compilé, et que vous devrez recompiler pour ../rust-for-linux.out.stackinit et ../rust-for-linux.out.ovf lorsque vous testez des exemples qui nécessitent des noyaux compilés différemment.
cd ../rustproofing-linux
make LLVM=1 KDIR=../rust-for-linux.out
Les modules sont chargés et les exploits de preuve de concept sont exécutés à l'aide du script test.sh. Les exemples se trouvent dans l'article de blog.