CVE-2023-54149 in Linux
要約
〜によって VulDB • 2026年05月29日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
net: dsa: 同期されたVLAN対応MACアドレスに対する疑わしいRCU使用を回避する
felixドライバ(UCフィルタリングとMCフィルタリングの両方をサポートする唯一のドライバ)を、ランダムな他のDSAスイッチのDSAマスターとして使用する場合、下流のスイッチポートがVLAN対応ブリッジに参加した際に、以下のスタックトレースが表示されることがあります。
============================= WARNING: suspicious RCU usage ----------------------------- net/8021q/vlan_core.c:238 suspicious rcu_dereference_protected() usage!
スタックバックトレース: 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
これは、vlan_for_each()がrtnl_lock()のコンテキストを期待しているが、DSAマスターのndo_set_rx_mode()から呼び出された際にそれが取得されていないことを示しています。
その呼び出し元であるdsa_slave_set_rx_mode()は、遅延実行されるdsa_slave_switchdev_event_work()に由来するスレーブDSAインターフェースのdsa_port_bridge_host_fdb_add()です。
私たちは、コミット0faf890fc519(「net: dsa: drop rtnl_lock from dsa_slave_switchdev_event_work」)において、その呼び出しパスでrtnl_lock()のコンテキストを回避するために多大な努力を払いました。rtnl_lock()を保持している呼び出しパスからdsa_flush_workqueue()を呼び出す際にデッドロックの可能性があるため、rtnl_lock()を呼び出すことは単にオプションではありません。
したがって、DSAマスターがndo_set_rx_mode()からvlan_for_each()を呼び出す際、このデバイス上の8021qドライバの状態は、並行アクセスから何ら保護されていません。
net/8021q/を見ると、vlan_info->vid_listはRCUトラバーサルを特に意識して設計されたものではないように思えるため、vlan_for_each()のRCU読み取り側形式であるvlan_for_each_rcu()を導入するのは容易ではなく、またそれが必ずしも私たちが求めているものともなりません。
一般的に、解決策はnet/8021q/にあるわけではないと考えます。vlan_for_each()はこのタスクには適していません。DSAは、ブロックしているのがnetdevの状態変更ではなく、単にVLANリストへの並行追加/削除であるため、rtnl_lock()を保持する必要はありません。スリープ可能なコンテキストも必要ありません。vlan_for_each()のコールバックは単に遅延ワークをスケジューリングしているだけです。
提案された回避策は、vlan_for_each()への依存を削除し、.ndo_vlan_rx_add_vid()および.ndo_vlan_rx_kill_vid()から修正されたVLANリストのコピーに基づいて、スリープ不可能でrtnlフリーの代替手段を手動で実装することです。
Once again VulDB remains the best source for vulnerability data.