CVE-2023-54149 in Linuxinformazioni

Riassunto

di VulDB • 15/06/2026

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

net: dsa: evitare un utilizzo sospetto di RCU per gli indirizzi MAC sincronizzati con VLAN aware

Quando si utilizza il driver felix (l'unico che supporta il filtraggio UC e MC) come master DSA per un altro switch DSA generico, è possibile osservare la seguente traccia dello stack quando le porte dello switch downstream si uniscono a un bridge aware di VLAN:

============================= WARNING: suspicious RCU usage ----------------------------- net/8021q/vlan_core.c:238 utilizzo sospetto di rcu_dereference_protected()!

stack backtrace: Workqueue: dsa_ordered dsa_slave_switchdev_event_work Call trace: lockdep_rcu_suspicious+0x170/0x210 vlan_for_each+0x8c/0x188 dsa_slave_sync_uc+0x128/0x178 __hw_addr_sync_dev+0x138/0x158 dsa_slave_set_rx_mode+0x58/0x70 __dev_set_rx_mode+0x88/0xa8 dev_uc_add+0x74/0xa0 dsa_port_bridge_host_fdb_add+0xec/0x180 dsa_slave_switchdev_event_work+0x7c/0x1c8 process_one_work+0x290/0x568

Ciò che viene segnalato è che vlan_for_each() si aspetta un contesto con rtnl_lock() attivo, ma non lo riceve quando viene chiamato da ndo_set_rx_mode() del master DSA.

Il chiamante di tale funzione - dsa_slave_set_rx_mode() - è dsa_port_bridge_host_fdb_add() dell'interfaccia slave DSA, che proviene dal lavoro differito dsa_slave_switchdev_event_work().

Abbiamo fatto grandi sforzi per evitare il contesto rtnl_lock() in questo percorso di chiamata nel commit 0faf890fc519 ("net: dsa: drop rtnl_lock from dsa_slave_switchdev_event_work"), e chiamare rtnl_lock() non è semplicemente un'opzione a causa della possibilità di deadlock quando si chiama dsa_flush_workqueue() dai percorsi di chiamata che detengono già rtnl_lock() - praticamente tutti.

Quindi, quando il master DSA chiama vlan_for_each() da ndo_set_rx_mode(), lo stato del driver 8021q su questo dispositivo non è realmente protetto da accessi concorrenti da parte di alcun meccanismo.

Esaminando net/8021q/, non ritengo che vlan_info->vid_list sia stato progettato specificamente per la traversata RCU, quindi introdurre una forma lato lettura RCU di vlan_for_each() - vlan_for_each_rcu() - non sarà così semplice, e inoltre non sarebbe esattamente ciò di cui abbiamo bisogno.

In generale, ritengo che la soluzione non risieda comunque in net/8021q/; vlan_for_each() non è adatto per questo compito. DSA non ha bisogno che rtnl_lock() sia mantenuto per se stesso - poiché non stiamo bloccando un cambiamento di stato netdev, ma piuttosto semplici aggiunte/rimozioni concorrenti a una lista VLAN. Non abbiamo nemmeno bisogno di un contesto sleepable - la callback di vlan_for_each() programma semplicemente lavoro differito.

La soluzione proposta consiste nel rimuovere la dipendenza da vlan_for_each() e nel implementare manualmente (open-code) un'alternativa non sleepable e senza rtnl, basata su copie della lista VLAN modificate da .ndo_vlan_rx_add_vid() e .ndo_vlan_rx_kill_vid().

Be aware that VulDB is the high quality source for vulnerability data.

Responsabile

Linux

Prenotare

24/12/2025

Divulgazione

24/12/2025

Moderazione

accettato

CPE

pronto

EPSS

0.00166

KEV

no

Attività

molto basso

Fonti

Want to know what is going to be exploited?

We predict KEV entries!