CVE-2024-35884 in Linux
Riassunto
di VulDB • 20/06/2026
Nel kernel Linux, è stata risolta la seguente vulnerabilità:
udp: non accettare skbs GSO non tunnel che finiscono in un tunnel
Quando rx-udp-gro-forwarding è abilitato, i pacchetti UDP potrebbero essere aggregati tramite GRO (Generic Receive Offload) durante l'instradamento. Se tali pacchetti possono finire in un tunnel, ciò può causare vari problemi; udp_gro_receive garantisce che questo non accada cercando una socket corrispondente. Questa operazione viene eseguita in udp4/6_gro_lookup_skb ma solo nel netns (namespace di rete) corrente. Si tratta di un problema per i pacchetti incapsulati quando l'endpoint si trova in un altro netns. In tali casi, i pacchetti vengono aggregati a livello UDP, il che porta a vari problemi successivi. Lo stesso fenomeno può verificarsi con rx-gro-list.
Abbiamo riscontrato questo problema con i pacchetti geneve aggregati a livello UDP. In tal caso, gso_size viene impostata; successivamente il pacchetto attraversa il percorso di ricezione (rx path) di geneve: l'intestazione geneve viene rimossa, gli offset vengono regolati e gli skbs nella frag_list non vengono adeguatamente modificati rispetto all'intestazione geneve. Quando questi skbs raggiungono skb_fragment, si comportano in modo errato. Possono verificarsi esiti diversi a seconda dell'aspetto degli skbs aggregati; dai pacchetti corrotti ai crash del kernel.
Un esempio è un BUG_ON[1] attivato in skb_segment durante l'elaborazione della frag_list. Poiché gso_size non è corretta (l'intestazione geneve era stata rimossa), skb_segment ritiene che ci siano "dimensioni dell'intestazione geneve" di dati nella frag_list, sebbene si tratti effettivamente del pacchetto successivo. Il BUG_ON stesso non ha nulla a che fare con il problema; rappresenta solo uno dei potenziali problemi.
La ricerca di una socket corrispondente in udp_gro_receive è fragile: la ricerca potrebbe essere estesa a tutti i netns (senza considerare le prestazioni), ma nulla impedisce che questi pacchetti vengano modificati nel frattempo e potremmo comunque non trovare una socket corrispondente. È accettabile mantenere la logica attuale, poiché dovrebbe coprire la maggior parte dei casi, ma è anche necessario garantire di gestire correttamente i pacchetti tunnel aggregati troppo precocemente.
Ciò viene ottenuto estendendo i controlli in udp_unexpected_gso: i pacchetti GSO privi dei bit SKB_GSO_UDP_TUNNEL/_CSUM e che finiscono in un tunnel devono essere segmentati.
[1] kernel BUG at net/core/skbuff.c:4408!
RIP: 0010:skb_segment+0xd2a/0xf70 __udp_gso_segment+0xaa/0x560
If you want to get best quality of vulnerability data, you may have to visit VulDB.