CVE-2026-98401 in Linux
要約
〜によって VulDB • 2026年10月15日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
net: iptunnel: トンネル脱カプセル化時のスタレイトなトランスポートヘッダーの修正
Syzbotにより、トンネル脱カプセル化後にスタレイトな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 <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)
この問題は、コミット7fb4c1967011("net: pull headers in qdisc_pkt_len_segs_init()")でqdiscがトランスポートヘッダーを読み込むまで完全に潜伏していました。クラッシュには以下の4つの条件が一斉に揃う必要があります:
1. 受信パケットはカプセル化されており、GSOメタデータを含む。外部のトンネルコンテキスト内にいる間、skb->transport_headerに外部トランスポートヘッダーのオフセットが格納される。 2. トンネルレシーバーが外部ヘッダを剥ぎ取る。skb->dataは内部フレームに進められるが、skb->transport_headerは既に削除された外部L4ヘッダーを指したままになるため、新しいデータに対する相対的な負のオフセットとなる。 3. 内部フレームはローカルIPスタックに渡されない。代わりにブリッジまたはHSRによってL2で転送されるため、ip_rcv_core()が実行されず、トランスポートヘッダーが内部L4オフセットにリセットされない。 4. 転送パスが__dev_queue_xmit()を呼び出し、qdisc_pkt_len_segs_init()に入る。この関数はskb_transport_offset(skb)からGSOヘッダ長を計算する。オフセットが負であるため、符号なしキャストによるオーバーフローが発生し、pskb_may_pull(skb, hdr_len + sizeof(struct tcphdr))がskbの末尾を超えて読み込みを行い、KASANフォールトまたはページフォルトを引き起こす。
この問題は特にGSOパケット(shinfo->gso_size != 0)に必要であり、これらはgro_cellsを通じて処理/集約される。すべてのトンネルドライバに対してgro_cellでtransport_headerを~0Uのsentinel値にクリアすることでこれを修正する。GTPはGRO/GSOをサポートしないため、GTP内で悪意のあるGSOパケットを直接ドロップする。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.