CVE-2026-97573 в Linux Kernel: bnxt_en, нулевой DMA и сбой выделения памяти

CVE: CVE-2026-97573
Продукт: Linux Kernel
Дата публикации: 25.09.2026
Критичность: HIGH
CVSS: 8.1 (3.1)
EPSS: 0,53%; процентиль 42,47%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


Уязвимость CVE-2026-97573 затрагивает драйвер сетевой карты Broadcom bnxt_en в ядре Linux. При неудаче выделения памяти в функции bnxt_rx_ring_reset() ошибка не передаётся выше по стеку, и код продолжает работу с частично неинициализированным массивом rx_tpa[]. В результате устройство может получить нулевой DMA-адрес при обработке входящих пакетов.

Это нарушает границу доверия между ядром и аппаратным устройством: драйвер считает память выделенной, хотя фактически она отсутствует.

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


Риск связан с передачей невалидного DMA-адреса в сетевое устройство Broadcom bnxt_en при сбое выделения памяти во время сброса RX-колец. Ошибка возникает в драйвере ядра и может приводить к повреждению данных, потере работоспособности интерфейса или более серьёрным последствиям для системы.

  • Тип ошибки: нарушение обработки ошибок при выделении памяти в сетевом драйвере; неинициализированные элементы массива передаются в аппаратное устройство как DMA-адреса.
  • CVSS v3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H — оценка 8.1, severity HIGH. Вектор предполагает удалённое воздействие без необходимости привилегий и взаимодействия пользователя.
  • Условие атаки: требуется работа драйвера bnxt_en на системе с аппаратной сетевой картой Broadcom и возможность вызвать сброс RX-колец или спровоцировать сбой выделения памяти во время этого процесса.
  • Факт эксплуатации: в предоставленных источниках нет подтверждения активной эксплуатации. Есть только описание уязвимости, патч и ссылки на коммиты ядра.
  • EPSS: 0,53% (процентиль 42,47%). Показатель указывает умеренную вероятность использования в реальных атаках по данным FIRST EPSS.

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


Затронут драйвер bnxt_en в Linux Kernel. Конкретные версии ядра и дистрибутивы не перечислены в предоставленных источниках.

  • Компонент: drivers/net/ethernet/broadcom/bnxt/bnxt.c, функции bnxt_rx_ring_reset(), bnxt_alloc_one_rx_ring(), bnxt_alloc_one_tpa_info_data().
  • Аппаратная часть: сетевые контроллеры Broadcom, поддерживаемые драйвером bnxt_en.
  • Условие наличия уязвимости: ядро содержит код из коммита 8fbf58e17dce («bnxt_en: Implement RX ring reset in response to buffer errors.»), но не содержит исправление из патча с заголовком «bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset()».
  • Исправляющие коммиты:

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


Функция bnxt_rx_ring_reset() освобождает буферы RX-колец, затем вызывает bnxt_alloc_one_rx_ring() для их повторного выделения. Результат вызова игнорируется: код не проверяет возвращённое значение.

Внутри bnxt_alloc_one_rx_ring() вызывается bnxt_alloc_one_tpa_info_data(). При первом неудачном выделении памяти эта функция возвращает -ENOMEM и обнуляет оставшиеся элементы массива rxr->rx_tpa[]. Ошибка не поднимается выше, поэтому цикл в bnxt_rx_ring_reset() завершается, а код на его выходе повторно включает TPA.

Аппаратное устройство использует массив rxr->rx_tpa[] для маппинга идентификаторов агрегатов из железа (agg_id) на программные индексы. Если выбран неинициализированный слот, устройство получает нулевой DMA-адрес. Это нарушает контракт между драйвером и устройством: драйвер полагается на наличие валидных адресов памяти, хотя фактически они отсутствуют.

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


Атака строится на том, что драйвер bnxt_en передаёт в аппаратное устройство невалидный DMA-адрес. Устройство может использовать этот адрес для записи или чтения памяти вне ожидаемого буфера.

Путь данных начинается с сетевого трафика. При обработке входящих пакетов или сбросе RX-колец драйвер вызывает bnxt_rx_ring_reset(). Если в этот момент выделение памяти для TPA-информации завершается ошибкой, массив rx_tpa[] остаётся частично нулевым.

Далее код включает TPA без проверки. Когда устройство генерирует событие с определённым agg_id, драйвер ищет соответствующий программный индекс в rxr->rx_tpa[]. Если попадает на нулевой элемент, DMA-адрес становится 0. Устройство получает указатель на адрес 0.

Последствия зависят от реализации аппаратной части и того, как устройство обрабатывает нулевой адрес. Возможны повреждение данных, сбой обработки пакетов или обращение к памяти вне ожидаемого диапазона. В предоставленных источниках нет описания конкретного поведения устройства при обращении по нулевому адресу.

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


Для успешной эксплуатации нужны следующие условия:

  • Аппарат: система должна использовать сетевую карту Broadcom с драйвером bnxt_en.
  • Ядро: ядро должно содержать уязвимый код из коммита 8fbf58e17dce и не содержать исправляющий патч.
  • Состояние памяти: должно произойти сбой выделения памяти в bnxt_alloc_one_tpa_info_data() во время сброса RX-колец.
  • Трафик или событие: устройство должно генерировать события, которые вызывают маппинг agg_id на индекс в массиве rx_tpa[], включая неинициализированный слот.
  • Отсутствие проверки: драйвер должен повторное включение TPA без проверки результата выделения памяти.

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


Сценарий начинается с работы сетевого интерфейса, использующего bnxt_en. В ядре происходит сброс RX-колец, например при ошибке буферизации или по внутреннему событию драйвера.

Во время сброса функция bnxt_rx_ring_reset() освобождает старые буферы и пытается выделить новые. Выделение завершается с ошибкой -ENOMEM. Ошибка не обрабатывается, и цикл продолжается.

По окончании цикла код включает TPA. Массив rx_tpa[] содержит нулевые элементы. Устройство начинает получать события с определёнными agg_id. При маппинге выбран нулевой элемент массива, и устройство получает DMA-адрес 0.

Дальнейшее поведение зависит от реализации устройства. Если устройство использует адрес 0 как реальный указатель, оно может читать или записывать память вне ожидаемого буфера. Это может привести к повреждению данных ядра или сетевых пакетов.

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


В предоставленных источниках нет публичного эксплойта в виде готового кода или рабочего payload. Есть только описание уязвимости, патч и ссылки на коммиты ядра.

  • PoC: не подтверждён в источниках.
  • Техническое описание: доступно: ошибка обработки -ENOMEM в bnxt_alloc_one_rx_ring() приводит к передаче нулевого DMA-адреса устройству.
  • Подтверждённая эксплуатация: нет. В источниках нет данных о реальных атаках или компрометациях.
  • Патч: доступен в коммитах ядра, ссылки приведены в разделе «Какие продукты и версии затронуты».

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


Специфичных IOC для CVE-2026-97573 в предоставленных источниках нет. Ниже приведены неспецифичные точки контроля, которые можно использовать при подозрении на атаки через сетевые драйверы:

  • Аномальные ошибки в ядре: сообщения netdev_warn с текстом «RX ring reset failed to allocate buffers» или другие предупреждения о сбоях выделения памяти в сетевых драйверах.
  • Сбои сетевого интерфейса: потеря пакетов, задержки, повторные сбросы RX-колец, рост счётчиков ошибок в ethtool -S или /proc/net/dev.
  • Необычная активность устройства: обращение к памяти вне ожидаемого диапазона, если доступно через debug-инструменты ядра.
  • Изменения конфигурации: отключение или включение TPA без соответствующих действий администратора.
  • Системные сбои: падение системы, ошибки DMA в журналах ядра, сообщения о невалидных адресах памяти.

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


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

  • Мониторинг журналов ядра: ищите сообщения netdev_warn с текстом «RX ring reset failed to allocate buffers» или другие предупреждения о сбоях в драйвере bnxt_en.
  • Анализ счётчиков сетевых ошибок: используйте ethtool -S <interface> для отслеживания счётчиков ошибок, сбросов колец и DMA.
  • Проверка конфигурации TPA: убедитесь, что TPA включена только при наличии валидных буферов. В уязвимой версии драйвера это не проверяется.
  • Мониторинг памяти устройства: если доступно через debug-инструменты ядра, отслеживайте обращения к памяти вне ожидаемого диапазона.
  • Анализ сетевого трафика: ищите аномальные паттерны, которые могут вызывать частые сбросы RX-колец или сбои выделения памяти.

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


Проверьте версию ядра с помощью следующих команд:

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

Для проверки наличия исправления можно использовать git log в исходниках ядра или проверить наличие коммитов из списка исправляющих патчей. Если вы используете дистрибутив, проверьте пакет ядра через менеджер пакетов:

Bash:
rpm -q kernel
apt list --installed | grep linux-image

Замените <имя-пакета> на фактическое имя пакета ядра в вашем дистрибутиве. Например, для Debian это linux-image, для RHEL — kernel.

Если вы не уверены в версии, используйте uname -r и сверьте её с официальными списками поддерживаемых версий Linux Kernel.

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


Основное исправление — обновление ядра до версии, содержащей патч из коммитов:


Патч добавляет проверку результата вызова bnxt_alloc_one_rx_ring(). При ошибке драйвер вызывает глобальный сброс (bnxt_reset_task) и возвращает управление.

Для дистрибутивов используйте официальные обновления ядра. Если вы используете кастомное ядро, примените патч вручную или обновите исходники до версии, содержащей исправление.

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


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

  • Отключить TPA: если драйвер позволяет отключить TPA через модульные параметры или системные настройки, сделайте это. Это предотвратит передачу нулевого DMA-адреса устройству.
  • Ограничить сетевой трафик: уменьшите нагрузку на сетевое устройство, чтобы снизить вероятность сбоев выделения памяти во время сброса RX-колец.
  • Мониторинг ошибок: усиленный мониторинг журналов ядра и счётчиков сетевых ошибок поможет обнаружить аномалии до того, как они приведут к серьёзным последствиям.
  • Изоляция системы: если система критична, изолируйте её от сети или ограничьте доступ к ней до применения патча.

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


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

  • Версию ядра: убедитесь, что версия содержит исправление. Используйте uname -r и сверьте с официальными списками.
  • Наличие патча: если вы используете кастомное ядро, проверьте наличие коммитов из списка исправляющих патчей с помощью git log --all | grep 961e2a17c5e3559b3f8654d2daabdd25a42e770a.
  • Отсутствие ошибок: убедитесь, что в журналах ядра нет сообщений «RX ring reset failed to allocate buffers» или других предупреждений о сбоях в драйвере bnxt_en.
  • Работоспособность сетевого интерфейса: проверьте, что сетевой интерфейс работает корректно и не имеет аномальных счётчиков ошибок.

Вывод​


CVE-2026-97573 — это ошибка обработки ошибок в драйвере bnxt_en, которая приводит к передаче нулевого DMA-адреса аппаратному устройству. Уязвимость может быть использована для повреждения данных или более серьёзных последствий, если устройство использует нулевой адрес как реальный указатель на память.

Исправление доступно в патче ядра, который добавляет проверку результата выделения памяти и вызывает глобальный сброс при ошибке. Для защиты системы необходимо обновить ядро до версии, содержащей этот патч.

В предоставленных источниках нет подтверждения активной эксплуатации или публичного эксплойта. Однако риск остаётся высоким из-за возможности удалённого воздействия без привилегий и взаимодействия пользователя.

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


  1. NVD — CVE-2026-97573
  2. FIRST EPSS — CVE-2026-97573
  3. bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
  4. bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
  5. bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
  6. bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
  7. CVEs — The Linux Kernel documentation

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


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