Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
cve-2024-21980-poc — Exploit pour CVE-2024-21980 ciblant le firmware AMD SEV afin de déchiffrer la mémoire arbitraire des invités SEV-SNP mis hors service via un bypass de l'application du tampon de commande. | Kitploit
Outils/GitHubGitHub/freax13/cve-2024-21980-poc
Outils de Chiffrement/DéchiffrementAnalyse des VulnérabilitésExploitationSécurité MatérielleDéveloppement de Charges UtilesExploitation de Binaires
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

Exploit pour CVE-2024-21980 ciblant le firmware AMD SEV afin de déchiffrer la mémoire arbitraire des invités SEV-SNP mis hors service via un bypass de l'application du tampon de commande.

Voir le dépôt
815il y a 2 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Vulnérabilité du firmware SEV

Ce dépôt contient un exploit pour une vulnérabilité dans le firmware SEV. L'exploit permet de déchiffrer la mémoire arbitraire d'un invité SEV-SNP après qu'il a été désaffecté.

Testé sur la version 1.55.16 (la plus récente au moment de la rédaction).

Cause racine

Le firmware SEV possède une table appelée master_handler_table contenant des pointeurs de fonction pour toutes les commandes, avec quelques propriétés supplémentaires pertinentes pour les commandes. Deux de ces propriétés supplémentaires sont cmd_buf_type et snp_cmd_buf_enforcement. cmd_buf_type détermine si le tampon de commande doit être copié vers et/ou depuis la mémoire hôte. snp_cmd_buf_enforcement détermine si ces opérations de copie doivent être soumises à des vérifications confirmant que la mémoire soutenant le tampon de commande est dans l'état FIRMWARE ou DEFAULT. Les commandes pour lesquelles cmd_buf_type est CMD_BUF_OUTPUT_ONLY, CMD_BUF_INPUT_AND_OUTPUT, ou CMD_BUF_INPUT_AND_OUTPUT_ERROR devraient toutes avoir snp_cmd_buf_enforcement défini à true. Sinon, l'écriture en retour de la sortie de la commande pourrait causer une corruption de la mémoire dans la zone couverte par le RMP. snp_cmd_buf_enforcement est true pour toutes ces commandes sauf une - SEV_MCMD_ID_ATTESTATION : Cette commande a cmd_buf_type défini à CMD_BUF_INPUT_AND_OUTPUT_ERROR, mais a aussi snp_cmd_buf_enforcement défini à false. En conséquence, il est possible d'exécuter SEV_MCMD_ID_ATTESTATION avec un tampon de commande pointant vers une mémoire couverte par le RMP et que cette mémoire soit corrompue une fois la sortie écrite en retour.

Je ne vois pas pourquoi SEV_MCMD_ID_ATTESTATION aurait besoin d'être une exception, il me semble plausible que cela puisse être une erreur de frappe/de copier-coller.

Exploit

SEV_MCMD_ID_ATTESTATION n'écrit que dans un seul champ length (4 octets) dans le tampon de commande, donc ce sont les seuls octets que nous pouvons utiliser pour corrompre la mémoire. SEV_MCMD_ID_ATTESTATION écrit toujours la même valeur - 0x000000d0. Heureusement, il n'y a pas d'exigences d'alignement sur le tampon de commande, donc nous pouvons décaler le tampon de commande de manière répétée pour corrompre une plus grande plage de mémoire contiguë. Nous allons utiliser cela pour corrompre les 16 premiers octets d'une page de contexte d'invité avec un motif statique. Ces 16 premiers octets contiennent la graine de clé UMC, donc en la forçant à une valeur statique, nous pouvons forcer la clé de chiffrement de l'invité à une valeur statique.

L'exploit fourni ici est largement basé sur celui que j'ai fourni pour SWPSIRT-2684/CVE-2023-31355.

Pour exploiter la vulnérabilité, nous pouvons exécuter les étapes suivantes :

  1. Lancez un invité SEV ou SEV-ES. Cela est nécessaire pour SEV_MCMD_ID_ATTESTATION. Gardez cet invité en cours d'exécution.
  2. Créez une page de contexte d'invité à l'adresse 0x2000 pour l'invité victime. Toute autre adresse dans la zone couverte par le RMP ferait également l'affaire, bien qu'une adresse fixe soit utile pour le débogage.
  3. Utilisez la vulnérabilité pour corrompre la graine de clé UMC de l'invité victime.
  4. Activez la page de contexte de l'invité victime et lancez et exécutez l'invité victime.
  5. Désaffectez l'invité victime.
  6. Créez une page de contexte d'invité à l'adresse 0x2000 pour l'invité attaquant. Cela doit être la même adresse que celle utilisée à l'étape 1.
  7. Utilisez la vulnérabilité pour corrompre la graine de clé UMC de l'invité attaquant.
  8. Activez la page de contexte de l'invité attaquant et lancez avec le drapeau de débogage activé.
  9. Assignez la mémoire de l'invité victime à l'invité attaquant.
  10. Utilisez la commande SNP_DBG_ENCRYPT pour déchiffrer la mémoire de l'invité victime en utilisant la page de contexte de l'invité attaquant. Cela réussira car l'invité victime et l'invité attaquant partagent une graine de clé UMC.

Impact

L'impact ici devrait être au moins le même qu'avec SWPSIRT-2684. Il n'est pas clair pour moi à ce stade si ce bogue peut être utilisé pour déchiffrer la mémoire d'un invité en cours d'exécution avant qu'il ne soit désaffecté.

Atténuation

snp_cmd_buf_enforcement devrait être défini à true pour SEV_MCMD_ID_ATTESTATION.

Fait intéressant, les correctifs de support hôte Linux KVM n'ont pas besoin d'être mis à jour car ils listent déjà SEV_CMD_ATTESTATION_REPORT dans sev_cmd_buf_writable comme une commande qui nécessite que son tampon de commande soit dans l'état FIRMWARE. Des changements peuvent ou non être nécessaires pour d'autres hyperviseurs.

Utilisation du PoC

  1. Modifiez la zone couverte par le RMP dans le BIOS pour 64 GiB (pages de 1 Mio en 0x10000). Si votre système ne le supporte pas, les correctifs Linux devront être ajustés en conséquence. Le PoC a été testé sur un système avec 128 GiB de mémoire.
  2. Appliquez les correctifs du dossier linux-patches à la pointe de https://github.com/AMDESE/linux/commits/snp-host-v10. Compilez, installez et démarrez le noyau.
  3. Lancez un invité SEV ou SEV-ES et gardez-le en cours d'exécution.
  4. Lancez un invité SEV-SNP victime.
  5. Arrêtez l'invité victime.
  6. Inspectez les journaux du noyau pour trouver l'emplacement de la page secrète créée lors du lancement.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. Exécutez le PoC.
    root@kitploit:~
    root@server:~/firmware-vuln-poc# cargo run -- --pfn 0x171a24 
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
    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
    
    Notez qu'il n'y a rien de spécial dans les pages secrètes, cet exploit peut aussi être utilisé pour déchiffrer des pages normales. Les pages secrètes sont utilisées dans le PoC car elles ont un contenu très reconnaissable qui permet de voir facilement que le déchiffrement de la mémoire de la victime a réussi.
Télécharger l’outil