
Exemplos educacionais que portam vulnerabilidades do kernel Linux para Rust, apresentando código intencionalmente vulnerável e exploits para o aprendizado de segurança do kernel e da segurança do Rust.
Este repositório de código-fonte é uma coleção de exemplos que acompanham a publicação no blog em https://research.nccgroup.com/?p=18577.
NÃO USE estes exemplos para nada além de acompanhar a publicação no blog. Eles contêm vulnerabilidades intencionalmente, e até mesmo as versões "corrigidas" podem conter bugs.
Se você deseja executar os exemplos da publicação no blog, as diretrizes a seguir devem facilitar isso.
Obtenha o código-fonte do Rust for Linux. Talvez seja necessário instalar algumas dependências listadas em [https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst](a página de início rápido) .
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
Obtenha o virtme. Talvez você também precise instalar o QEMU e algumas outras dependências.
git clone https://github.com/amluto/virtme
Acho o virtme realmente útil para testar rapidamente uma alteração no núcleo do kernel ou em um módulo de kernel.
Construa o kernel base no qual a maioria dos exemplos será executada:
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
E variantes com opções de configuração ligeiramente diferentes:
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
Use o seguinte comando para iniciar o kernel compilado dentro do 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
Altere a opção --kdir quando precisar executar os outros dois kernels.
Os módulos são então compilados com o seguinte comando. Observe que KDIR precisa apontar para o diretório com o kernel compilado, e que você precisará recompilar para ../rust-for-linux.out.stackinit e ../rust-for-linux.out.ovf ao testar exemplos que exijam kernels compilados de forma diferente.
cd ../rustproofing-linux
make LLVM=1 KDIR=../rust-for-linux.out
Os módulos são carregados e os exploits de prova de conceito são executados com a ajuda do script test.sh. Os exemplos são encontrados na publicação do blog.