
Учебные примеры портирования уязвимостей ядра Linux на Rust, содержащие намеренно уязвимый код и эксплойты для изучения безопасности ядра и гарантий безопасности Rust.
Этот репозиторий с исходным кодом содержит набор примеров, сопутствующих сообщению в блоге https://research.nccgroup.com/?p=18577.
НЕ ИСПОЛЬЗУЙТЕ эти примеры ни для чего, кроме как для сопровождения сообщения в блоге. Они намеренно содержат уязвимости, и даже «исправленные» версии могут содержать ошибки.
Если вы хотите запустить примеры из сообщения в блоге, следующие рекомендации, надеюсь, упростят это.
Получите исходный код 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
Модули загружаются, а proof-of-concept эксплойты запускаются с помощью скрипта test.sh. Примеры приведены в сообщении в блоге.