CVE-2026-31415
EUVD-2026-2193413.04.2026, 14:16
In the Linux kernel, the following vulnerability has been resolved:
ipv6: avoid overflows in ip6_datagram_send_ctl()
Yiming Qian reported :
<quote>
I believe I found a locally triggerable kernel bug in the IPv6 sendmsg
ancillary-data path that can panic the kernel via `skb_under_panic()`
(local DoS).
The core issue is a mismatch between:
- a 16-bit length accumulator (`struct ipv6_txoptions::opt_flen`, type
`__u16`) and
- a pointer to the *last* provided destination-options header (`opt->dst1opt`)
when multiple `IPV6_DSTOPTS` control messages (cmsgs) are provided.
- `include/net/ipv6.h`:
- `struct ipv6_txoptions::opt_flen` is `__u16` (wrap possible).
(lines 291-307, especially 298)
- `net/ipv6/datagram.c:ip6_datagram_send_ctl()`:
- Accepts repeated `IPV6_DSTOPTS` and accumulates into `opt_flen`
without rejecting duplicates. (lines 909-933)
- `net/ipv6/ip6_output.c:__ip6_append_data()`:
- Uses `opt->opt_flen + opt->opt_nflen` to compute header
sizes/headroom decisions. (lines 1448-1466, especially 1463-1465)
- `net/ipv6/ip6_output.c:__ip6_make_skb()`:
- Calls `ipv6_push_frag_opts()` if `opt->opt_flen` is non-zero.
(lines 1930-1934)
- `net/ipv6/exthdrs.c:ipv6_push_frag_opts()` / `ipv6_push_exthdr()`:
- Push size comes from `ipv6_optlen(opt->dst1opt)` (based on the
pointed-to header). (lines 1179-1185 and 1206-1211)
1. `opt_flen` is a 16-bit accumulator:
- `include/net/ipv6.h:298` defines `__u16 opt_flen; /* after fragment hdr */`.
2. `ip6_datagram_send_ctl()` accepts *repeated* `IPV6_DSTOPTS` cmsgs
and increments `opt_flen` each time:
- In `net/ipv6/datagram.c:909-933`, for `IPV6_DSTOPTS`:
- It computes `len = ((hdr->hdrlen + 1) << 3);`
- It checks `CAP_NET_RAW` using `ns_capable(net->user_ns,
CAP_NET_RAW)`. (line 922)
- Then it does:
- `opt->opt_flen += len;` (line 927)
- `opt->dst1opt = hdr;` (line 928)
There is no duplicate rejection here (unlike the legacy
`IPV6_2292DSTOPTS` path which rejects duplicates at
`net/ipv6/datagram.c:901-904`).
If enough large `IPV6_DSTOPTS` cmsgs are provided, `opt_flen` wraps
while `dst1opt` still points to a large (2048-byte)
destination-options header.
In the attached PoC (`poc.c`):
- 32 cmsgs with `hdrlen=255` => `len = (255+1)*8 = 2048`
- 1 cmsg with `hdrlen=0` => `len = 8`
- Total increment: `32*2048 + 8 = 65544`, so `(__u16)opt_flen == 8`
- The last cmsg is 2048 bytes, so `dst1opt` points to a 2048-byte header.
3. The transmit path sizes headers using the wrapped `opt_flen`:
- In `net/ipv6/ip6_output.c:1463-1465`:
- `headersize = sizeof(struct ipv6hdr) + (opt ? opt->opt_flen +
opt->opt_nflen : 0) + ...;`
With wrapped `opt_flen`, `headersize`/headroom decisions underestimate
what will be pushed later.
4. When building the final skb, the actual push length comes from
`dst1opt` and is not limited by wrapped `opt_flen`:
- In `net/ipv6/ip6_output.c:1930-1934`:
- `if (opt->opt_flen) proto = ipv6_push_frag_opts(skb, opt, proto);`
- In `net/ipv6/exthdrs.c:1206-1211`, `ipv6_push_frag_opts()` pushes
`dst1opt` via `ipv6_push_exthdr()`.
- In `net/ipv6/exthdrs.c:1179-1184`, `ipv6_push_exthdr()` does:
- `skb_push(skb, ipv6_optlen(opt));`
- `memcpy(h, opt, ipv6_optlen(opt));`
With insufficient headroom, `skb_push()` underflows and triggers
`skb_under_panic()` -> `BUG()`:
- `net/core/skbuff.c:2669-2675` (`skb_push()` calls `skb_under_panic()`)
- `net/core/skbuff.c:207-214` (`skb_panic()` ends in `BUG()`)
- The `IPV6_DSTOPTS` cmsg path requires `CAP_NET_RAW` in the target
netns user namespace (`ns_capable(net->user_ns, CAP_NET_RAW)`).
- Root (or any task with `CAP_NET_RAW`) can trigger this without user
namespaces.
- An unprivileged `uid=1000` user can trigger this if unprivileged
user namespaces are enabled and it can create a userns+netns to obtain
namespaced `CAP_NET_RAW` (the attached PoC does this).
- Local denial of service: kernel BUG/panic (system crash).
-
---truncated---EnginsightAwaiting analysis
This vulnerability is currently awaiting analysis.
Debian Releases
Ubuntu Releases
Ubuntu Product | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| linux |
| ||||||||||||||
| linux-hwe |
| ||||||||||||||
| linux-hwe-5.4 |
| ||||||||||||||
| linux-aws-5.8 |
| ||||||||||||||
| linux-hwe-5.8 |
| ||||||||||||||
| linux-hwe-5.11 |
| ||||||||||||||
| linux-hwe-5.13 |
| ||||||||||||||
| linux-hwe-5.15 |
| ||||||||||||||
| linux-hwe-5.19 |
| ||||||||||||||
| linux-hwe-6.2 |
| ||||||||||||||
| linux-hwe-6.5 |
| ||||||||||||||
| linux-hwe-6.8 |
| ||||||||||||||
| linux-hwe-6.11 |
| ||||||||||||||
| linux-hwe-6.14 |
| ||||||||||||||
| linux-hwe-6.17 |
| ||||||||||||||
| linux-hwe-edge |
| ||||||||||||||
| linux-lts-xenial |
| ||||||||||||||
| linux-kvm |
| ||||||||||||||
| linux-allwinner-5.19 |
| ||||||||||||||
| linux-aws |
| ||||||||||||||
| linux-aws-5.0 |
| ||||||||||||||
| linux-aws-5.3 |
| ||||||||||||||
| linux-aws-5.4 |
| ||||||||||||||
| linux-aws-5.11 |
| ||||||||||||||
| linux-aws-5.13 |
| ||||||||||||||
| linux-aws-5.15 |
| ||||||||||||||
| linux-aws-5.19 |
| ||||||||||||||
| linux-aws-6.2 |
| ||||||||||||||
| linux-aws-6.5 |
| ||||||||||||||
| linux-aws-6.8 |
| ||||||||||||||
| linux-aws-6.14 |
| ||||||||||||||
| linux-aws-6.17 |
| ||||||||||||||
| linux-aws-hwe |
| ||||||||||||||
| linux-azure |
| ||||||||||||||
| linux-azure-4.15 |
| ||||||||||||||
| linux-azure-5.3 |
| ||||||||||||||
| linux-azure-5.4 |
| ||||||||||||||
| linux-azure-5.8 |
| ||||||||||||||
| linux-azure-5.11 |
| ||||||||||||||
| linux-azure-5.13 |
| ||||||||||||||
| linux-azure-5.15 |
| ||||||||||||||
| linux-azure-5.19 |
| ||||||||||||||
| linux-azure-6.2 |
| ||||||||||||||
| linux-azure-6.5 |
| ||||||||||||||
| linux-azure-6.8 |
| ||||||||||||||
| linux-azure-6.11 |
| ||||||||||||||
| linux-azure-6.14 |
| ||||||||||||||
| linux-azure-6.17 |
| ||||||||||||||
| linux-azure-fde |
| ||||||||||||||
| linux-azure-fde-5.15 |
| ||||||||||||||
| linux-azure-fde-5.19 |
| ||||||||||||||
| linux-azure-fde-6.2 |
| ||||||||||||||
| linux-azure-fde-6.8 |
| ||||||||||||||
| linux-azure-fde-6.14 |
| ||||||||||||||
| linux-azure-fde-6.17 |
| ||||||||||||||
| linux-azure-nvidia |
| ||||||||||||||
| linux-azure-nvidia-6.14 |
| ||||||||||||||
| linux-bluefield |
| ||||||||||||||
| linux-azure-edge |
| ||||||||||||||
| linux-fips |
| ||||||||||||||
| linux-aws-fips |
| ||||||||||||||
| linux-azure-fips |
| ||||||||||||||
| linux-gcp-fips |
| ||||||||||||||
| linux-gcp |
| ||||||||||||||
| linux-gcp-4.15 |
| ||||||||||||||
| linux-gcp-5.3 |
| ||||||||||||||
| linux-gcp-5.4 |
| ||||||||||||||
| linux-gcp-5.8 |
| ||||||||||||||
| linux-gcp-5.11 |
| ||||||||||||||
| linux-gcp-5.13 |
| ||||||||||||||
| linux-gcp-5.15 |
| ||||||||||||||
| linux-gcp-5.19 |
| ||||||||||||||
| linux-gcp-6.2 |
| ||||||||||||||
| linux-gcp-6.5 |
| ||||||||||||||
| linux-gcp-6.8 |
| ||||||||||||||
| linux-gcp-6.11 |
| ||||||||||||||
| linux-gcp-6.14 |
| ||||||||||||||
| linux-gcp-6.17 |
| ||||||||||||||
| linux-gke |
| ||||||||||||||
| linux-gke-4.15 |
| ||||||||||||||
| linux-gke-5.4 |
| ||||||||||||||
| linux-gke-5.15 |
| ||||||||||||||
| linux-gkeop |
| ||||||||||||||
| linux-gkeop-5.4 |
| ||||||||||||||
| linux-gkeop-5.15 |
| ||||||||||||||
| linux-ibm |
| ||||||||||||||
| linux-ibm-5.4 |
| ||||||||||||||
| linux-ibm-5.15 |
| ||||||||||||||
| linux-ibm-6.8 |
| ||||||||||||||
| linux-intel-5.13 |
| ||||||||||||||
| linux-intel-iotg |
| ||||||||||||||
| linux-intel-iotg-5.15 |
| ||||||||||||||
| linux-iot |
| ||||||||||||||
| linux-intel-iot-realtime |
| ||||||||||||||
| linux-lowlatency |
| ||||||||||||||
| linux-lowlatency-hwe-5.15 |
| ||||||||||||||
| linux-lowlatency-hwe-5.19 |
| ||||||||||||||
| linux-lowlatency-hwe-6.2 |
| ||||||||||||||
| linux-lowlatency-hwe-6.5 |
| ||||||||||||||
| linux-lowlatency-hwe-6.8 |
| ||||||||||||||
| linux-lowlatency-hwe-6.11 |
| ||||||||||||||
| linux-nvidia |
| ||||||||||||||
| linux-nvidia-6.2 |
| ||||||||||||||
| linux-nvidia-6.5 |
| ||||||||||||||
| linux-nvidia-6.8 |
| ||||||||||||||
| linux-nvidia-6.11 |
| ||||||||||||||
| linux-nvidia-lowlatency |
| ||||||||||||||
| linux-nvidia-tegra |
| ||||||||||||||
| linux-nvidia-tegra-5.15 |
| ||||||||||||||
| linux-nvidia-tegra-igx |
| ||||||||||||||
| linux-oracle |
| ||||||||||||||
| linux-oracle-5.0 |
| ||||||||||||||
| linux-oracle-5.3 |
| ||||||||||||||
| linux-oracle-5.4 |
| ||||||||||||||
| linux-oracle-5.8 |
| ||||||||||||||
| linux-oracle-5.11 |
| ||||||||||||||
| linux-oracle-5.13 |
| ||||||||||||||
| linux-oracle-5.15 |
| ||||||||||||||
| linux-oracle-6.5 |
| ||||||||||||||
| linux-oracle-6.8 |
| ||||||||||||||
| linux-oracle-6.14 |
| ||||||||||||||
| linux-oracle-6.17 |
| ||||||||||||||
| linux-oem |
| ||||||||||||||
| linux-oem-5.6 |
| ||||||||||||||
| linux-oem-5.10 |
| ||||||||||||||
| linux-oem-5.13 |
| ||||||||||||||
| linux-oem-5.14 |
| ||||||||||||||
| linux-oem-5.17 |
| ||||||||||||||
| linux-oem-6.0 |
| ||||||||||||||
| linux-oem-6.1 |
| ||||||||||||||
| linux-oem-6.5 |
| ||||||||||||||
| linux-oem-6.8 |
| ||||||||||||||
| linux-oem-6.11 |
| ||||||||||||||
| linux-oem-6.14 |
| ||||||||||||||
| linux-oem-6.17 |
| ||||||||||||||
| linux-raspi |
| ||||||||||||||
| linux-raspi2 |
| ||||||||||||||
| linux-raspi-5.4 |
| ||||||||||||||
| linux-raspi-realtime |
| ||||||||||||||
| linux-realtime |
| ||||||||||||||
| linux-realtime-6.8 |
| ||||||||||||||
| linux-realtime-6.14 |
| ||||||||||||||
| linux-riscv |
| ||||||||||||||
| linux-riscv-5.8 |
| ||||||||||||||
| linux-riscv-5.11 |
| ||||||||||||||
| linux-riscv-5.15 |
| ||||||||||||||
| linux-riscv-5.19 |
| ||||||||||||||
| linux-riscv-6.5 |
| ||||||||||||||
| linux-riscv-6.8 |
| ||||||||||||||
| linux-riscv-6.14 |
| ||||||||||||||
| linux-riscv-6.17 |
| ||||||||||||||
| linux-starfive-5.19 |
| ||||||||||||||
| linux-starfive-6.2 |
| ||||||||||||||
| linux-starfive-6.5 |
| ||||||||||||||
| linux-xilinx |
| ||||||||||||||
| linux-xilinx-zynqmp |
| ||||||||||||||
| linux-realtime-6.17 |
|
References