CVE-2026-90012 в Linux Kernel: критический сбой DMA-маппинга SPI и последствия для стабильности ядра

CVE: CVE-2026-90012
Продукт: Linux Kernel
Дата публикации: 16.09.2026
Критичность: CRITICAL
CVSS: 9.8 (3.1)
EPSS: 0,63%; процентиль 48,61%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


Уязвимость CVE-2026-90012 затрагивает подсистему SPI в Linux kernel. Проблема возникает при частичном провале создания DMA-маппингов: после успешной маппинги TX и последующего сбоя RX ядро сохраняет флаг tx_sg_mapped, но не обновляет текущие устройства cur_tx_dma_dev и cur_rx_dma_dev.

При повторных операциях spi_unmap_msg() может быть вызвано освобождение маппинга с NULL или устаревшим устройством. Это приводит к обращению по пустому указателю внутри dma_unmap_sg_attrs(), что вызывает oops в ядре. Риск актуален для систем, где подсистема SPI активно обрабатывает передачи с DMA и возможны частичные отказы маппинга.

Основные характеристики​


Риск связан с потерей целостности управления DMA-маппингами в драйвере SPI: ядро теряет корректное соответствие между созданными маппингами и устройствами, которые их создали. При повторном освобождении маппингов вызывается обращение к NULL или устаревшему указателю, что приводит к падению ядра.

  • Тип ошибки: нарушение управления памятью DMA-маппингов в SPI-подсистеме Linux kernel; некорректное обновление полей cur_tx_dma_dev и cur_rx_dma_dev при частичном сбое маппинга.
  • CVSS v3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — оценка 9.8, критическая.
  • Вектор атаки: удалённый доступ без привилегий и взаимодействия; возможность срабатывания при обработке SPI-передач с DMA.
  • Факт эксплуатации: в предоставленных источниках нет подтверждения активной эксплуатации или публичного эксплойта.
  • EPSS: 0,626% (доля 0.00626), процентиль 48,61% — вероятность эксплуатации в ближайшие три месяца умеренная по статистике FIRST.

Какие продукты и версии затронуты​


Затронут Linux kernel с подсистемой SPI и DMA-маппингом.

  • Компонент: драйвер SPI в файле drivers/spi/spi.c.
  • Функции: __spi_map_msg(), spi_unmap_msg(), __spi_unmap_msg(), dma_unmap_sg_attrs().
  • Поля состояния: tx_sg_mapped, rx_sg_mapped, cur_tx_dma_dev, cur_rx_dma_dev в структуре SPI-контроллера.
  • Условие активации: наличие SPI-устройств с DMA и возможность частичного отказа маппинга (RX после TX или TX на последующей передаче).

Точный диапазон версий ядра, где уязвимость подтверждена, в предоставленных источниках не указан. Исправление распространено в стабильных ветках Linux kernel через коммиты с идентификаторами 367cea239fc93094e5c16a72724800e0358f5c46, 5def8b6aaad44603740786262b95b6f77df52a1c, a38051fa2ddedbc8ec15292c55e276880ec5b9a4 и cc8354213ad6bd5fb8cc05a3fa3701188d086626. Для проверки актуальности нужно сопоставить версию ядра с наличием этих исправлений в конкретном дистрибутиве.

Причина уязвимости​


Причина — некорректная логика обработки частичного сбоя при создании DMA-маппингов для SPI-сообщений.

В функции __spi_map_msg() сначала создаётся маппинг TX, затем RX. Если RX-маппинг завершается ошибкой после успешного создания TX-маппинга, код освобождает TX-маппинг через spi_unmap_buf_attrs(), но флаг tx_sg_mapped остаётся установленным.

Поля cur_tx_dma_dev и cur_rx_dma_dev обновляются только после того, как все передачи в сообщении успешно маппированы. При частичном сбое эти поля не получают актуальные значения устройств.

При последующем вызове spi_unmap_msg() ядро пытается освободить ранее созданные маппинги. Если устройство для освобождения равно NULL или устарело, функция dma_unmap_sg_attrs() обращается к указателю устройства до проверки количества записей в SG-таблице. Пустая SG-таблица не защищает от обращения по NULL.

Исправление переносит публикацию устройств до начала цикла маппинга и добавляет единый путь развёртывания всех частичных сбоев через __spi_unmap_msg(). Это гарантирует, что каждый маппинг освобождается ровно один раз и с тем устройством, которое его создало.

Как работает атака​


Механика атаки строится на управляемом сбое SPI-маппинга.

Атакующий или вредоносная нагрузка должна вызвать ситуацию, при которой в __spi_map_msg() создаётся TX-маппинг, но RX-маппинг завершается ошибкой. Альтернативный путь — успешное создание маппингов для ранних передач и сбой TX на последующей передаче.

В обоих случаях флаги маппинга остаются установленными, а текущие устройства не обновляются. При следующем обращении к spi_unmap_msg() ядро использует устаревшее или NULL-устройство для освобождения маппингов.

Функция dma_unmap_sg_attrs() обращается к полю устройства до проверки размера SG-таблицы. Если устройство равно NULL, происходит обращение по пустому указателю и срабатывает oops в ядре.

Последствие — потеря стабильности ядра: краш процесса или аварийное завершение работы системы при обработке SPI-передач.

Условия успешной эксплуатации​


Для воспроизведения проблемы необходимы следующие условия:

  • Наличие SPI-подсистемы: в ядре должен быть активен драйвер SPI с поддержкой DMA-маппинга.
  • Возможность частичного сбоя маппинга: должно произойти завершение RX-маппинга ошибкой после успешного TX-маппинга или сбой TX на последующей передаче.
  • Повторное освобождение маппингов: после частичного сбоя должен быть вызван spi_unmap_msg() для сообщения, где флаги маппинга установлены.
  • Доступ к SPI-устройству: система должна обрабатывать SPI-передачи с DMA, например через периферийные устройства или виртуальные SPI-контроллеры.

Прямое влияние на пользовательские данные не подтверждено. Основной эффект — oops в ядре из-за обращения по NULL внутри dma_unmap_sg_attrs().

Возможный сценарий атаки​


Сценарий начинается с инициализации SPI-сообщения, содержащего несколько передач.

Ядро вызывает __spi_map_msg(), создаёт TX-маппинг для первой передачи. Затем при создании RX-маппинга происходит ошибка. Функция освобождает TX-маппинг, но флаг tx_sg_mapped остаётся установленным. Поля cur_tx_dma_dev и cur_rx_dma_dev не обновляются.

При завершении обработки сообщения или при следующем обращении к SPI-контроллеру вызывается spi_unmap_msg(). Функция пытается освободить маппинги, используя устаревшее устройство. Если устройство равно NULL, обращение происходит к пустому указателю.

Внутри dma_unmap_sg_attrs() проверка количества записей в SG-таблице выполняется после обращения к устройству. Пустая таблица не предотвращает сбой.

Результат — oops в ядре при обработке SPI-передач.

Есть ли публичный эксплойт​


В предоставленных источниках нет сведений о публичном эксплойте, PoC или подтверждённой эксплуатации CVE-2026-90012.

Исправление доступно в стабильных ветках Linux kernel через коммиты ядра. Механика уязвимости полностью раскрывается в описании и диффах исправлений: сбой возникает при частичном провале DMA-маппинга SPI и последующем освобождении маппингов с NULL или устаревшим устройством.

Отсутствие информации об эксплуатации не означает, что атака невозможна. Для оценки актуальности нужно проверить наличие SPI-устройств с DMA в целевой системе и версию ядра.

Признаки эксплуатации​


Специфичных индикаторов компрометации для CVE-2026-90012 в предоставленных источниках нет.

Общие точки контроля, неспецифичные для этой уязвимости:

  • Oops или panic в ядре: наличие строк BUG, NULL pointer dereference или DMA в /var/log/kern.log, dmesg или системном журнале.
  • Неожиданное завершение SPI-устройств: ошибки драйверов SPI, повторные сбои при инициализации периферии.
  • Аномальная нагрузка на SPI-контроллеры: повышенное количество ошибок DMA в dmesg или специфичных логах драйвера.
  • Падение ядра после работы с периферией: если краш происходит сразу после операций с SPI-устройствами, это может указывать на сбой маппинга.

Эти признаки не подтверждают эксплуатацию CVE-2026-90012 и требуют сопоставления с версией ядра и конфигурацией системы.

Как обнаружить атаку​


Для обнаружения проблемы нужно проверить версию ядра и наличие SPI-устройств с DMA.

Команды проверки:

Bash:
uname -r
uname -a
cat /proc/version

Дополнительные шаги:

  • Проверить список SPI-устройств: ls /sys/bus/spi/devices/.
  • Проверить наличие DMA в устройстве: cat /sys/bus/spi/devices/<device>/num_fifos или аналогичные параметры драйвера, если они доступны.
  • Мониторить dmesg | grep -i 'spi\|dma\|oops' после операций с периферией.
  • Проверить наличие исправлений в дистрибутиве: сравнить версию ядра с известными стабильными релизами, содержащими коммиты 367cea239fc93094e5c16a72724800e0358f5c46 и последующие.

Если SPI-устройства не используются или DMA для SPI отключён, риск снижается. Точное подтверждение актуальности требует анализа конкретного дистрибутива.

Как проверить свою версию​


Проверка версии ядра:

Bash:
uname -r
uname -a
cat /proc/version

Проверка наличия SPI-устройств:

Bash:
ls /sys/bus/spi/devices/

Проверка ошибок в логах:

Bash:
dmesg | grep -i 'spi\|dma\|oops'
journalctl -k | grep -i 'spi\|dma\|oops'

Если используется дистрибутив с пакетным управлением, можно проверить версию ядра через менеджер пакетов:

Bash:
dpkg -l linux-image-*  # Debian/Ubuntu
rpm -qa | grep kernel   # RHEL/CentOS/Fedora

Замените <имя-пакета> на фактическое имя пакета ядра в вашей системе, если команда не выдаёт нужного результата.

Исправление​


Основное исправление — обновление Linux kernel до версии, содержащей коммиты с идентификаторами 367cea239fc93094e5c16a72724800e0358f5c46, 5def8b6aaad44603740786262b95b6f77df52a1c, a38051fa2ddedbc8ec15292c55e276880ec5b9a4 и cc8354213ad6bd5fb8cc05a3fa3701188d086626.

  • Для дистрибутивов: установить актуальный пакет ядра из официального репозитория.
  • Для stable-веток: применить патч или обновить до релиза, где исправление уже включено.
  • Для кастомных сборок: проверить наличие исправления в исходниках через git log --oneline | grep 367cea239fc9.

Патчи доступны по ссылкам:


Временные меры защиты​


Временные меры снижения риска:

  • Отключить SPI-устройства с DMA, если они не критичны для работы системы.
  • Ограничить доступ к SPI-периферии на уровне конфигурации ядра или модулей, если это возможно.
  • Мониторить dmesg и системные логи на наличие oops после операций с SPI-устройствами.
  • Перенести критичные SPI-нагрузки на системы с обновлённым ядром до применения патча.

Эти меры не устраняют уязвимость, но снижают вероятность срабатывания при обработке SPI-передач. Если SPI-устройства используются постоянно, временное отключение может быть невозможно — в этом случае приоритет отдаётся обновлению ядра.

Как проверить устранение уязвимости​


После обновления ядра нужно проверить:

  1. Версию ядра: uname -r.
  2. Наличие исправлений в исходниках: git log --oneline | grep 367cea239fc9.
  3. Отсутствие ошибок SPI/DMA в логах после операций с периферией: dmesg | grep -i 'spi\|dma'.
  4. Функциональность SPI-устройств: убедиться, что передачи завершаются без oops или panic.

Если дистрибутив предоставляет список исправленных CVE через пакетный менеджер, можно проверить наличие CVE-2026-90012 в списке обновлений:

Bash:
dpkg -l | grep linux-image  # Debian/Ubuntu
rpm -qa | grep kernel        # RHEL/CentOS/Fedora

Замените <имя-пакета> на фактическое имя пакета ядра, если команда не выдаёт нужного результата.

Вывод​


CVE-2026-90012 — критическая уязвимость Linux kernel в подсистеме SPI, связанная с потерей контроля над DMA-маппингами при частичном сбое. Проблема приводит к обращению по NULL внутри dma_unmap_sg_attrs() и oops в ядре.

Риск актуален для систем с активными SPI-устройствами и DMA. Исправление доступно в стабильных ветках ядра через коммиты с идентификаторами 367cea239fc9fc93094e5c16a72724800e0358f5c46 и последующие.

Приоритет — обновление ядра до версии, содержащей исправление. Если SPI-устройства не используются или DMA отключён, риск минимален. При активном использовании SPI с DMA нужно проверить версию ядра и наличие ошибок в логах после обновления.

Официальные источники​


  1. NVD — CVE-2026-90012
  2. FIRST EPSS — CVE-2026-90012
  3. spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
  4. spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
  5. spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
  6. spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
  7. CVEs — The Linux Kernel documentation

История обновлений статьи​


  • 21.09.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ