Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cve-2024-21980-poc — Exploit per CVE-2024-21980 che mira al firmware AMD SEV per decrittare la memoria arbitraria di guest SEV-SNP dismessi tramite un bypass dell'applicazione del buffer di comando. | Kitploit
Strumenti/GitHubGitHub/freax13/cve-2024-21980-poc
Strumenti di Crittografia/DecrittografiaAnalisi delle VulnerabilitàExploitSicurezza HardwareSviluppo PayloadBinary Exploitation
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

Exploit per CVE-2024-21980 che mira al firmware AMD SEV per decrittare la memoria arbitraria di guest SEV-SNP dismessi tramite un bypass dell'applicazione del buffer di comando.

Vedi Repository
8152 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Vulnerabilità del firmware SEV

Questo repository contiene un exploit per una vulnerabilità nel firmware SEV. L'exploit consente di decrittare memoria arbitraria di un guest SEV-SNP dopo che è stato dismesso.

Testato sulla versione 1.55.16 (l'ultima al momento della scrittura).

Causa principale

Il firmware SEV ha una tabella chiamata master_handler_table contenente i puntatori a funzione per tutti i comandi, con alcune proprietà aggiuntive rilevanti per i comandi. Due di queste proprietà aggiuntive sono cmd_buf_type e snp_cmd_buf_enforcement. cmd_buf_type determina se il buffer dei comandi deve essere copiato dalla/e verso la memoria dell'host. snp_cmd_buf_enforcement determina se queste operazioni di copia devono essere soggette a controlli che verificano che la memoria che supporta il buffer dei comandi sia nello stato FIRMWARE o DEFAULT. I comandi per cui cmd_buf_type è CMD_BUF_OUTPUT_ONLY, CMD_BUF_INPUT_AND_OUTPUT o CMD_BUF_INPUT_AND_OUTPUT_ERROR dovrebbero tutti avere snp_cmd_buf_enforcement impostato a true. In caso contrario, la riscrittura dell'output del comando potrebbe causare corruzione della memoria all'interno dell'area coperta da RMP. snp_cmd_buf_enforcement è true per tutti questi comandi con un'eccezione - SEV_MCMD_ID_ATTESTATION: questo comando ha cmd_buf_type impostato a CMD_BUF_INPUT_AND_OUTPUT_ERROR, ma ha anche snp_cmd_buf_enforcement impostato a false. Di conseguenza è possibile eseguire SEV_MCMD_ID_ATTESTATION con un buffer dei comandi che punta a memoria coperta da RMP e far sì che quella memoria venga corrotta una volta che l'output viene riscritto.

Non vedo perché SEV_MCMD_ID_ATTESTATION debba essere un'eccezione; mi sembra plausibile che possa essere un errore di battitura/copia-incolla.

Exploit

SEV_MCMD_ID_ATTESTATION scrive solo un singolo campo length (4 byte) nel buffer dei comandi e quindi questi sono gli unici byte che possiamo usare per corrompere la memoria. SEV_MCMD_ID_ATTESTATION scrive sempre lo stesso valore - 0x000000d0. Fortunatamente non ci sono requisiti di allineamento sul buffer dei comandi e quindi possiamo spostare ripetutamente il buffer dei comandi per corrompere un'area più ampia di memoria contigua. Useremo questo per corrompere i primi 16 byte di una pagina di contesto del guest con un pattern statico. Quei primi 16 byte contengono il seed della chiave UMC e quindi forzandolo a un valore statico, possiamo forzare la chiave di cifratura del guest a un valore statico.

L'exploit qui fornito è fortemente basato su quello che ho fornito per SWPSIRT-2684/CVE-2023-31355.

Per sfruttare la vulnerabilità possiamo eseguire i seguenti passaggi:

  1. Avvia un guest SEV o SEV-ES. Questo è necessario per SEV_MCMD_ID_ATTESTATION. Tieni questo guest in esecuzione.
  2. Crea una pagina di contesto guest all'indirizzo 0x2000 per il guest vittima. Qualsiasi altro indirizzo nell'area coperta da RMP andrebbe bene, anche se un indirizzo fisso è utile per il debug.
  3. Usa la vulnerabilità per corrompere il seed della chiave UMC del guest vittima.
  4. Attiva la pagina di contesto del guest vittima e avvia ed esegui il guest vittima.
  5. Dismetti il guest vittima.
  6. Crea una pagina di contesto guest all'indirizzo 0x2000 per il guest attaccante. Deve essere lo stesso indirizzo usato nel passaggio 1.
  7. Usa la vulnerabilità per corrompere il seed della chiave UMC del guest attaccante.
  8. Attiva la pagina di contesto del guest attaccante e avvia con il flag di debug abilitato.
  9. Assegna la memoria del guest vittima al guest attaccante.
  10. Usa il comando SNP_DBG_ENCRYPT per decrittare la memoria del guest vittima usando la pagina di contesto del guest attaccante. Questa operazione avrà successo perché il guest vittima e il guest attaccante condividono un seed della chiave UMC.

Impatto

L'impatto qui dovrebbe essere almeno lo stesso di SWPSIRT-2684. Non mi è chiaro al momento se questo bug possa essere usato per decrittare la memoria di un guest in esecuzione prima che venga dismesso.

Mitigazione

snp_cmd_buf_enforcement dovrebbe essere impostato a true per SEV_MCMD_ID_ATTESTATION.

È interessante notare che le patch di supporto host Linux KVM non devono essere aggiornate perché elencano già SEV_CMD_ATTESTATION_REPORT in sev_cmd_buf_writable come un comando che richiede che il suo buffer dei comandi sia nello stato FIRMWARE. Potrebbero essere necessarie o meno modifiche per altri hypervisor.

Utilizzo del PoC

  1. Modifica l'area coperta da RMP nel BIOS a 64GiB (0x10000 pagine da 1 MiB). Se il tuo sistema non lo supporta, le patch Linux dovranno essere adattate di conseguenza. Il PoC è stato testato su un sistema con 128GiB di memoria.
  2. Applica le patch nella cartella linux-patches alla punta di https://github.com/AMDESE/linux/commits/snp-host-v10. Compila, installa e avvia il kernel.
  3. Avvia un guest SEV o SEV-ES e tienilo in esecuzione.
  4. Avvia un guest vittima SEV-SNP.
  5. Ferma il guest vittima.
  6. Ispeziona i log del kernel per trovare la posizione della pagina segreta creata durante l'avvio.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. Esegui il PoC.
    root@kitploit:~
    root@server:~/firmware-vuln-poc# cargo run -- --pfn 0x171a24 
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
    Creating VM with identical UMC key seed
    Raw page:
    000: 0300000000000000110fa00000000000000000000000000000000000a98d95ff
    020: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
    040: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
    060: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
    080: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
    0a0: 0000000000000000000000000000000000000000000000000000000000000000
    0c0: 0000000000000000000000000000000000000000000000000000000000000000
    0e0: 0000000000000000000000000000000000000000000000000000000000000000
    100: 000000000080008800000000eeff0000f0ffffffffffffffff3f000000000000
    120: 0000000000000000000000000000000000000000000000000000000000000000
    140: 0000000000000000000000000000000000000000000000000000000000000000
    160: c800000000000000000000000000000000000000000000000000000000000000
    180: 0000000000000000000000000000000000000000000000000000000000000000
    1a0: 0000000000000000000000000000000000000000000000000000000000000000
    1c0: 0000000000000000000000000000000000000000000000000000000000000000
    1e0: 0000000000000000000000000000000000000000000000000000000000000000
    200: 0000000000000000000000000000000000000000000000000000000000000000
    220: 0000000000000000000000000000000000000000000000000000000000000000
    240: 0000000000000000000000000000000000000000000000000000000000000000
    260: 0000000000000000000000000000000000000000000000000000000000000000
    280: 0000000000000000000000000000000000000000000000000000000000000000
    2a0: 0000000000000000000000000000000000000000000000000000000000000000
    2c0: 0000000000000000000000000000000000000000000000000000000000000000
    2e0: 0000000000000000000000000000000000000000000000000000000000000000
    300: 0000000000000000000000000000000000000000000000000000000000000000
    320: 0000000000000000000000000000000000000000000000000000000000000000
    340: 0000000000000000000000000000000000000000000000000000000000000000
    360: 0000000000000000000000000000000000000000000000000000000000000000
    380: 0000000000000000000000000000000000000000000000000000000000000000
    3a0: 0000000000000000000000000000000000000000000000000000000000000000
    3c0: 0000000000000000000000000000000000000000000000000000000000000000
    3e0: 0000000000000000000000000000000000000000000000000000000000000000
    400: 0000000000000000000000000000000000000000000000000000000000000000
    420: 0000000000000000000000000000000000000000000000000000000000000000
    440: 0000000000000000000000000000000000000000000000000000000000000000
    460: 0000000000000000000000000000000000000000000000000000000000000000
    480: 0000000000000000000000000000000000000000000000000000000000000000
    4a0: 0000000000000000000000000000000000000000000000000000000000000000
    4c0: 0000000000000000000000000000000000000000000000000000000000000000
    4e0: 0000000000000000000000000000000000000000000000000000000000000000
    500: 0000000000000000000000000000000000000000000000000000000000000000
    520: 0000000000000000000000000000000000000000000000000000000000000000
    540: 0000000000000000000000000000000000000000000000000000000000000000
    560: 0000000000000000000000000000000000000000000000000000000000000000
    580: 0000000000000000000000000000000000000000000000000000000000000000
    5a0: 0000000000000000000000000000000000000000000000000000000000000000
    5c0: 0000000000000000000000000000000000000000000000000000000000000000
    5e0: 0000000000000000000000000000000000000000000000000000000000000000
    600: 0000000000000000000000000000000000000000000000000000000000000000
    620: 0000000000000000000000000000000000000000000000000000000000000000
    640: 0000000000000000000000000000000000000000000000000000000000000000
    660: 0000000000000000000000000000000000000000000000000000000000000000
    680: 0000000000000000000000000000000000000000000000000000000000000000
    6a0: 0000000000000000000000000000000000000000000000000000000000000000
    6c0: 0000000000000000000000000000000000000000000000000000000000000000
    6e0: 0000000000000000000000000000000000000000000000000000000000000000
    700: 0000000000000000000000000000000000000000000000000000000000000000
    720: 0000000000000000000000000000000000000000000000000000000000000000
    740: 0000000000000000000000000000000000000000000000000000000000000000
    760: 0000000000000000000000000000000000000000000000000000000000000000
    780: 0000000000000000000000000000000000000000000000000000000000000000
    7a0: 0000000000000000000000000000000000000000000000000000000000000000
    7c0: 0000000000000000000000000000000000000000000000000000000000000000
    7e0: 0000000000000000000000000000000000000000000000000000000000000000
    800: 0000000000000000000000000000000000000000000000000000000000000000
    820: 0000000000000000000000000000000000000000000000000000000000000000
    840: 0000000000000000000000000000000000000000000000000000000000000000
    860: 0000000000000000000000000000000000000000000000000000000000000000
    880: 0000000000000000000000000000000000000000000000000000000000000000
    8a0: 0000000000000000000000000000000000000000000000000000000000000000
    8c0: 0000000000000000000000000000000000000000000000000000000000000000
    8e0: 0000000000000000000000000000000000000000000000000000000000000000
    900: 0000000000000000000000000000000000000000000000000000000000000000
    920: 0000000000000000000000000000000000000000000000000000000000000000
    940: 0000000000000000000000000000000000000000000000000000000000000000
    960: 0000000000000000000000000000000000000000000000000000000000000000
    980: 0000000000000000000000000000000000000000000000000000000000000000
    9a0: 0000000000000000000000000000000000000000000000000000000000000000
    9c0: 0000000000000000000000000000000000000000000000000000000000000000
    9e0: 0000000000000000000000000000000000000000000000000000000000000000
    a00: 0000000000000000000000000000000000000000000000000000000000000000
    a20: 0000000000000000000000000000000000000000000000000000000000000000
    a40: 0000000000000000000000000000000000000000000000000000000000000000
    a60: 0000000000000000000000000000000000000000000000000000000000000000
    a80: 0000000000000000000000000000000000000000000000000000000000000000
    aa0: 0000000000000000000000000000000000000000000000000000000000000000
    ac0: 0000000000000000000000000000000000000000000000000000000000000000
    ae0: 0000000000000000000000000000000000000000000000000000000000000000
    b00: 0000000000000000000000000000000000000000000000000000000000000000
    b20: 0000000000000000000000000000000000000000000000000000000000000000
    b40: 0000000000000000000000000000000000000000000000000000000000000000
    b60: 0000000000000000000000000000000000000000000000000000000000000000
    b80: 0000000000000000000000000000000000000000000000000000000000000000
    ba0: 0000000000000000000000000000000000000000000000000000000000000000
    bc0: 0000000000000000000000000000000000000000000000000000000000000000
    be0: 0000000000000000000000000000000000000000000000000000000000000000
    c00: 0000000000000000000000000000000000000000000000000000000000000000
    c20: 0000000000000000000000000000000000000000000000000000000000000000
    c40: 0000000000000000000000000000000000000000000000000000000000000000
    c60: 0000000000000000000000000000000000000000000000000000000000000000
    c80: 0000000000000000000000000000000000000000000000000000000000000000
    ca0: 0000000000000000000000000000000000000000000000000000000000000000
    cc0: 0000000000000000000000000000000000000000000000000000000000000000
    ce0: 0000000000000000000000000000000000000000000000000000000000000000
    d00: 0000000000000000000000000000000000000000000000000000000000000000
    d20: 0000000000000000000000000000000000000000000000000000000000000000
    d40: 0000000000000000000000000000000000000000000000000000000000000000
    d60: 0000000000000000000000000000000000000000000000000000000000000000
    d80: 0000000000000000000000000000000000000000000000000000000000000000
    da0: 0000000000000000000000000000000000000000000000000000000000000000
    dc0: 0000000000000000000000000000000000000000000000000000000000000000
    de0: 0000000000000000000000000000000000000000000000000000000000000000
    e00: 0000000000000000000000000000000000000000000000000000000000000000
    e20: 0000000000000000000000000000000000000000000000000000000000000000
    e40: 0000000000000000000000000000000000000000000000000000000000000000
    e60: 0000000000000000000000000000000000000000000000000000000000000000
    e80: 0000000000000000000000000000000000000000000000000000000000000000
    ea0: 0000000000000000000000000000000000000000000000000000000000000000
    ec0: 0000000000000000000000000000000000000000000000000000000000000000
    ee0: 0000000000000000000000000000000000000000000000000000000000000000
    f00: 0000000000000000000000000000000000000000000000000000000000000000
    f20: 0000000000000000000000000000000000000000000000000000000000000000
    f40: 0000000000000000000000000000000000000000000000000000000000000000
    f60: 0000000000000000000000000000000000000000000000000000000000000000
    f80: 0000000000000000000000000000000000000000000000000000000000000000
    fa0: 0000000000000000000000000000000000000000000000000000000000000000
    fc0: 0000000000000000000000000000000000000000000000000000000000000000
    fe0: 0000000000000000000000000000000000000000000000000000000000000000
    
    Secrets page:
    imi_en: false
    FMS: 00a00f11
    gosvw: 000000000000000000000000a98d95ff
    vmpck0: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
    vmpck1: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
    vmpck2: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
    vmpck3: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    

Nota che non c'è nulla di speciale nelle pagine segrete: questo exploit può essere usato anche per decrittare pagine normali. Le pagine segrete sono usate nel PoC perché hanno un contenuto molto riconoscibile che rende facile vedere che la decrittazione della memoria della vittima è riuscita.

Scarica lo strumento