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

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

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

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

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

Категории

Все категории
Loading categories
qemu-nvme-sgl-bar — QEMU 11.1.2 — высокий уровень — локальная — UAF — NVMe SGL span в BAR0 неполный CVE-2021-3929 | Kitploit
Инструменты/GitHubGitHub/abraxas/qemu-nvme-sgl-bar
Криминалистика памятиАнализ уязвимостейЭксплуатацияВиртуализация для безопасностиСтатьи и ИсследованияЛаборатории и Практика
GitHubabraxas/qemu-nvme-sgl-bar

qemu-nvme-sgl-bar

QEMU 11.1.2 — высокий уровень — локальная — UAF — NVMe SGL span в BAR0 неполный CVE-2021-3929

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

Популярное

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

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

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

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

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

Abraxas Labs - qemu-nvme-sgl-bar

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  qemu-nvme-sgl-bar

qemu-nvme-sgl-bar

QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - NVMe

Класс: UAF (неполный deny-list BAR0; SGL DMA с выходом за границы в MMIO). Доступ: локальный (гость).

nvme_map_addr — это остаток от CVE-2021-3929. Проверка iomem выполняется только для начального адреса. Блок данных SGL, который начинается чуть раньше BAR0 и заходит в MBAR, принимается. Identify по-прежнему сообщает NVME_CTRL_SGLS_SUPPORT_NO_ALIGN. PRP не может пересекать выровненный по странице BAR. SGL может.

NVMe READ с таким SGL проходит через nvme_blk_read -> dma_blk_read. Bounce DMA затем выполняет address_space_write байтов гостевого диска в BAR0 из callback-функции DMA-хелпера, вне BH mem_reentrancy_guard NVMe. Выбранные гостем нули попадают в CC. nvme_ctrl_reset выполняется, пока живой NvmeRequest всё ещё находится в пути завершения.

Гостевой драйвер NVMe может провести SGL в BAR0, сбросить контроллер из DMA unmap и устроить гонку с живым запросом.

IDCVE пока нет
CWECWE-119 / CWE-416
CVSSВысокий: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H
ПродуктQEMU
Затронутоv11.1.2 (4fc49f46)
Аутентификациягостевое ядро с контроллером NVMe (SGL)
ЛицензияGNU Affero GPL v3.0
Лаборатория127.0.0.1:18720 только qtest

Что может сделать атакующий

Кто: недоверенное гостевое ядро с PCI-устройством NVMe. От гостя к хосту.

Целостность (доказано в лаборатории)

МетодТочка сбросаПривилегия
NVMe READ SGL addr=0xdfffffec len=0x1000 (начинается за 0x14 до BAR0 по адресу 0xe0000000)nvme_map_addr / nvme_addr_is_iomem только для начального адресаОтображение принято. Control Identify с началом в BAR0 по-прежнему возвращает 0x4004 (DATA_TRAS_ERROR | DNR).
Bounce unmap записывает нули LBA в CCaddress_space_write DMA bounce в BAR0, nvme_write_barCSTS.RDY сбрасывается. В журнале pci_nvme_mmio_stopped. Сброс контроллера из DMA-хелпера, а не из гостевой записи MMIO в BH NVMe.

Целостность (предположительно)

Управляемые гостем байты диска в CC / других регистрах BAR0. Сброс отменяет inflight AIO, но запрос, который находится внутри DMA unmap/завершения, всё ещё участвует в гонке с живым NvmeRequest / SQ / CQ. Тот же класс, что и CVE-2021-3929; deny-list никогда не покрывал SGL с выходом за границы. Bounce DIF (nvme_tx из callback-функции AIO) имеет ту же дыру.

Доступность (доказано в лаборатории)

Контроллер останавливается (CSTS.RDY=0, mmio-stopped=1). Процесс гипервизора в этой лаборатории остаётся запущенным (asan=0). Вложенный UAF NvmeRequest при сбросе — предполагаемый следующий шаг, а не свидетельство, которое вывел этот запуск.

Разведка

Нет. BAR0 NVMe виден гостю.

Смежная поверхность, которая остаётся закрытой

  • Начальный адрес внутри BAR0: заблокировано. Это CVE-2021-3929. Контроль в лаборатории SC 0x4004.
  • Admin Identify / Get Log: SGL отклоняются. PRP не может пересекать.
  • Публикация CQE в CQ/SQ внутри BAR0: BH nvme_post_cqes защищён, вложенный MMIO даёт MEMTX_ACCESS_ERROR.
  • Отображение CMB/PMR уже проверяет оба конца.
  • UAF при сбросе Copy между пространствами имён / переполнение bounce DIF: публично, исправлено на этой фиксации.

Лаборатория не демонстрирует контроль RIP или оболочку от гостя к хосту. Класс — это DMA с выходом за границы в MMIO плюс сброс контроллера живого запроса.

Как я это нашёл

CVE-2021-3929 научил дерево отклонять iomem как начало NVMe-маппинга. Я спросил, проверялся ли в этом тесте конец блока данных SGL. Нет, не проверялся. CMB/PMR уже проверяют оба конца. BAR0 — нет. Identify сообщает о невыровненном SGL.

Неверные пути: PRP (ограничен страницей, не может проникнуть в выровненный по странице BAR с предыдущей страницы); административные команды (SGL отклоняется); надежда на то, что ASan сработает при первом READ (свидетелем являются CSTS.RDY и pci_nvme_mmio_stopped, а не отчёт кучи).

Лаборатория

cd lab
./run.sh

Цель — только 127.0.0.1:18720 (qtest). Pin клонируется из github.com/qemu/QEMU тега v11.1.2 / 4fc49f46. Loopback. Только свидетель. Образ диска — 1 MiB нулей, поэтому bounce-записи дают CC.EN=0.

SUCCESS qemu-nvme-sgl-bar control-sc=0x4004 span-addr=0xdfffffec span-end=0xe0000fec csts-rdy-before=1 csts-rdy-after=0 mmio-stopped=1 asan=0 QEMU-NVME-SGL-BAR-WITNESS

Воспроизведение: python3 qemu-nvme-sgl-bar-Abraxas-Labs.py.

Исправление

Отклонять отображение, если любой байт из [addr, addr+len) попадает в BAR0 (и MSI-X), в соответствии с CMB/PMR. nvme_addr_is_iomem должна принимать диапазон, а не начало. Сохранить отклонение при попадании начала в BAR0 как контроль для CVE-2021-3929.

Ссылки

  • github.com/qemu/QEMU тег v11.1.2 коммит 4fc49f46dc95d4a27de2509e7fceb2931e91faeb
  • nvme_map_addr / nvme_addr_is_iomem
  • Рядом исправлено (не этот участок): CVE-2021-3929 начало в BAR0
  • Тот же пин: qemu-xhci-complete-uaf · qemu-colo-l4-oob
  • Серия: QEMU 11.1.2 leftovers
  • CWE-119 · CWE-416

Лицензия

GNU Affero GPL v3.0. См. LICENSE. Только для локальной лаборатории. Без гарантий.

Скачать инструмент