CVE-2026-64577 в Linux Kernel: паника ядра при обработке GTP-эхо-запросов

CVE: CVE-2026-64577
Продукт: Linux Kernel
Дата публикации: 05.08.2026
Критичность: HIGH
CVSS: 7.5 (3.1)
EPSS: 0,58%; процентиль 44,98%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


В драйвере GTP ядра Linux обнаружена уязвимость, позволяющая удалённому атакующему вызвать панику ядра. Ошибка возникает из-за игнорирования результата функции skb_pull_data() при формировании ответа на эхо-запрос GTPv1-U. Статья разбирает механику нарушения инвариантов буфера sk_buff, условия срабатывания и способы проверки актуальности системы.

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


Риск представляет собой отказ в обслуживании (DoS) на уровне ядра. Удалённый пользователь может принудительно завершить работу системы, направив один некорректный пакет. Механизм срабатывания — нарушение целостности буфера skb, что приводит к срабатыванию защиты skb_under_panic и последующей панике ядра.

  • Тип ошибки: Непроверенный возврат функции skb_pull_data() в drivers/net/gtp.c.
  • CVSS 3.1: 7.5 (HIGH). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.
  • Условия атаки: Сетевой вектор (AV:N), низкая сложность (AC:L), привилегии не требуются (PR:N).
  • Влияние: Только на доступность (A:H). Конфиденциальность и целостность не затрагиваются.
  • EPSS: 0,58% (процентиль 44,98%). Вероятность эксплуатации в ближайшие 30 дней оценивается как низкая.
  • Статус: Исправление внесено в ветки stable и mainline.

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


Уязвимость затрагивает ядра Linux, в которых включён модуль GTP (GPRS Tunnelling Protocol). Точный список версий, требующих обновления, зависит от конкретного дистрибутива и его политики поддержки.

  • Ядро Linux: Ветки, содержащие код gtp1u_send_echo_resp() без проверки возврата skb_pull_data().
  • Дистрибутивы: Все системы, использующие ядра, в которые не портирован патч cd170f051dba9ac146fabcd1b91726487c0cb9fa.

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

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


Причина ошибки кроется в логике обработки заголовков в функции gtp1u_send_echo_resp(). Функция вызывает skb_pull_data(), чтобы «вытащить» (сдвинуть указатель skb->data) 20 байт данных (заголовок GTPv1-U и UDP).

Проблема в том, что вызывающая функция gtp1u_udp_encap_recv() гарантирует наличие в буфере только 16 байт (базовый заголовок GTP + UDP). Если входящий пакет содержит от 16 до 19 байт полезной нагрузки, skb_pull_data() не может сдвинуть указатель на 20 байт, возвращает NULL, но skb->data при этом не изменяется.

Код игнорирует этот возврат и продолжает выполнение. Последующие вызовы skb_push() и добавление IP-заголовка функцией iptunnel_xmit() сдвигают skb->data ниже границы skb->head, что нарушает инварианты структуры sk_buff и вызывает панику ядра.

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


Атака реализуется через отправку UDP-пакета на порт, обслуживаемый GTP-интерфейсом. Пакет должен иметь структуру, имитирующую эхо-запрос GTPv1-U, но с урезанной полезной нагрузкой.

  • Приём пакета: Ядро принимает UDP-пакет и передаёт его в обработчик GTP.
  • Проверка заголовка: Функция gtp1u_udp_encap_recv() проверяет наличие 16 байт заголовка. Для коротких пакетов (16-19 байт) это условие выполняется.
  • Сбой сдвига: Вызывается gtp1u_send_echo_resp(), которая пытается сдвинуть указатель на 20 байт. Из-за нехватки данных функция возвращает NULL, но сдвиг не происходит.
  • Нарушение памяти: Код продолжает выполнение, вызывая skb_push() для формирования ответа. Это, в сочетании с добавлением IP-заголовка, выводит указатель skb->data за пределы допустимой области буфера.
  • Паника: Срабатывает проверка skb_under_panic(), что приводит к kernel BUG и остановке системы.

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


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

  • Доступ к сети: Атакующий должен иметь сетевой доступ к целевому хосту.
  • Активный GTP-интерфейс: На целевой системе должен быть настроен и активен интерфейс GTP (например, gtp0).
  • Открытый порт: UDP-порт, на котором слушает GTP-демон (по умолчанию 2152), должен быть доступен извне.
  • Отсутствие фильтрации: Межсетевой экран или правила iptables не должны блокировать UDP-трафик на соответствующий порт.

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


Атакующий сканирует сеть в поисках хостов с открытым UDP-портом 2152. Обнаружив целевой сервер, он формирует UDP-пакет с заголовком GTPv1-U, который выглядит как эхо-запрос, но имеет длину полезной нагрузки 16-19 байт.

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

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


Публичный эксплойт в виде готового скрипта или PoC в источниках не указан. Однако механика атаки полностью описана в коммите исправления, что позволяет легко сформировать пакет для проверки. Эксплуатация в реальных атаках не подтверждена, но технически она тривиальна для атакующего с сетевым доступом.

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


Специфичных IOC (индикаторов компрометации) для этой уязвимости нет, так как она приводит к немедленной остановке системы. Общие признаки, которые могут указывать на попытку атаки:

  • Логи ядра: Записи о kernel panic или skb_under_panic в dmesg или системных журналах.
  • Сетевые логи: Потоки UDP-трафика на порт 2152 с аномально короткими пакетами.
  • Мониторинг: Внезапные перезагрузки или зависания серверов, работающих с GTP.

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


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

  • Анализ логов ядра: Поиск строк skb_under_panic или kernel BUG at net/core/skbuff.c.
  • Сетевой мониторинг: Настройка правил в IDS/IPS для детектирования UDP-пакетов с заголовком GTPv1-U, длина полезной нагрузки которых находится в диапазоне 16-19 байт.
  • Мониторинг доступности: Наблюдение за внезапными сбоями доступности GTP-инфраструктуры.

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


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

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

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

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


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

  • Дистрибутивы: Установите последние обновления безопасности через пакетный менеджер (apt, yum, dnf и т.д.).
  • Сборка из исходников: Пересоберите ядро с включением патча cd170f051dba9ac146fabcd1b91726487c0cb9fa.
  • Перезагрузка: После обновления ядра выполните перезагрузку системы для применения изменений.

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


До применения обновления можно временно снизить риск:

  • Отключение GTP: Если функциональность GTP не требуется, отключите модуль gtp или удалите GTP-интерфейсы.
  • Фильтрация трафика: Настройте правила iptables или межсетевого экрана для блокировки UDP-трафика на порт 2152 от недоверенных источников.
  • Изоляция: Разместите GTP-инфраструктуру в выделенной сети с ограниченным доступом.

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


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

Bash:
uname -r

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

Вывод​


CVE-2026-64577 представляет собой уязвимость с высоким уровнем риска для систем, использующих GTP. Механизм атаки прост и не требует привилегий, что делает её опасной для инфраструктуры, открытой в интернет.

Администраторам необходимо срочно обновить ядро или применить временные меры защиты. Мониторинг логов ядра поможет выявить попытки эксплуатации.

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


  1. NVD — CVE-2026-64577
  2. FIRST EPSS — CVE-2026-64577
  3. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  4. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  5. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  6. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  7. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  8. gtp: check skb_pull_data() return in gtp1u_send_echo_resp() - kernel/git/stable/linux.git - Linux kernel stable tree
  9. CVEs — The Linux Kernel documentation

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


  • 10.08.2026 — Опубликована первая версия материала.
  • 27.08.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
 
Последнее редактирование:
Назад
Верх Низ