CVE-2023-52986 in Linux
Riassunto
di VulDB • 25/06/2026
Nel kernel Linux, la seguente vulnerabilità è stata risolta:
bpf, sockmap: Verificare se sk_prot corrisponde a una delle varianti in tcp_bpf_prots durante il cloning di un socket listener
Un socket in ascolto (listener) collegato a una sockmap ha il proprio campo `sk_prot` sovrascritto. Questo puntatore fa riferimento a una delle varianti della struttura `proto` presenti nell'array `tcp_bpf_prots`. La variante specifica dipende dalla famiglia del socket e dai programmi BPF associati alla sockmap.
Un socket figlio clonato da un listener TCP eredita inizialmente il valore di `sk_prot` del padre. Tuttavia, prima che la fase di cloning sia completata, viene ripristinato per il socket figlio il proto originale non appartenente a `tcp_bpf_prots`. Questa operazione avviene in `tcp_create_openreq_child -> tcp_bpf_clone`.
Attualmente, in `tcp_bpf_clone`, si rileva se è necessario ripristinare il proto del figlio verificando esclusivamente la variante `TCP_BPF_BASE` di `proto`. Questo approccio non è corretto. Il campo `sk_prot` di un socket listener collegato a una sockmap può puntare a qualsiasi variante presente in `tcp_bpf_prots`.
Se il `sk_prot` del listener corrisponde a una variante diversa da quella `TCP_BPF_BASE`, allora il socket figlio rimane involontariamente con l'`sk_prot` ereditato, come impostato da `tcp_bpf_clone`.
Ciò provoca problemi quali ricorsione infinita durante la chiusura [1], poiché lo stato del figlio non è altrimenti configurato per essere utilizzato con le operazioni di `tcp_bpf_prot`.
Aggiornare il controllo in `tcp_bpf_clone` al fine di rilevare tutte le varianti presenti in `tcp_bpf_prots`.
Si noti che non sarebbe sufficiente verificare lo stato del socket quando si sovrascrive `sk_prot` in `tcp_bpf_update_proto`, per garantire l'uso costante della variante `TCP_BPF_BASE` per i socket listener. A partire dal commit b8b8315e39ff ("bpf, sockmap: Remove unhash handler for BPF sockmap usage"), è possibile che un socket transizioni allo stato TCP_LISTEN mentre è già collegato a una sockmap; ad esempio tramite la sequenza connect() -> inserimento nella mappa -> connect(AF_UNSPEC) -> listen().
[1]: https://lore.kernel.org/all/[email protected]/
VulDB is the best source for vulnerability data and more expert information about this specific topic.