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.Исправление
Основное исправление — обновление ядра до версии, содержащей патч из коммитов:
- 961e2a17c5e3559b3f8654d2daabdd25a42e770a
- 1a3670b6a6b5679fe56c5890157b344f091e64f8
- 4a17c73c83798c2fa9c7920ad5a98803adce3e01
- 8b2fd5c0aeda935294159206af9d6179282d425a
Патч добавляет проверку результата вызова
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-адреса аппаратному устройству. Уязвимость может быть использована для повреждения данных или более серьёзных последствий, если устройство использует нулевой адрес как реальный указатель на память.
Исправление доступно в патче ядра, который добавляет проверку результата выделения памяти и вызывает глобальный сброс при ошибке. Для защиты системы необходимо обновить ядро до версии, содержащей этот патч.
В предоставленных источниках нет подтверждения активной эксплуатации или публичного эксплойта. Однако риск остаётся высоким из-за возможности удалённого воздействия без привилегий и взаимодействия пользователя.
Официальные источники
- NVD — CVE-2026-97573
- FIRST EPSS — CVE-2026-97573
- bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
- bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
- bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
- bnxt_en: Handle buffer allocation failure in bnxt_rx_ring_reset() - kernel/git/stable/linux.git - Linux kernel stable tree
- CVEs — The Linux Kernel documentation
История обновлений статьи
- 27.09.2026 — Опубликована первая версия материала.
