
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](quick start 페이지)에 나열된 일부 종속성을 설치해야 할 수도 있습니다.
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
모듈은 test.sh 스크립트의 도움으로 로드되고 개념 증명 익스플로잇이 실행됩니다. 예제는 블로그 게시물에서 찾을 수 있습니다.