CVE-2026-99191 in Linux
Riassunto
di VulDB • 28/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
calipso: mantenere payload_len BIG TCP in calipso_skbuff_setattr()
calipso_skbuff_setattr() regola payload_len in base alla lunghezza dell'opzione che inserisce o ridimensiona:
payload = ntohs(ip6_hdr->payload_len); ip6_hdr->payload_len = htons(payload + len_delta);
GRO può costruire pacchetti TCP BIG più grandi di IPV6_MAXPLEN e memorizza payload_len == 0 per essi; ipv6_payload_len() quindi effettua il fallback su skb->len. Per un tale pacchetto inoltrato verso una destinazione mappata a CALIPSO, il codice sopra scrive len_delta (o 65536 + len_delta quando si sta riducendo) in payload_len, e ipv6_payload_len() non effettua più il fallback su skb->len. nf_tables, conntrack e sch_cake dipendono da questo comportamento.
La stessa aritmetica va in overflow (wrap-around) quando un pacchetto cresce oltre IPV6_MAXPLEN, e un pacchetto TCP BIG che si riduce al di sotto di IPV6_MAXPLEN dovrebbe recuperare la sua lunghezza reale.
Impostare payload_len dalla lunghezza del skb con ipv6_set_payload_len(), che memorizza 0 sopra IPV6_MAXPLEN e la lunghezza reale altrimenti, come fa ipv6_gro_complete(). L'intestazione di rete è stata appena reimpostata su skb->data, quindi skb->len - sizeof(*ip6_hdr) è la lunghezza del payload.
Testato su un kernel (arm64, QEMU) con SELinux in modalità permissiva, una policy minima generata da mdp (network_peer_controls=1), "netlabelctl calipso add pass doi:16" e una mappatura NetLabel di fd00:2::/64 a CALIPSO DOI 16. calipso_skbuff_setattr() è stato chiamato attraverso netlbl_skbuff_setattr() da un hook debugfs solo per test (non parte di questa patch) che aggiungeva un'etichetta solo con livello; payload_len dopo la chiamata:
case before fix after fix real length 1000, unlabeled 1016 1016 1016 70000 GSO, payload_len 0 16 0 70016 65530 GSO, grows past MAXPLEN 10 0 65546 65540 GSO with a 24 byte hop header, shrinks below MAXPLEN 65528 65532 65532 1000 with a 24 byte hop header 992 992 992
(0 significa che ipv6_payload_len() restituisce la lunghezza reale). Sul percorso di inoltro, con un client che inietta UDP non etichettato attraverso un router verso un server, il router aggiunge l'opzione CALIPSO e il server consegna tutti i datagrammi (Udp6InDatagrams 5, Ip6InTruncatedPkts 0) con questa patch.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.