CVE-2026-98096 в Linux Kernel: отрицательный offset в IPv6 SRH и последствия для маршрутизации

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

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


Linux Kernel CVE-2026-98096 связан с обработкой Segment Routing Header в IPv6. Функция ipv6_srh_rcv() восстанавливала позицию skb->data фиксированным push sizeof(struct ipv6hdr), не учитывая случай, когда перед SRH стоит другой extension header.

Из-за этого skb_network_offset() оставался отрицательным и передавался дальше как длина в маршрутизации, flow dissection, fragmentации или соседней выдаче. Обновление заменяет фиксировый push на -skb_network_offset(skb) и pull skb_transport_offset(skb), возвращая корректный offset до 0 для route lookup и downstream forwarding.

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


Риск возникает в ядре Linux при обработке IPv6-пакетов с Segment Routing Header, если перед SRH находится другой extension header. Ошибка приводит к передаче отрицательного network offset как положительной длины в нижних слоях сети.

  • CVSS: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H — высокий уровень воздействия на целостность и доступность без необходимости привилегий.
  • Severity: HIGH.
  • EPSS: 0,45% (сырой показатель 0.00449).
  • Процентиль EPSS: 36,59%.
  • Статус CVE: Received.
  • Дата публикации: 25.09.2026.

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


Затронут Linux Kernel с подсистемой IPv6 Segment Routing Header. Исправление входит в stable-ветки через commits:


Пакетные версии дистрибутивов в переданном пакете не раскрыты.

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


ipv6_srh_rcv() работает с skb->data, указывающим на Segment Routing Header, тогда как skb_network_header() указывает на IPv6 header. При segments_left > 0 код восстанавливал позицию данных через push sizeof(struct ipv6hdr), предполагая, что SRH сразу следует за фиксированным IPv6 header.

Если перед SRH стоит другой extension header, например Hop-by-Hop options header, offset между сетевым заголовком и текущей позицией данных становится отрицательным. Фиксировый push не компенсирует этот сдвиг, поэтому skb_network_offset() остаётся отрицательным.

Исправление использует -skb_network_offset(skb) для push перед routing и skb_transport_offset(skb) для pull на loopback-пути, чтобы сбросить offset до 0.

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


Атака строится на IPv6-пакете с Segment Routing Header, где SRH не является первым extension header за IPv6.

В исходной реализации ipv6_srh_rcv() при segments_left > 0 вызывает push sizeof(struct ipv6hdr). Если между IPv6 header и SRH есть другой extension header, текущий offset отрицательный. После фиксирового push он остаётся отрицательным или не становится нулевым.

Дальше отрицательный offset уходит в два канала:

  • ip6_route_input() → fib6_rules_early_flow_dissect() → __skb_flow_dissect(): отрицательный offset передаётся в BPF и C flow dissector, что ломает логику анализа потока.
  • ip6_forward() или act_mirred: downstream handlers sch_fragment() или neighbour output получают отрицательный offset как unsigned length. Это вызывает OOB memcpy или buffer overflow.

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


Для воспроизведения ошибки нужны условия обработки IPv6-пакетов с SRH в ядре.

  • Входящий IPv6-пакет содержит Segment Routing Header.
  • Перед SRH стоит другой extension header, например Hop-by-Hop options header.
  • В пакете segments_left > 0.
  • Пакет проходит маршрутизацию ip6_route_input(), forwarding ip6_forward() или redirect act_mirred.
  • Downstream handler использует sch_fragment(), neighbour output или flow dissection с передачей network offset как длины.

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


Сценарий начинается с IPv6-пакета, в котором после IPv6 header идёт Hop-by-Hop options header, а затем SRH. При обработке ipv6_srh_rcv() код видит segments_left > 0 и пытается восстановить позицию данных.

Вместо корректного сброса offset до 0 выполняется push sizeof(struct ipv6hdr). Так как между сетевым заголовком и текущей позицией данных уже есть другой header, отрицательный offset сохраняется. При последующей маршрутизации этот отрицательный offset попадает в flow dissection или передаётся как длина в fragmentацию.

В результате нарушается интерпретация потока или происходит чтение/запись за пределы ожидаемого буфера. В forwarding-сценарии с act_mirred аналогичный путь идёт через redirect и downstream handler.

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


В переданном пакете доказательств нет отдельного PoC, эксплойта или подтверждённой эксплуатации CVE-2026-98096. Есть только описание уязвимости, commits исправления и ссылки на ядро.

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

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


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

  • Аномальный рост ошибок в netstat, dmesg или journalctl при обработке IPv6-трафика.
  • Появление unexpected packet loss или fragmentation на хостах с маршрутизацией IPv6.
  • Неожиданные изменения в flow accounting, BPF maps или eBPF tracepoint'ах после обработки SRH-пакетов.
  • Рост OOM, soft lockup или kernel panic в системах с forwarding и act_mirred.
  • Аномальные сетевые паттерны: IPv6-пакеты с SRH, Hop-by-Hop options header и segments_left > 0.

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


Для обнаружения атаки можно использовать мониторинг ядра и сетевого трафика.

  • Проверка dmesg на ошибки memory corruption, OOB access или kernel panic после обработки IPv6-трафика.
  • Анализ netem, tc, nftables или iptables правил для выявления redirect act_mirred.
  • Мониторинг BPF flow dissector'ов и eBPF tracepoint'ов на аномальные значения offset.
  • Проверка sch_fragment() и neighbour output на некорректные длины пакетов.
  • Использование tcpdump или tshark для фильтрации IPv6-пакетов с SRH и Hop-by-Hop options header.

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


Проверка версии ядра:

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

Для проверки наличия исправления нужно сравнить версию ядра с stable-ветками, где применены commits: 3ad7dca5e03bd64c65983a19734337512fd75491, 975b5b067f525a1b1338c4a3bee1c46545801518, 97b21ef57dfabbff660a4672c9fef7edfb720f47, ce4c8beedc19aceeab0e7bdc6f34394fb158c47c. Пакетные версии дистрибутивов в переданном пакете не раскрыты.

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


Основное исправление — обновление ядра до stable-версии, где применены commits: ipv6: sr: restore network header before routing and forwarding, ipv6: sr: restore network header before routing and forwarding, ipv6: sr: restore network header before routing and forwarding, ipv6: sr: restore network header before routing and forwarding.

  • Обновить ядро через пакетный менеджер дистрибутива.
  • Проверить наличие исправления в git log stable-ветки.
  • Перезагрузить систему после обновления ядра.
  • Проверить, что ipv6_srh_rcv() использует -skb_network_offset(skb) и skb_transport_offset(skb).

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


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

  • Ограничить вход IPv6-трафика с SRH на доверенных интерфейсах.
  • Отключить или ограничить act_mirred redirect, если он не нужен.
  • Отключить sch_fragment() для IPv6-пакетов с SRH.
  • Ограничить flow dissection BPF/C dissector'ами на хостах с маршрутизацией.
  • Мониторинг dmesg и netstat на аномалии при обработке IPv6-трафика.

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


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

  • Версию ядра: uname -r, uname -a, cat /proc/version.
  • Наличие commits в git log stable-ветки.
  • Отсутствие ошибок dmesg при обработке IPv6-трафика с SRH.
  • Корректную работу flow dissection и fragmentации.
  • Отсутствие аномальных значений offset в BPF tracepoint'ах.

Вывод​


CVE-2026-98096 — это ошибка обработки Segment Routing Header в IPv6 Linux Kernel, которая приводит к передаче отрицательного network offset как длины. Обновление ядра до stable-версии с commits 3ad7dca5e03bd64c65983a19734337512fd75491, 975b5b067f525a1b1338c4a3bee1c46545801518, 97b21ef57dfabbff660a4672c9fef7edfb720f47, ce4c8beedc19aceeab0e7bdc6f34394fb158c47c устраняет проблему.

Ошибка влияет на маршрутизацию, flow dissection и fragmentацию IPv6-трафика. Обновление нужно применять на хостах с активным forwarding и обработкой SRH-пакетов.

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


  1. NVD — CVE-2026-98096
  2. FIRST EPSS — CVE-2026-98096
  3. ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
  4. ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
  5. ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
  6. ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
  7. CVEs — The Linux Kernel documentation

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


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