CVE-2026-89783 в Linux Kernel: out-of-bounds write в xfrm6_input_addr()

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

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


В стеке IPv6 ядра Linux обнаружена ошибка out-of-bounds write в функции xfrm6_input_addr(). Дефект возникает при обработке пакетов IPsec в транспортном режиме, если цепочка безопасности (secpath) уже заполнена до предела.

Из-за некорректной проверки глубины атакующий может записать данные за пределы массива xvec. Это приводит к повреждению памяти, панике ядра или потенциальному выполнению кода. Уязвимость эксплуатируется удаленно без аутентификации.

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


Риск связан с нарушением целостности памяти в сетевом стеке ядра при обработке IPv6-трафика с IPsec. Ошибка позволяет удаленному отправителю пакетов повредить данные ядра, что ведет к отказу в обслуживании или эскалации привилегий.

  • Класс ошибки: Out-of-bounds write (запись за пределы границ массива).
  • 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.
  • Вектор атаки: Сеть (Network), сложность низкая, привилегии не требуются.
  • EPSS: 0,21% (процентиль 11,45%). Вероятность эксплуатации в ближайшие 30 дней оценивается как низкая.
  • Статус: Исправление внесено в mainline и стабильные ветки ядра.

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


Уязвимость затрагивает версии ядра Linux, в которых функция xfrm6_input_addr() содержит дефектную проверку глубины secpath. Исправление портировано в mainline и несколько стабильных веток.

  • Mainline: Коммит 5d9e3bf34fec9a5d237e4b7cef4a707bc2e091bc (принят 13.07.2026).
  • Stable-ветки: Портирование выполнено в коммитах 0f679e0523dd, 48996649222e, 5f35a29a5eed, 68e8737fe8e7, 8fe2c53fb81f, 91fc387f63c0, bdcda866c89f.

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

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


Причина дефекта — ошибка off-by-one в проверке глубины цепочки безопасности в net/ipv6/xfrm6_input.c. Исходное условие if (1 + sp->len == XFRM_MAX_DEPTH) не учитывает случай, когда sp->len уже равен максимальному значению (6).

В транспортном режиме IPsec функция xfrm_trans_reinject() возвращает пакет в IPv6-стек, сохраняя заполненный secpath. Если внутренний пакет содержит HAO или routing header типа 2, вызывается xfrm6_input_addr(). Проверка (1 + 6 == 6) возвращает false, и код выполняет запись sp->xvec[sp->len++].

Это приводит к записи в индекс 6 массива, размер которого 6 (допустимые индексы 0–5). Исправление заменяет условие на if (sp->len >= XFRM_MAX_DEPTH), что соответствует логике в xfrm_input() и предотвращает выход за границы.

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


Эксплуатация происходит в стеке IPv6 при обработке пакетов IPsec в транспортном режиме. Атакующий отправляет пакет, который проходит через xfrm_input(). Эта функция может завершить обработку с состоянием, где sp->len равен XFRM_MAX_DEPTH.

Далее xfrm_trans_reinject() возвращает пакет в IPv6-входной путь с сохраненным secpath. Если внутренний пакет содержит destination-options HAO или routing header типа 2, система вызывает xfrm6_input_addr(). Из-за дефекта проверка глубины не срабатывает, и функция выполняет запись указателя в sp->xvec[sp->len++].

Запись происходит за пределы массива xvec. Хотя данные остаются в пределах выделенной области sec_path (что делает сбой невидимым для KASAN), UBSAN_BOUNDS фиксирует нарушение. При включенном panic_on_warn это вызывает панику ядра.

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


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

  • Сетевой доступ: Возможность отправлять IPv6-пакеты на целевой хост.
  • Настройка IPsec: На цели должна быть активна обработка IPsec в транспортном режиме для IPv6.
  • Заполнение secpath: Пакет должен быть сформирован так, чтобы sp->len достиг XFRM_MAX_DEPTH до повторного входа в IPv6-стек.
  • Специфичные заголовки: Внутренний пакет должен содержать HAO или routing header типа 2 для инициирования вызова уязвимой функции.

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

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


Сценарий начинается с отправки IPv6-пакета, зашифрованного в транспортном режиме IPsec. Пакет проходит через xfrm_input(), где формируется цепочка безопасности, достигающая максимальной глубины. Функция xfrm_trans_reinject() возвращает пакет в IPv6-стек с сохраненным secpath.

При обработке внутреннего пакета, содержащего HAO или routing header, вызывается xfrm6_input_addr(). Из-за ошибки в проверке глубина функция не отбрасывает пакет, а выполняет запись за пределы массива xvec. Это приводит к повреждению памяти.

Последствия зависят от контекста: паника ядра (отказ в обслуживании) или, при контролируемом содержимом записи, выполнение кода в контексте ядра. Поскольку уязвимость находится в ядре, компрометация означает потерю целостности системы.

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


На момент публикации CVE-2026-89783 публичные данные о подтвержденной эксплуатации в реальных атаках отсутствуют. В каталоге CISA KEV уязвимость не значится.

Техническое описание атаки и патч доступны в репозитории ядра Linux. Это позволяет исследователям разработать Proof of Concept. Отсутствие сведений о массовой эксплуатации не означает невозможность создания эксплойта, учитывая простоту триггера и доступность исходного кода.

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


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

  • Паника ядра: Записи в dmesg или системных журналах, содержащие UBSAN: array-index-out-of-bounds in net/ipv6/xfrm6_input.c.
  • Аномальный трафик: Потоки IPv6-трафика с IPsec в транспортном режиме, содержащие опции HAO или routing header, направленные на хосты с включенным IPsec.
  • Сбой системы: Внезапные перезагрузки или зависания ядра, связанные с обработкой сетевого трафика.

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


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

  • Мониторинг логов ядра: Отслеживание сообщений UBSAN или KASAN, связанных с net/ipv6/xfrm6_input.c. При включенном panic_on_warn система может перезагрузиться, что также является индикатором.
  • Сетевой анализ: Использование IDS/IPS для детектирования IPv6-пакетов с IPsec в транспортном режиме, содержащих подозрительные опции HAO или routing header.
  • Проверка версии ядра: Регулярная сверка версии ядра с базой данных CVE для выявления уязвимых версий.

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

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


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

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

Полученную версию ядра необходимо сверить с официальными списками исправленных версий вашего дистрибутива. Если версия ядра старше коммитов, указанных в разделе «Какие продукты и версии затронуты», система уязвима. Для точной проверки рекомендуется использовать инструменты управления пакетами (например, apt, yum, dnf) для просмотра доступных обновлений ядра.

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


Единственным надежным способом устранения уязвимости является обновление ядра Linux до версии, содержащей исправление. Патч заменяет условие проверки глубины в xfrm6_input_addr() на sp->len >= XFRM_MAX_DEPTH.

  • Обновление ядра: Используйте штатные средства обновления вашего дистрибутива (например, apt upgrade, yum update, dnf update).
  • Перезагрузка: После обновления ядра требуется перезагрузка системы для применения нового ядра.
  • Проверка: После обновления убедитесь, что версия ядра соответствует исправленной, используя команды из раздела «Проверка версии».

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

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


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

  • Отключение IPsec в транспортном режиме: Если возможно, отключите обработку IPsec в транспортном режиме для IPv6 на уязвимых хостах.
  • Фильтрация трафика: На сетевом уровне (межсетевом экране или маршрутизаторе) блокируйте IPv6-пакеты с опциями HAO или routing header, если они не используются в легитимном трафике.
  • Ограничение доступа: Ограничьте доступ к хостам, использующим IPsec, только из доверенных сетей.

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

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


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

  1. Проверка версии ядра: Убедитесь, что система работает на обновленном ядре, используя uname -r.
  2. Проверка наличия патча: В некоторых дистрибутивах можно проверить наличие конкретного коммита в ядре, если это поддерживается инструментами аудита.
  3. Функциональное тестирование: Проведите тестирование обработки IPv6-трафика с IPsec, чтобы убедиться, что система работает корректно и не испытывает сбоев.
  4. Мониторинг: Продолжайте мониторинг логов ядра на предмет сообщений UBSAN или KASAN, связанных с xfrm6_input.c.

Если после обновления система стабильна и не фиксирует ошибок памяти, уязвимость считается устраненной.

Вывод​


CVE-2026-89783 представляет собой критическую уязвимость в ядре Linux, связанную с out-of-bounds write в модуле xfrm6. Атака возможна удаленно и может привести к отказу в обслуживании или выполнению кода.

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

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


  1. NVD — CVE-2026-89783
  2. FIRST EPSS — CVE-2026-89783
  3. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  4. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  5. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  6. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  7. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  8. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  9. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree
  10. xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full - kernel/git/stable/linux.git - Linux kernel stable tree

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


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