CVE-2026-31415 in Linuxinformazioni

Riassunto

di VulDB • 15/06/2026

Nel kernel Linux, è stata risolta la seguente vulnerabilità:

ipv6: evitare overflow in ip6_datagram_send_ctl()

Yiming Qian ha segnalato: <quote> Ritengo di aver trovato un bug del kernel localmente attivabile nel percorso ancillary-data di sendmsg per IPv6 che può causare il panic del kernel tramite `skb_under_panic()` (DoS locale).

Il problema fondamentale è una discrepanza tra:

- un accumulatore di lunghezza a 16 bit (`struct ipv6_txoptions::opt_flen`, tipo `__u16`) e - un puntatore all'intestazione delle opzioni di destinazione *più recente* fornita (`opt->dst1opt`)

quando vengono forniti più messaggi di controllo `IPV6_DSTOPTS` (cmsg).

- `include/net/ipv6.h`: - `struct ipv6_txoptions::opt_flen` è `__u16` (possibile wraparound). (righe 291-307, in particolare 298) - `net/ipv6/datagram.c:ip6_datagram_send_ctl()`: - Accetta `IPV6_DSTOPTS` ripetuti e li accumula in `opt_flen` senza rifiutare i duplicati. (righe 901-904)

Se vengono forniti abbastanza cmsg `IPV6_DSTOPTS` di grandi dimensioni, `opt_flen` va in wraparound mentre `dst1opt` punta ancora a un'intestazione delle opzioni di destinazione di grandi dimensioni (2048 byte).

Nel PoC allegato (`poc.c`):

- 32 cmsg con `hdrlen=255` => `len = (255+1)*8 = 2048` - 1 cmsg con `hdrlen=0` => `len = 8` - Incremento totale: `32*2048 + 8 = 65544`, quindi `(__u16)opt_flen == 8` - L'ultimo cmsg è di 2048 byte, quindi `dst1opt` punta a un'intestazione di 2048 byte.

3. Il percorso di trasmissione dimensiona le intestazioni utilizzando `opt_flen` con wraparound:

- In `net/ipv6/ip6_output.c:1463-1465`: - `headersize = sizeof(struct ipv6hdr) + (opt ? opt->opt_flen + opt->opt_nflen : 0) + ...;`

Con `opt_flen` con wraparound, le decisioni su `headersize`/headroom sottostimano ciò che verrà spinto successivamente.

4. Quando si costruisce l'skb finale, la lunghezza effettiva dello push proviene da `dst1opt` e non è limitata da `opt_flen` con wraparound:

- 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()` spinge `dst1opt` tramite `ipv6_push_exthdr()`. - In `net/ipv6/exthdrs.c:1179-1184`, `ipv6_push_exthdr()` fa: - `skb_push(skb, ipv6_optlen(opt));` - `memcpy(h, opt, ipv6_optlen(opt));`

Con headroom insufficiente, `skb_push()` va in underflow e attiva `skb_under_panic()` -> `BUG()`:

- `net/core/skbuff.c:2669-2675` (`skb_push()` chiama `skb_under_panic()`) - `net/core/skbuff.c:207-214` (`skb_panic()` termina con `BUG()`)

- Il percorso `IPV6_DSTOPTS` cmsg richiede `CAP_NET_RAW` nel namespace utente del netns di destinazione (`ns_capable(net->user_ns, CAP_NET_RAW)`). - Root (o qualsiasi task con `CAP_NET_RAW`) può attivare questo bug senza namespace utente. - Un utente non privilegiato `uid=1000` può attivare questo bug se i namespace utente non privilegiati sono abilitati e può creare un userns+netns per ottenere `CAP_NET_RAW` a livello di namespace (il PoC allegato fa questo).

- Denial of Service locale: panic del kernel (crash del sistema). </quote>

Cronologia delle revisioni:

- 2024-07-10: versione iniziale - 2024-07-11: versione v2

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

Responsabile

Linux

Prenotare

09/03/2026

Divulgazione

13/04/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00114

KEV

no

Attività

molto basso

Fonti

Do you know our Splunk app?

Download it now for free!