{"id":"CVE-2026-98382","state":"PUBLISHED","title":"bpf: Reject dev-bound-only programs on other devices","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Reject dev-bound-only programs on other devices\n\n__bpf_offload_dev_match() falls back to comparing offdev pointers after an\nexact netdev mismatch. Bound-only programs normally have NULL offdevs, so\nunrelated netdevs compare equal. A bound-only program on an\noffload-registered netdev can instead inherit a real offdev and match a\nsibling port. With CAP_BPF and CAP_NET_ADMIN, a caller can use\nbpf(BPF_LINK_CREATE) with a different target ifindex to run metadata kfuncs\nspecialized for the bound driver on the target driver's xdp_buff. Running a\nveth-bound program on tun reads beyond tun's bare stack xdp_buff as a\nveth_xdp_buff.\n\n  Oops: general protection fault, probably for non-canonical address\n  KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017]\n  RIP: 0010:veth_xdp_rx_timestamp (drivers/net/veth.c:1673)\n  Call Trace:\n   ...\n   tun_build_skb (drivers/net/tun.c:1739)\n   tun_get_user (drivers/net/tun.c:1856)\n   tun_chr_write_iter (drivers/net/tun.c:2091)\n   vfs_write (fs/read_write.c:595 fs/read_write.c:687)\n   ksys_write (fs/read_write.c:739)\n   do_syscall_64 (arch/x86/entry/syscall_64.c:84)\n   entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)\n  Kernel panic - not syncing: Fatal exception in interrupt\n\nRestrict non-offloaded programs to exact netdev matches and retain the\nshared-offdev fallback only for genuinely offloaded multi-port programs.","publishedAt":"2026-10-09T07:34:21.718Z","updatedAt":"2026-10-24T14:08:39.904Z","severity":{"score":7.8,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"e57f04194361574493e3e6cf0b9e9c69e4ae9791","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"0dceda331180617aeeb22381e8480b37f18ba08b","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"940b626854de200e6187777d42114727daca617c","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"bb375f3c5990e29851894f20ebc4b9dbc6676126","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"6db1ce73e9853f533eb7f413f14ba00f8ec6f80d","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/bpf/offload.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.3","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.3","versionType":"semver"},{"version":"6.6.158","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.112","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.55","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.9","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/bpf/offload.c"]}],"references":["https://git.kernel.org/stable/c/e57f04194361574493e3e6cf0b9e9c69e4ae9791","https://git.kernel.org/stable/c/0dceda331180617aeeb22381e8480b37f18ba08b","https://git.kernel.org/stable/c/940b626854de200e6187777d42114727daca617c","https://git.kernel.org/stable/c/bb375f3c5990e29851894f20ebc4b9dbc6676126","https://git.kernel.org/stable/c/6db1ce73e9853f533eb7f413f14ba00f8ec6f80d"],"weaknesses":[],"ingestedAt":"2026-10-29T20:13:43.249Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/98xxx/CVE-2026-98382.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-98382","state":"PUBLISHED","datePublished":"2026-10-09T07:34:21.718Z","dateUpdated":"2026-10-24T14:08:39.904Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-25T10:25:14.345Z"},"containers":{"cna":{"title":"bpf: Reject dev-bound-only programs on other devices","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nbpf: Reject dev-bound-only programs on other devices\n\n__bpf_offload_dev_match() falls back to comparing offdev pointers after an\nexact netdev mismatch. Bound-only programs normally have NULL offdevs, so\nunrelated netdevs compare equal. A bound-only program on an\noffload-registered netdev can instead inherit a real offdev and match a\nsibling port. With CAP_BPF and CAP_NET_ADMIN, a caller can use\nbpf(BPF_LINK_CREATE) with a different target ifindex to run metadata kfuncs\nspecialized for the bound driver on the target driver's xdp_buff. Running a\nveth-bound program on tun reads beyond tun's bare stack xdp_buff as a\nveth_xdp_buff.\n\n  Oops: general protection fault, probably for non-canonical address\n  KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017]\n  RIP: 0010:veth_xdp_rx_timestamp (drivers/net/veth.c:1673)\n  Call Trace:\n   ...\n   tun_build_skb (drivers/net/tun.c:1739)\n   tun_get_user (drivers/net/tun.c:1856)\n   tun_chr_write_iter (drivers/net/tun.c:2091)\n   vfs_write (fs/read_write.c:595 fs/read_write.c:687)\n   ksys_write (fs/read_write.c:739)\n   do_syscall_64 (arch/x86/entry/syscall_64.c:84)\n   entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)\n  Kernel panic - not syncing: Fatal exception in interrupt\n\nRestrict non-offloaded programs to exact netdev matches and retain the\nshared-offdev fallback only for genuinely offloaded multi-port programs."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"e57f04194361574493e3e6cf0b9e9c69e4ae9791","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"0dceda331180617aeeb22381e8480b37f18ba08b","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"940b626854de200e6187777d42114727daca617c","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"bb375f3c5990e29851894f20ebc4b9dbc6676126","versionType":"git"},{"version":"2b3486bc2d237ec345b3942b7be5deabf8c8fed1","status":"affected","lessThan":"6db1ce73e9853f533eb7f413f14ba00f8ec6f80d","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/bpf/offload.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"6.3","status":"affected"},{"version":"0","status":"unaffected","lessThan":"6.3","versionType":"semver"},{"version":"6.6.158","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.112","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.55","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.9","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["kernel/bpf/offload.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/e57f04194361574493e3e6cf0b9e9c69e4ae9791"},{"url":"https://git.kernel.org/stable/c/0dceda331180617aeeb22381e8480b37f18ba08b"},{"url":"https://git.kernel.org/stable/c/940b626854de200e6187777d42114727daca617c"},{"url":"https://git.kernel.org/stable/c/bb375f3c5990e29851894f20ebc4b9dbc6676126"},{"url":"https://git.kernel.org/stable/c/6db1ce73e9853f533eb7f413f14ba00f8ec6f80d"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - bpf(BPF_LINK_CREATE) reaches link_create(), bpf_xdp_link_attach(), dev_xdp_install(), and patched __bpf_offload_dev_match(), which accepts a program whose prog_ifindex names another local netdev; no network protocol carries the mismatched ifindex.\nAC:L - The attacker can bind programs to both veth and tun to create their NULL-offdev entries, attach the veth-bound program to tun, and write a packet through tun_chr_write_iter(); the mismatch is deterministic and requires no race or external device state.\nPR:L - bpf_prog_load() requires bpf_token_capable() for CAP_BPF and CAP_NET_ADMIN, which BPF-token delegation can satisfy in a user namespace; tun_set_iff() checks CAP_NET_ADMIN against net->user_ns, permitting this path in delegated container deployments.\nUI:N - The attacker creates the devices, loads and attaches both programs, and triggers execution by writing to their own tun file descriptor; no victim action is involved.\nS:U - The incorrectly specialized metadata kfunc dereferences and can modify memory inside the same host kernel executing the XDP program; no VM, IOMMU, or other separate security authority is crossed.\nC:H - bpf_dev_bound_resolve_kfunc() specializes the call to veth_xdp_rx_timestamp(), which casts tun's bare stack xdp_buff to veth_xdp_buff, treats the adjacent word as an skb pointer, and returns skb_hwtstamps()->hwtstamp to the BPF program, providing an unbounded kernel-read primitive.\nI:H - veth_xdp_rx_hash() passes the same bogus skb pointer to skb_get_hash(); when no hash is present, __skb_get_hash_net() calls __skb_set_sw_hash() and writes hash, l4_hash, and sw_hash through that attacker-influenceable pointer.\nA:H - tun_build_skb() runs the mismatched program from tun_chr_write_iter(), and the demonstrated veth_xdp_rx_timestamp() invalid dereference produces a general-protection fault followed by a kernel panic."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-24T14:08:39.904Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.3","versionEndExcluding":"6.6.158"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.3","versionEndExcluding":"6.12.112"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.3","versionEndExcluding":"6.18.55"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.3","versionEndExcluding":"7.2.9"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.3","versionEndExcluding":"7.3"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}