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: 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
Пакетные версии дистрибутивов в переданном пакете не раскрыты.
Причина уязвимости
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-пакетов.
Официальные источники
- NVD — CVE-2026-98096
- FIRST EPSS — CVE-2026-98096
- ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
- ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
- ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
- ipv6: sr: restore network header before routing and forwarding - kernel/git/stable/linux.git - Linux kernel stable tree
- CVEs — The Linux Kernel documentation
История обновлений статьи
- 30.09.2026 — Опубликована первая версия материала.
