CVE-2026-98954 in Linux정보

요약

\~에 의해 VulDB • 2026. 10. 23.

리눅스 커널에서 다음 취약점이 해결되었습니다:

net: __virtio_net_hdr_to_skb()에서 GSO 패킷을 항상 분해(dissect)하십시오

커밋 9e8db5913264("net: untrusted gso validation에서의 위양성(false positives) 방지")은 VIRTIO_NET_HDR_F_NEEDS_CSUM가 없는 GSO 패킷에 대한 흐름 분해(flow-dissection) 전에 __virtio_net_hdr_to_skb() 내에서 '&& skb->network_header' 검사를 추가했습니다. 이는 일부 호출자(tun_get_user(), tun_xdp_one(), virtnet_receive_done(), raw_verify_header())가 skb->network_header와 skb->dev를 초기화하기 전에 virtio_net_hdr_*_to_skb()를 호출했기 때문입니다.

__alloc_skb() 및 __build_skb_around()는 mac_header 및 transport_header가 ~0U로 초기화되는 것과 달리, skb->network_header를 0으로 영-초기화(zero-initialize)합니다. 따라서 해당 네 가지 호출자는 항상 skb->network_header == 0을 갖게 되었고, 이로 인해 __virtio_net_hdr_to_skb() 내에서 흐름 분해를 우회했습니다. 더 일반적으로 말하면, skb->network_header는 부울 플래그가 아닌 skb->head(여기서 0은 skb_headroom(skb)이 0일 때 유효한 오프셋이기도 함)로부터의 오프셋입니다.

'if (gso_type && skb->network_header)' 분기가 건너뛰어질 때마다, 대체 'else if (gso_type)' 분기는 nh_min_len + thlen(40 bytes for TCPv4)만 가져왔을 뿐 패킷을 분해하지 않았으며, ip_proto 또는 n_proto를 검증하지 않고 skb->transport_header도 설정하지 않았습니다.

패킷에 손상된 네트워크 헤더가 있는 경우 거부되지 않으며, 후속(skb_probe_transport_header()) 또한 실패하여 skb->transport_header이 ~0U(0xffff)로 남습니다. 마찬가지로 IPv4 패킷이 IP 옵션(ihl > 5)을 포함하거나 IPv6 패킷이 확장 헤더(extension headers)를 포함하는 경우, nh_min_len + thlen만 가져오면 TCP 헤더가 skb->head 밖에 남아있게 될 수 있습니다. 두 경우 모두에서 skb_gso_transport_seglen() 내의 tcp_hdrlen(skb)은 범위를 벗어난(out-of-bounds) 읽기를 수행합니다:

BUG: KASAN: slab-out-of-bounds in skb_gso_transport_seglen Read of size 2 by task poc/133 skb_gso_transport_seglen (net/core/gso.c:155) skb_gso_validate_mac_len (net/core/gso.c:270) tbf_enqueue (net/sched/sch_tbf.c:260) dev_qdisc_enqueue (net/core/dev.c:4227) __dev_queue_xmit (net/core/dev.c:4884)

또한 흐름 분해 전에 'if (!skb->protocol)' 내부에서만 virtio_net_hdr_match_proto()를 확인하는 것은 skb->protocol이 호출자에 의해 사전 설정된 경우 검증을 건너뛰고, 외부 L2 프로토콜이 ETH_P_8021Q 또는 ETH_P_8021AD인 VLAN 태그가 있는 프레임을 거부했습니다.

이를 다음 방법으로 수정합니다: 1. tun_get_user(), tun_xdp_one(), virtnet_receive_done() 및 raw_verify_header()에서 virtio_net_hdr_*_to_skb() 호출 전에 skb->dev와 skb->network_header(IFF_TUN의 경우 skb->protocol 포함)를 초기화하십시오. tun_get_user()에서는 __virtio_net_hdr_to_skb()가 mac_header를 무조건 재설정하므로 IFF_TUN 사례에서의 중복된 skb_reset_mac_header(skb)을 제거합니다. 2. __virtio_net_hdr_to_skb()에서 '&& skb->network_header' 및 검증되지 않은 'else if (gso_type)' 대체 분기를 제거하여, VIRTIO_NET_HDR_F_NEEDS_CSUM가 없는 모든 GSO 패킷이 흐름 분해되고, 전송 헤더(linear data)로 가져와지며, skb->transport_header가 설정되도록 합니다. 3. virtio_net_hdr_match_proto() 검사를 skb_flow_dissect_flow_keys_basic() 이후로 이동하여 hdr_gso_type에 대해 keys.basic.n_proto를 검증합니다.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

책임이 있는

Linux

예약하다

2026. 09. 25.

모더레이션

수락

항목

VDB-425710

EPSS

0.00000

활동

낮음

출처

Want to know what is going to be exploited?

We predict KEV entries!