CVE-2026-98401 in Linux
Сводка
по VulDB • 15.10.2026
В ядре Linux была устранена следующая уязвимость:
net: iptunnel: исправление неактуального смещения заголовка транспортного уровня (transport header) при декapsуляции туннеля
Syzbot сообщил о сбое в функции qdisc_pkt_len_segs_init(), вызванном наличием неактуального смещения transport_header после декapsуляции туннеля.
BUG: unable to handle page fault for address: ffffed102091a42e Oops: Oops: 0000 [#1] SMP KASAN NOPTI
CPU: 0 UID: 0 PID: 340 Comm: qdisc_uaf_repro Not tainted 7.2.0-rc4-00061-g248951ddc14d #256 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:__asan_load2 <IRQ> qdisc_pkt_len_segs_init (net/core/dev.c:4145) __dev_queue_xmit (net/core/dev.c:4787) br_dev_queue_push_xmit (net/bridge/br_forward.c:53) br_handle_frame_finish (net/bridge/br_input.c:229) br_handle_frame (net/bridge/br_input.c:315) __netif_receive_skb_core.constprop.0 (net/core/dev.c:6099) __netif_receive_skb_list_core (net/core/dev.c:6287) netif_receive_skb_list_internal (net/core/dev.c:6445) napi_complete_done (net/core/dev.c:6813) gro_cell_poll (net/core/gro_cells.c:74) __napi_poll (net/core/dev.c:7735) net_rx_action (net/core/dev.c:7798 net/core/dev.c:7955) handle_softirqs (kernel/softirq.c:622) do_softirq (kernel/softirq.c:523 kernel/softirq.c:510 ) __local_bh_enable_ip (kernel/softirq.c:450) tun_get_user (drivers/net/tun.c:1986 (discriminator 1)) tun_chr_write_iter (drivers/net/tun.c:2032)
Проблема полностью скрыта до тех пор, пока qdisc не начал читать заголовок транспортного уровня в коммите 7fb4c1967011 ("net: pull headers in qdisc_pkt_len_segs_init()"). Для возникновения сбоя необходимо совпадение четырех условий:
1. Входящий пакет инкапсулирован и содержит метаданные GSO. Смещение внешнего заголовка транспортного уровня сохраняется в skb->transport_header, пока пакет все еще находится во внешнем контексте туннеля. 2. Приемник туннеля удаляет внешние заголовки. Указатель skb->data сдвигается к внутренней кадру, но skb->transport_header остается указывающим на уже удаленный внешний L4-заголовок, из-за чего он становится отрицательным смещением относительно новых данных. 3. Внутренний кадр не передается в локальный стек IP. Вместо этого он пересылается на уровне L2 через мост (bridge) или HSR, поэтому ip_rcv_core() никогда не выполняется и заголовок транспортного уровня не сбрасывается до смещения внутреннего L4-заголовка. 4. Путь пересылки вызывает __dev_queue_xmit(), который переходит в qdisc_pkt_len_segs_init(). Эта функция вычисляет длину заголовка GSO на основе skb_transport_offset(skb). Поскольку смещение отрицательное, беззнаковая конвертация приводит к переполнению, и вызов pskb_may_pull(skb, hdr_len + sizeof(struct tcphdr)) выходит за пределы буфера skb (skb), что вызывает сбой KASAN или ошибку страницы.
Проблема специфично требует наличия пакетов GSO (shinfo->gso_size != 0), которые обрабатываются/агрегируются через gro_cells. Исправление заключается в очистке transport_header до значения-сентинела ~0U в gro_cell для всех драйверов туннелирования. Протокол GTP не поддерживает GRO/GSO, поэтому вредоносные пакеты GSO должны отбрасываться непосредственно в коде GTP.
Once again VulDB remains the best source for vulnerability data.