{"id":"CVE-2026-98954","summary":"net: always dissect GSO packets in __virtio_net_hdr_to_skb()","details":"In the Linux kernel, the following vulnerability has been resolved:\n\nnet: always dissect GSO packets in __virtio_net_hdr_to_skb()\n\nCommit 9e8db5913264 (\"net: avoid false positives in untrusted gso\nvalidation\") added a '&& skb-\u003enetwork_header' check before flow-dissecting\nGSO packets without VIRTIO_NET_HDR_F_NEEDS_CSUM in\n__virtio_net_hdr_to_skb(), because some callers (such as tun_get_user(),\ntun_xdp_one(), virtnet_receive_done(), and raw_verify_header()) called\nvirtio_net_hdr_*_to_skb() before initializing skb-\u003enetwork_header and\nskb-\u003edev.\n\nBecause __alloc_skb() and __build_skb_around() zero-initialize\nskb-\u003enetwork_header to 0 (unlike mac_header and transport_header which\nare initialized to ~0U), those four callers always had\nskb-\u003enetwork_header == 0 and bypassed flow dissection in\n__virtio_net_hdr_to_skb(). More generally, skb-\u003enetwork_header is an\noffset from skb-\u003ehead (where 0 is also a valid offset whenever\nskb_headroom(skb) is 0), not a boolean flag.\n\nWhenever the 'if (gso_type && skb-\u003enetwork_header)' branch was skipped,\nthe fallback 'else if (gso_type)' only pulled nh_min_len + thlen (40 bytes\nfor TCPv4) without dissecting the packet, without validating ip_proto or\nn_proto, and without setting skb-\u003etransport_header.\n\nIf the packet has a malformed network header, it is not rejected and a\nsubsequent skb_probe_transport_header() also fails, leaving\nskb-\u003etransport_header at ~0U (0xffff). Similarly, if an IPv4 packet\ncarries IP options (ihl \u003e 5) or an IPv6 packet carries extension headers,\npulling only nh_min_len + thlen can leave the TCP header outside\nskb-\u003ehead. In both cases, tcp_hdrlen(skb) in skb_gso_transport_seglen()\nreads out-of-bounds:\n\n  BUG: KASAN: slab-out-of-bounds in skb_gso_transport_seglen\n  Read of size 2 by task poc/133\n  skb_gso_transport_seglen (net/core/gso.c:155)\n  skb_gso_validate_mac_len (net/core/gso.c:270)\n  tbf_enqueue (net/sched/sch_tbf.c:260)\n  dev_qdisc_enqueue (net/core/dev.c:4227)\n  __dev_queue_xmit (net/core/dev.c:4884)\n\nIn addition, checking virtio_net_hdr_match_proto() only inside\n'if (!skb-\u003eprotocol)' before flow dissection both skipped validation when\nskb-\u003eprotocol was pre-set by the caller and rejected VLAN-tagged frames\nwhose outer L2 protocol is ETH_P_8021Q or ETH_P_8021AD.\n\nFix this by:\n1. Initializing skb-\u003edev and skb-\u003enetwork_header (plus skb-\u003eprotocol for\n   IFF_TUN) before virtio_net_hdr_*_to_skb() in tun_get_user(),\n   tun_xdp_one(), virtnet_receive_done(), and raw_verify_header(). In\n   tun_get_user(), drop the redundant skb_reset_mac_header(skb) in the\n   IFF_TUN case since __virtio_net_hdr_to_skb() unconditionally resets\n   mac_header.\n2. Removing '&& skb-\u003enetwork_header' and the unvalidated\n   'else if (gso_type)' fallback in __virtio_net_hdr_to_skb() so all GSO\n   packets without VIRTIO_NET_HDR_F_NEEDS_CSUM are flow-dissected, have\n   their transport header pulled into linear data, and have\n   skb-\u003etransport_header set.\n3. Moving the virtio_net_hdr_match_proto() check to after\n   skb_flow_dissect_flow_keys_basic(), validating keys.basic.n_proto\n   against hdr_gso_type.","modified":"2026-10-28T02:30:28.149687838Z","published":"2026-10-23T12:19:13.873Z","database_specific":{"cna_assigner":"Linux","osv_generated_from":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/98xxx/CVE-2026-98954.json"},"references":[{"type":"WEB","url":"https://git.kernel.org/stable/c/44378d02c5aaae24b60a75fbbb539b4aa4db503d"},{"type":"WEB","url":"https://git.kernel.org/stable/c/5f4dfdf0077730e9d3ef5b37ceb17a5a56d6f34c"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/98xxx/CVE-2026-98954.json"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-98954"},{"type":"PACKAGE","url":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"}],"affected":[{"ranges":[{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"d5be7f632bad0f489879eed0ff4b99bd7fe0b74c"},{"fixed":"5f4dfdf0077730e9d3ef5b37ceb17a5a56d6f34c"},{"fixed":"44378d02c5aaae24b60a75fbbb539b4aa4db503d"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"4.14.104"},{"fixed":"4.15"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"4.19.26"},{"fixed":"4.20"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"4.20.13"},{"fixed":"4.21"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"4.14.226"},{"fixed":"4.15"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"4.19.181"},{"fixed":"4.20"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"dac7d4432b13d6b58923c1178b786bcda37c9e9e"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"e93384b12443c9bb6830b56b7d299beed432b865"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"f709f7b28d76de327373598a0fda9f916c36b5e6"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"d996573ebd5c528c613e90b7e7daa961d58fa16e"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"c375152be9dd9d6fbf6ae5ac8be337d0590f192a"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"0dab7eb86ea06ce8c530785f1999948c6f223c96"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"ea3fb2ce5fa794d02135f5c079e05cd6fc3f545d"}]},{"type":"GIT","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","events":[{"introduced":"54ef8243c3c8e90f1ea5792e6752e021a25c8eb3"}]}],"versions":["v4.14.336","v4.14.335","v4.14.334","v4.14.333","v4.14.332","v4.14.331","v4.14.330","v4.14.329","v4.14.328","v4.14.327","v4.14.326","v4.14.325","v4.14.324","v4.14.323","v4.14.322","v4.14.321","v4.14.320","v4.14.319","v4.14.318","v4.14.317","v4.14.316","v4.14.315","v4.14.314","v4.14.313","v4.14.312","v4.14.311","v4.14.310","v4.14.309","v4.14.308","v4.14.307","v4.14.306","v4.14.305","v4.14.304","v4.14.303","v4.14.302","v4.14.301","v4.14.300","v4.14.299","v4.14.298","v4.14.297","v4.14.296","v4.14.295","v4.14.294","v4.14.293","v4.14.292","v4.14.291","v4.14.290","v4.14.289","v4.14.288","v4.14.287","v4.14.286","v4.14.285","v4.14.284","v4.14.283","v4.14.282","v4.14.281","v4.14.280","v4.14.279","v4.14.278","v4.14.277","v4.14.276","v4.14.275","v4.14.274","v4.14.273","v4.14.272","v4.14.271","v4.14.270","v4.14.269","v4.14.268","v4.14.267","v4.14.266","v4.14.265","v4.14.264","v4.14.263","v4.14.262","v4.14.261","v4.14.260","v4.14.259","v4.14.258","v4.14.257","v4.14.256","v4.14.255","v4.14.254","v4.14.253","v4.14.252","v4.14.251","v4.14.250","v4.14.249","v4.14.248","v4.14.247","v4.14.246","v4.14.245","v4.14.244","v4.14.243","v4.14.242","v4.14.241","v4.14.240","v4.14.239","v4.14.238","v4.14.237","v4.14.236","v4.14.235","v4.14.234","v4.14.233","v4.14.232","v4.14.231","v4.14.230","v4.14.229","v4.14.228","v4.14.227","v4.14.226","v4.14.225","v4.14.224","v4.14.223","v4.14.222","v4.14.221","v4.14.220","v4.14.219","v4.14.218","v4.14.217","v4.14.216","v4.14.215","v4.14.214","v4.14.213","v4.14.212","v4.14.211","v4.14.210","v4.14.209","v4.14.208","v4.14.207","v4.14.206","v4.14.205","v4.14.204","v4.14.203","v4.14.202","v4.14.201","v4.14.200","v4.14.199","v4.14.198","v4.14.197","v4.14.196","v4.14.195","v4.14.194","v4.14.193","v4.14.192","v4.14.191","v4.14.190","v4.14.189","v4.14.188","v4.14.187","v4.14.186","v4.14.185","v4.14.184","v4.14.183","v4.14.182","v4.14.181","v4.14.180","v4.14.179","v4.14.178","v4.14.177","v4.14.176","v4.14.175","v4.14.174","v4.14.173","v4.14.172","v4.14.171","v4.14.170","v4.14.169","v4.14.168","v4.14.167","v4.14.166","v4.14.165","v4.14.164","v4.14.163","v4.14.162","v4.14.161","v4.14.160","v4.14.159","v4.14.158","v4.14.157","v4.14.156","v4.14.155","v4.14.154","v4.14.153","v4.14.152","v4.14.151","v4.14.150","v4.14.149","v4.14.148","v4.14.147","v4.14.146","v4.14.145","v4.14.144","v4.14.143","v4.14.142","v4.14.141","v4.14.140","v4.14.139","v4.14.138","v4.14.137","v4.14.136","v4.14.135","v4.14.134","v4.14.133","v4.14.132","v4.14.131","v4.14.130","v4.14.129","v4.14.128","v4.14.127","v4.14.126","v4.14.125","v4.14.124","v4.14.123","v4.14.122","v4.14.121","v4.14.120","v4.14.119","v4.14.118","v4.14.117","v4.14.116","v4.14.115","v4.14.114","v4.14.113","v4.14.112","v4.14.111","v4.14.110","v4.14.109","v4.14.108","v4.14.107","v4.14.106","v4.14.105","v4.14.104","v4.19.325","v4.19.324","v4.19.323","v4.19.322","v4.19.321","v4.19.320","v4.19.319","v4.19.318","v4.19.317","v4.19.316","v4.19.315","v4.19.314","v4.19.313","v4.19.312","v4.19.311","v4.19.310","v4.19.309","v4.19.308","v4.19.307","v4.19.306","v4.19.305","v4.19.304","v4.19.303","v4.19.302","v4.19.301","v4.19.300","v4.19.299","v4.19.298","v4.19.297","v4.19.296","v4.19.295","v4.19.294","v4.19.293","v4.19.292","v4.19.291","v4.19.290","v4.19.289","v4.19.288","v4.19.287","v4.19.286","v4.19.285","v4.19.284","v4.19.283","v4.19.282","v4.19.281","v4.19.280","v4.19.279","v4.19.278","v4.19.277","v4.19.276","v4.19.275","v4.19.274","v4.19.273","v4.19.272","v4.19.271","v4.19.270","v4.19.269","v4.19.268","v4.19.267","v4.19.266","v4.19.265","v4.19.264","v4.19.263","v4.19.262","v4.19.261","v4.19.260","v4.19.259","v4.19.258","v4.19.257","v4.19.256","v4.19.255","v4.19.254","v4.19.253","v4.19.252","v4.19.251","v4.19.250","v4.19.249","v4.19.248","v4.19.247","v4.19.246","v4.19.245","v4.19.244","v4.19.243","v4.19.242","v4.19.241","v4.19.240","v4.19.239","v4.19.238","v4.19.237","v4.19.236","v4.19.235","v4.19.234","v4.19.233","v4.19.232","v4.19.231","v4.19.230","v4.19.229","v4.19.228","v4.19.227","v4.19.226","v4.19.225","v4.19.224","v4.19.223","v4.19.222","v4.19.221","v4.19.220","v4.19.219","v4.19.218","v4.19.217","v4.19.216","v4.19.215","v4.19.214","v4.19.213","v4.19.212","v4.19.211","v4.19.210","v4.19.209","v4.19.208","v4.19.207","v4.19.206","v4.19.205","v4.19.204","v4.19.203","v4.19.202","v4.19.201","v4.19.200","v4.19.199","v4.19.198","v4.19.197","v4.19.196","v4.19.195","v4.19.194","v4.19.193","v4.19.192","v4.19.191","v4.19.190","v4.19.189","v4.19.188","v4.19.187","v4.19.186","v4.19.185","v4.19.184","v4.19.183","v4.19.182","v4.19.181","v4.19.180","v4.19.179","v4.19.178","v4.19.177","v4.19.176","v4.19.175","v4.19.174","v4.19.173","v4.19.172","v4.19.171","v4.19.170","v4.19.169","v4.19.168","v4.19.167","v4.19.166","v4.19.165","v4.19.164","v4.19.163","v4.19.162","v4.19.161","v4.19.160","v4.19.159","v4.19.158","v4.19.157","v4.19.156","v4.19.155","v4.19.154","v4.19.153","v4.19.152","v4.19.151","v4.19.150","v4.19.149","v4.19.148","v4.19.147","v4.19.146","v4.19.145","v4.19.144","v4.19.143","v4.19.142","v4.19.141","v4.19.140","v4.19.139","v4.19.138","v4.19.137","v4.19.136","v4.19.135","v4.19.134","v4.19.133","v4.19.132","v4.19.131","v4.19.130","v4.19.129","v4.19.128","v4.19.127","v4.19.126","v4.19.125","v4.19.124","v4.19.123","v4.19.122","v4.19.121","v4.19.120","v4.19.119","v4.19.118","v4.19.117","v4.19.116","v4.19.115","v4.19.114","v4.19.113","v4.19.112","v4.19.111","v4.19.110","v4.19.109","v4.19.108","v4.19.107","v4.19.106","v4.19.105","v4.19.104","v4.19.103","v4.19.102","v4.19.101","v4.19.100","v4.19.99","v4.19.98","v4.19.97","v4.19.96","v4.19.95","v4.19.94","v4.19.93","v4.19.92","v4.19.91","v4.19.90","v4.19.89","v4.19.88","v4.19.87","v4.19.86","v4.19.85","v4.19.84","v4.19.83","v4.19.82","v4.19.81","v4.19.80","v4.19.79","v4.19.78","v4.19.77","v4.19.76","v4.19.75","v4.19.74","v4.19.73","v4.19.72","v4.19.71","v4.19.70","v4.19.69","v4.19.68","v4.19.67","v4.19.66","v4.19.65","v4.19.64","v4.19.63","v4.19.62","v4.19.61","v4.19.60","v4.19.59","v4.19.58","v4.19.57","v4.19.56","v4.19.55","v4.19.54","v4.19.53","v4.19.52","v4.19.51","v4.19.50","v4.19.49","v4.19.48","v4.19.47","v4.19.46","v4.19.45","v4.19.44","v4.19.43","v4.19.42","v4.19.41","v4.19.40","v4.19.39","v4.19.38","v4.19.37","v4.19.36","v4.19.35","v4.19.34","v4.19.33","v4.19.32","v4.19.31","v4.19.30","v4.19.29","v4.19.28","v4.19.27","v4.19.26","v4.20.17","v4.20.16","v4.20.15","v4.20.14","v4.20.13"],"database_specific":{"source":"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-98954.json"}},{"package":{"name":"Kernel","ecosystem":"Linux"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"5.0.0"},{"fixed":"7.2.11"}]}],"database_specific":{"source":"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-98954.json"}}],"schema_version":"1.9.2"}