🔍 CVE-2026-98401

7.5
CVSS Score
HIGH
2026-10-14
2026-10-24 14:16
✅ 완료

🇰🇷 한글 설명

Linux 커널의 터널 디캡슐레이션 과정에서 transport_header 오프셋이 갱신되지 않아 stale 값이 남는 문제입니다. 이로 인해 브리지나 HSR 등 L2 포워딩 경로에서 qdisc_pkt_len_segs_init()이 범위를 벗어난 메모리를 읽어 커널 페이지 폴트나 KASAN 오류가 발생할 수 있습니다. 수정은 gro_cell에서 transport_header를 ~0U 센티널로 초기화하고, GTP에서는 GSO 패킷을 직접 드롭하는 방식입니다.

💡 쉬운 설명

네트워크 터널을 통과하는 특정 대용량 패킷이 리눅스 커널의 내부 정보를 잘못 가리키게 되어 시스템이 충돌할 수 있습니다. 패치가 적용되지 않은 시스템에서는 서비스 중단이나 시스템 재시작이 발생할 수 있습니다.

🇺🇸 원문 (English)

In the Linux kernel, the following vulnerability has been resolved: net: iptunnel: fix stale transport header during tunnel decapsulation Syzbot reported a crash in qdisc_pkt_len_segs_init() caused by a stale transport_header offset after tunnel decapsulation. 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) The issue is completely latent until qdisc read transport header in commit 7fb4c1967011 ("net: pull headers in qdisc_pkt_len_segs_init()"). The crash requires four conditions to line up: 1. The incoming packet is encapsulated and carries GSO metadata. The outer transport header offset is stored in skb->transport_header while the packet is still in the outer tunnel context. 2. The tunnel receiver strips the outer headers. skb->data is advanced to the inner frame, but skb->transport_header is left pointing to the now-removed outer L4 header, so it becomes a negative offset relative to the new data. 3. The inner frame is not delivered to the local IP stack. Instead, it is forwarded at L2 by a bridge or HSR, so ip_rcv_core() never runs and the transport header is not reset to the inner L4 offset. 4. The forwarding path calls __dev_queue_xmit(), which enters qdisc_pkt_len_segs_init(). That function computes the GSO header length from skb_transport_offset(skb). Because the offset is negative, the unsigned cast overflows and pskb_may_pull(skb, hdr_len + sizeof(struct tcphdr)) reads past the end of the skb, triggering a KASAN fault or page fault. The issue specifically requires GSO packets (shinfo->gso_size != 0), which are processed/aggregated through gro_cells. Fix this by clearing transport_header to the ~0U sentinel in gro_cell for all tunnnel driver. GTP does not support GRO/GSO, drop the evil GSO packets in GTP directly.

📍 영향받는 시스템

패치되지 않은 Linux 커널 (7.2.0-rc4 및 해당 개발 버전, 터널 드라이버·브리지·HSR 사용 환경)

⚔️ 공격 벡터

원격지에서 조작된 GSO 캡슐화 패킷을 전송해 터널 수신 후 브리지 등으로 포워딩되도록 유도하여 커널 충돌(DoS)을 일으킴

🛡️ 대응 방법

커널을 제조사/배포판이 제공하는 CVE-2026-98401 수정 버전으로 업데이트하고 재부팅

🔧 검증 코드

출력된 커널 버전을 배포판의 보안 권고문에서 확인한 패치 적용 버전과 비교하여, 같거나 높으면 패치된 것이고 낮으면 취약한 상태입니다.

Shell / Script
uname -r

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

💻 영향받는 소프트웨어

Linux Kernel