
このソースコードリポジトリは、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
他の 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 スクリプトを使用して行います。サンプルはブログ記事にあります。