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
Инструменты шифрования/дешифрованияАнализ уязвимостейЭксплуатацияАппаратная БезопасностьРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

Эксплойт для CVE-2024-21980, направленный на прошивку AMD SEV для расшифровки произвольной памяти выведенных из эксплуатации гостей SEV-SNP через обход принудительного выполнения командного буфера.

Репозиторий
812 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Уязвимость прошивки 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. В результате можно выполнить SEV_MCMD_ID_ATTESTATION с буфером команды, указывающим на память, покрываемую RMP, и эта память будет повреждена после записи вывода.

Я не вижу, зачем 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 должно быть установлено в true для SEV_MCMD_ID_ATTESTATION.

Интересно, что патчи поддержки хост-системы Linux KVM не нужно обновлять, поскольку они уже перечисляют SEV_CMD_ATTESTATION_REPORT в sev_cmd_buf_writable как команду, требующую, чтобы её буфер команды находился в состоянии FIRMWARE. Изменения могут потребоваться или не потребоваться для других гипервизоров.

Использование PoC

  1. Измените область, покрываемую RMP, в BIOS на 64 ГБ (0x10000 1-МБ страниц). Если ваша система этого не поддерживает, патчи Linux придется скорректировать соответствующим образом. PoC протестирован на системе с 128 ГБ памяти.
  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, потому что они имеют очень узнаваемое содержимое, которое позволяет легко увидеть, что расшифровка памяти жертвы прошла успешно.
Скачать инструмент