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-устройства используются постоянно, временное отключение может быть невозможно — в этом случае приоритет отдаётся обновлению ядра.
Как проверить устранение уязвимости
После обновления ядра нужно проверить:
- Версию ядра:
uname -r.
- Наличие исправлений в исходниках:
git log --oneline | grep 367cea239fc9.
- Отсутствие ошибок SPI/DMA в логах после операций с периферией:
dmesg | grep -i 'spi\|dma'.
- Функциональность 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 нужно проверить версию ядра и наличие ошибок в логах после обновления.
Официальные источники
- NVD — CVE-2026-90012
- FIRST EPSS — CVE-2026-90012
- spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
- spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
- spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
- spi: Fix DMA mapping ownership on partial map failure - kernel/git/stable/linux.git - Linux kernel stable tree
- CVEs — The Linux Kernel documentation
История обновлений статьи
- 21.09.2026 — Опубликована первая версия материала.
