CVE-2026-74746 в Linux Kernel: use-after-free в netfilter flowtable

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

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


В подсистеме netfilter flowtable ядра Linux обнаружена уязвимость, приводящая к обращению к освобожденной памяти. Ошибка возникает из-за неправильного порядка публикации узлов в rhashtable, что позволяет сборщику мусора освободить память до завершения установки потока. В материале разобран механизм атаки, затронутые версии и порядок применения исправлений.

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


Уязвимость представляет собой гонку состояний (race condition) в ядре Linux, которая приводит к обращению к освобожденной памяти (use-after-free). Это может вызвать падение ядра или выполнение кода с привилегиями root.

  • Тип ошибки: Use-after-free (CWE-416) в подсистеме netfilter.
  • CVSS 3.1: 9.8 (CRITICAL). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.
  • Условия атаки: Сетевой доступ, низкая сложность, отсутствие необходимости в привилегиях или взаимодействии пользователя.
  • Эксплуатация: Публичный PoC отсутствует, но техническое описание и патч доступны.
  • EPSS: 0,54% (процентиль 43,35%).

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


Уязвимость затрагивает подсистему netfilter flowtable в ядре Linux. Ошибка была введена в коммите ac2a66665e23 ("netfilter: add generic flow table infrastructure") и присутствует в версиях, содержащих этот код.

Исправление было опубликовано в stable-ветках ядра. Ниже приведены идентификаторы коммитов, содержащих патч для различных веток:

  • 0a00254585827f1695aa2700114af622ea754cfa
  • 2014ac62df9d45bb9a004a043e85df7be09ed780
  • 211ee5d998d92a7d548811939c65942d06c146e4
  • 972fdf7c4f5c282a239c88fea614b056c33dc025
  • be345dcbddb4643a54252b954af974b16eda8f91
  • d16b71231e65cb05daea2b45701fcf09cef041e7
  • d37917e7bebe078f3c17e47fd6fc1c9f6e8497b2
  • d9d3050a70efe217e73a0751e55fdae6a7092620

Точные номера версий пакетов для конкретных дистрибутивов (Debian, Ubuntu, RHEL и др.) необходимо проверять в официальных базах безопасности вашего поставщика.

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


Причина уязвимости кроется в логике функции flow_offload_add() в файле net/netfilter/nf_flow_table_core.c. При добавлении нового потока в таблицу flowtable ядро должно вставить два узла в хеш-таблицу rhashtable: один для исходного направления (original) и один для ответного (reply).

Функция nf_flow_table_iterate(), используемая сборщиком мусора (GC), рассматривает только узлы исходного направления как «владеющие» записью. Если узел исходного направления публикуется в хеш-таблицу первым, GC может обнаружить его и освободить память потока, пока flow_offload_add() еще не закончил вставку узла ответного направления. Это приводит к ситуации, когда указатель на освобожденную память остается в структуре, и последующее обращение к ней вызывает use-after-free.

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


Атакующий может инициировать сетевой трафик, который заставляет ядро создавать новые записи в flowtable. В момент, когда flow_offload_add() вставляет первый узел (original), возникает временное окно, в котором запись видна для GC, но еще не полностью установлена.

Если в этот момент сработает сборка мусора (например, по таймауту или из-за давления на память), память потока будет освобождена. Однако функция flow_offload_add() продолжает выполнение и пытается вставить второй узел (reply) или обращаться к уже освобожденной структуре. Это приводит к записи в освобожденную память (slab-use-after-free write) или чтению из нее (slab-use-after-free read).

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

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


Для успешной эксплуатации уязвимости атакующему необходимо:

  • Сетевой доступ: Возможность отправлять пакеты на уязвимый хост, чтобы инициировать создание записей в flowtable.
  • Активная подсистема netfilter flowtable: Функциональность flow offload должна быть включена в ядре.
  • Точное попадание в гонку: Атакующему нужно синхронизировать момент создания потока с запуском сборщика мусора. Это требует точного тайминга, но не требует привилегий или взаимодействия пользователя.

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


Сценарий атаки начинается с отправки атакующим пакета, который соответствует правилам netfilter и должен быть добавлен в flowtable. Ядро начинает выполнение flow_offload_add().

В этот момент атакующий может создать нагрузку или использовать специфические паттерны трафика, чтобы спровоцировать запуск GC. Когда GC находит только что опубликованный узел original, он освобождает память потока. Функция flow_offload_add() продолжает работу и обращается к освобожденной памяти при вставке узла reply.

Если атакующий заранее «захватил» освобожденную память (через heap spraying или другие техники), он может контролировать данные, которые ядро записывает или читает. Это может привести к перезаписи критических структур ядра и получению привилегий root.

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


На момент публикации CVE-2026-74746 публичный эксплойт (PoC) в открытом доступе не зафиксирован. Однако техническое описание уязвимости и патч доступны в репозитории ядра Linux.

Отсутствие публичного PoC не означает, что уязвимость не может быть эксплуатирована. Учитывая критический уровень CVSS и простоту сетевой атаки, вероятность разработки эксплойта высока. Рекомендуется относиться к этой уязвимости как к активно эксплуатируемой.

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


Специфичные индикаторы компрометации (IOC) для CVE-2026-74746 не опубликованы. Однако можно использовать общие признаки аномальной активности в ядре:

  • Сегфолты ядра (Kernel Panics): Частые падения системы с сообщениями об ошибках в rhashtable, flow_offload или netfilter.
  • Аномальные сетевые паттерны: Потоки, которые вызывают создание множества записей в flowtable, особенно если они совпадают по времени с пиками нагрузки на память.
  • KASAN отчеты: Если ядро собрано с KASAN, в логах могут появляться отчеты о slab-use-after-free в функциях flow_offload_del, flow_offload_lookup и rht_deferred_worker.

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


Для обнаружения атаки или эксплуатации уязвимости рекомендуется:

  • Мониторинг логов ядра: Отслеживать сообщения об ошибках в подсистеме netfilter, особенно связанные с flowtable и rhashtable.
  • Использование eBPF: Развернуть eBPF-агенты для мониторинга вызовов flow_offload_add и nf_flow_table_iterate на предмет аномального поведения.
  • Анализ сетевых потоков: Идентифицировать источники трафика, которые генерируют аномальное количество новых потоков, особенно если они не соответствуют легитимной нагрузке.
  • Проверка целостности ядра: Использовать инструменты для проверки целостности модулей ядра и выявления несанкционированных изменений.

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


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

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

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

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


Единственный надежный способ устранения уязвимости — обновление ядра Linux до версии, содержащей исправление.

  • Обновите ядро: Установите последнюю доступную версию ядра из репозитория вашего дистрибутива.
  • Перезагрузите систему: После обновления ядра требуется перезагрузка для применения изменений.
  • Проверьте патчи: Убедитесь, что в вашем ядре присутствуют коммиты, перечисленные в разделе «Какие продукты и версии затронуты».

Не откладывайте обновление, так как уязвимость имеет критический уровень и может быть эксплуатирована удаленно.

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


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

  • Отключение flow offload: Если возможно, отключите функциональность flow offload в netfilter. Это снизит вероятность срабатывания уязвимости, но может ухудшить производительность сети.
  • Ограничение трафика: Ограничьте входящий трафик, который может вызывать создание новых записей в flowtable, если это не нарушает бизнес-процессы.
  • Мониторинг: Усиленный мониторинг логов ядра и сетевой активности для раннего обнаружения аномалий.

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

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


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

  1. Проверьте версию ядра: uname -r.
  2. Убедитесь, что версия соответствует исправленной.
  3. Проверьте логи загрузки ядра на наличие ошибок.
  4. Проведите функциональное тестирование сетевых сервисов, чтобы убедиться, что flow offload работает корректно.

Если после обновления система стабильна и ошибки в логах отсутствуют, уязвимость устранена.

Вывод​


CVE-2026-74746 — критическая уязвимость в Linux Kernel, требующая немедленного внимания. Ошибка в netfilter flowtable может привести к удаленному выполнению кода с привилегиями root.

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

Администраторы должны проверить свои системы и применить обновления в кратчайшие сроки.

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


  1. NVD — CVE-2026-74746
  2. FIRST EPSS — CVE-2026-74746
  3. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  4. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  5. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  6. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  7. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  8. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  9. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree
  10. netfilter: flowtable: publish GC-visible tuple last - kernel/git/stable/linux.git - Linux kernel stable tree

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


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