CVE-2026-98401 in Linux
요약
\~에 의해 VulDB • 2026. 10. 14.
리눅스 커널에서 다음 취약점이 해결되었습니다:
net: iptunnel: 터널 탈캡슐화 중 stale transport header 수정
Syzbot이 tunnel decapsulation 후 stale한 transport_header 오프셋으로 인해 qdisc_pkt_len_segs_init()에서 크래시가 발생하는 것을 보고했습니다.
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
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)
이 문제는 commit 7fb4c1967011("net: pull headers in qdisc_pkt_len_segs_init()")에서 qdisc가 transport header를 읽을 때까지 완전히 latent 상태였습니다. 크래시가 발생하려면 다음 네 가지 조건이 모두 충족되어야 합니다:
1. 수신 패킷은 encapsulated되어 있으며 GSO metadata를 포함합니다. 외부 tunnel 컨텍스트에 있는 동안 skb->transport_header에는 outer transport header 오프셋이 저장됩니다. 2. 터널 리시버가 outer headers를 제거합니다. skb->data는 inner frame으로 전진하지만, skb->transport_header는 이제 제거된 outer L4 헤더를 가리킨 상태로 남아 있으므로 새 데이터 기준으로 음수 오프스트가 됩니다. 3. Inner frame은 로컬 IP 스택에 전달되지 않습니다. 대신 bridge 또는 HSR에 의해 L2에서 포워딩되므로 ip_rcv_core()가 실행되지 않으며 transport header는 inner L4 오프셋으로 재설정되지 않습니다. 4. 포워딩 경로가 __dev_queue_xmit()를 호출하여 qdisc_pkt_len_segs_init()로 진입합니다. 해당 함수는 skb_transport_offset(skb)에서 GSO 헤더 길이를 계산합니다. 오프스트가 음수이므로 unsigned 캐스팅 오버플로우가 발생하고 pskb_may_pull(skb, hdr_len + sizeof(struct tcphdr))가 skb의 끝을 넘어 읽어서 KASAN fault 또는 page fault를 유발합니다.
이 문제는 gro_cells를 통해 처리/집계되는 GSO 패킷(shinfo->gso_size != 0)에 특히 필요합니다. 모든 tunnel driver에서 gro_cell 내 transport_header를 ~0U sentinel로 클리어하여 이 문제를 수정합니다. GTP는 GRO/GSO를 지원하지 않으므로, 악의적인 GSO 패킷을 GTP 내에서 직접 드롭합니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.