
Ejemplos educativos que portan vulnerabilidades del kernel de Linux a Rust, con código y exploits vulnerables a propósito para aprender sobre seguridad del kernel y las garantías de seguridad de Rust.
Este repositorio de código fuente es una colección de ejemplos que acompañan la publicación del blog en https://research.nccgroup.com/?p=18577.
NO UTILICES estos ejemplos para nada más que seguir la publicación del blog. Contienen vulnerabilidades a propósito, e incluso las versiones "corregidas" podrían contener errores.
Si deseas ejecutar los ejemplos de la publicación del blog, las siguientes pautas deberían facilitarte la tarea.
Obtén el código fuente de Rust for Linux. Es posible que necesites instalar algunas dependencias listadas en [https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst](la página de inicio 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
Obtén virtme. También es posible que necesites instalar QEMU y algunas otras dependencias.
git clone https://github.com/amluto/virtme
Encuentro virtme muy útil para probar rápidamente un cambio en el núcleo del kernel o en un módulo del kernel.
Construye el kernel base sobre el que se ejecutarán la mayoría de los ejemplos:
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
Y variantes con opciones de configuración ligeramente 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
Usa el siguiente comando para iniciar el kernel compilado dentro de 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
Cambia la opción --kdir cuando necesites ejecutar los otros dos kernels.
Los módulos se compilan luego con el siguiente comando. Ten en cuenta que KDIR debe apuntar al directorio con el kernel compilado, y que tendrás que recompilar para ../rust-for-linux.out.stackinit y ../rust-for-linux.out.ovf cuando pruebes ejemplos que requieran kernels compilados de forma diferente.
cd ../rustproofing-linux
make LLVM=1 KDIR=../rust-for-linux.out
Los módulos se cargan y los exploits de prueba de concepto se ejecutan con la ayuda del script test.sh. Los ejemplos se encuentran en la publicación del blog.