public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
@ 2026-03-24 22:46 Alexander Popov
  2026-03-25  8:35 ` Greg KH
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alexander Popov @ 2026-03-24 22:46 UTC (permalink / raw)
  To: Andrew Lunn, Jakub Kicinski, David Miller, Eric Dumazet,
	Paolo Abeni, Simon Horman, Maxime Chevallier, Michal Kubecek,
	Gal Pressman, Kory Maincent, Oleksij Rempel, Ido Schimmel,
	Heiner Kallweit, Greg KH, Johannes Berg, James Guan, Kees Cook,
	Paul Moses, linux-wireless, netdev, linux-kernel, Alexander Popov
  Cc: security, notify

Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
the virt_wifi net devices. However, unregistering a virt_wifi device in
netdev_run_todo() can happen together with the device referenced by
SET_NETDEV_DEV().

It can result in use-after-free during the ethtool operations performed
on a virt_wifi device that is currently being unregistered. Such a net
device can have the `dev.parent` field pointing to the freed memory,
but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.

Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:

 ==================================================================
 BUG: KASAN: slab-use-after-free in __pm_runtime_resume+0xe2/0xf0
 Read of size 2 at addr ffff88810cfc46f8 by task pm/606

 Call Trace:
  <TASK>
  dump_stack_lvl+0x4d/0x70
  print_report+0x170/0x4f3
  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
  kasan_report+0xda/0x110
  ? __pm_runtime_resume+0xe2/0xf0
  ? __pm_runtime_resume+0xe2/0xf0
  __pm_runtime_resume+0xe2/0xf0
  ethnl_ops_begin+0x49/0x270
  ethnl_set_features+0x23c/0xab0
  ? __pfx_ethnl_set_features+0x10/0x10
  ? kvm_sched_clock_read+0x11/0x20
  ? local_clock_noinstr+0xf/0xf0
  ? local_clock+0x10/0x30
  ? kasan_save_track+0x25/0x60
  ? __kasan_kmalloc+0x7f/0x90
  ? genl_family_rcv_msg_attrs_parse.isra.0+0x150/0x2c0
  genl_family_rcv_msg_doit+0x1e7/0x2c0
  ? __pfx_genl_family_rcv_msg_doit+0x10/0x10
  ? __pfx_cred_has_capability.isra.0+0x10/0x10
  ? stack_trace_save+0x8e/0xc0
  genl_rcv_msg+0x411/0x660
  ? __pfx_genl_rcv_msg+0x10/0x10
  ? __pfx_ethnl_set_features+0x10/0x10
  netlink_rcv_skb+0x121/0x380
  ? __pfx_genl_rcv_msg+0x10/0x10
  ? __pfx_netlink_rcv_skb+0x10/0x10
  ? __pfx_down_read+0x10/0x10
  genl_rcv+0x23/0x30
  netlink_unicast+0x60f/0x830
  ? __pfx_netlink_unicast+0x10/0x10
  ? __pfx___alloc_skb+0x10/0x10
  netlink_sendmsg+0x6ea/0xbc0
  ? __pfx_netlink_sendmsg+0x10/0x10
  ? __futex_queue+0x10b/0x1f0
  ____sys_sendmsg+0x7a2/0x950
  ? copy_msghdr_from_user+0x26b/0x430
  ? __pfx_____sys_sendmsg+0x10/0x10
  ? __pfx_copy_msghdr_from_user+0x10/0x10
  ___sys_sendmsg+0xf8/0x180
  ? __pfx____sys_sendmsg+0x10/0x10
  ? __pfx_futex_wait+0x10/0x10
  ? fdget+0x2e4/0x4a0
  __sys_sendmsg+0x11f/0x1c0
  ? __pfx___sys_sendmsg+0x10/0x10
  do_syscall_64+0xe2/0x570
  ? exc_page_fault+0x66/0xb0
  entry_SYSCALL_64_after_hwframe+0x77/0x7f
  </TASK>

This fix may be combined with another one in the ethtool subsystem:
https://lore.kernel.org/all/20260322075917.254874-1-alex.popov@linux.com/T/#u

Fixes: d43c65b05b848e0b ("ethtool: runtime-resume netdev parent in ethnl_ops_begin")
Cc: stable@vger.kernel.org
Signed-off-by: Alexander Popov <alex.popov@linux.com>
---
 drivers/net/wireless/virtual/virt_wifi.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/wireless/virtual/virt_wifi.c b/drivers/net/wireless/virtual/virt_wifi.c
index 885dc7243e8d..97bd39d89e98 100644
--- a/drivers/net/wireless/virtual/virt_wifi.c
+++ b/drivers/net/wireless/virtual/virt_wifi.c
@@ -557,7 +557,6 @@ static int virt_wifi_newlink(struct net_device *dev,
 	eth_hw_addr_inherit(dev, priv->lowerdev);
 	netif_stacked_transfer_operstate(priv->lowerdev, dev);
 
-	SET_NETDEV_DEV(dev, &priv->lowerdev->dev);
 	dev->ieee80211_ptr = kzalloc_obj(*dev->ieee80211_ptr);
 
 	if (!dev->ieee80211_ptr) {
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
  2026-03-24 22:46 [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free Alexander Popov
@ 2026-03-25  8:35 ` Greg KH
  2026-03-25  9:23 ` Breno Leitao
  2026-03-25 12:34 ` Andrew Lunn
  2 siblings, 0 replies; 6+ messages in thread
From: Greg KH @ 2026-03-25  8:35 UTC (permalink / raw)
  To: Alexander Popov
  Cc: Andrew Lunn, Jakub Kicinski, David Miller, Eric Dumazet,
	Paolo Abeni, Simon Horman, Maxime Chevallier, Michal Kubecek,
	Gal Pressman, Kory Maincent, Oleksij Rempel, Ido Schimmel,
	Heiner Kallweit, Johannes Berg, James Guan, Kees Cook, Paul Moses,
	linux-wireless, netdev, linux-kernel, security, notify

On Wed, Mar 25, 2026 at 01:46:02AM +0300, Alexander Popov wrote:
> Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
> the virt_wifi net devices. However, unregistering a virt_wifi device in
> netdev_run_todo() can happen together with the device referenced by
> SET_NETDEV_DEV().
> 
> It can result in use-after-free during the ethtool operations performed
> on a virt_wifi device that is currently being unregistered. Such a net
> device can have the `dev.parent` field pointing to the freed memory,
> but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.
> 
> Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:
> 
>  ==================================================================
>  BUG: KASAN: slab-use-after-free in __pm_runtime_resume+0xe2/0xf0
>  Read of size 2 at addr ffff88810cfc46f8 by task pm/606
> 
>  Call Trace:
>   <TASK>
>   dump_stack_lvl+0x4d/0x70
>   print_report+0x170/0x4f3
>   ? __pfx__raw_spin_lock_irqsave+0x10/0x10
>   kasan_report+0xda/0x110
>   ? __pm_runtime_resume+0xe2/0xf0
>   ? __pm_runtime_resume+0xe2/0xf0
>   __pm_runtime_resume+0xe2/0xf0
>   ethnl_ops_begin+0x49/0x270
>   ethnl_set_features+0x23c/0xab0
>   ? __pfx_ethnl_set_features+0x10/0x10
>   ? kvm_sched_clock_read+0x11/0x20
>   ? local_clock_noinstr+0xf/0xf0
>   ? local_clock+0x10/0x30
>   ? kasan_save_track+0x25/0x60
>   ? __kasan_kmalloc+0x7f/0x90
>   ? genl_family_rcv_msg_attrs_parse.isra.0+0x150/0x2c0
>   genl_family_rcv_msg_doit+0x1e7/0x2c0
>   ? __pfx_genl_family_rcv_msg_doit+0x10/0x10
>   ? __pfx_cred_has_capability.isra.0+0x10/0x10
>   ? stack_trace_save+0x8e/0xc0
>   genl_rcv_msg+0x411/0x660
>   ? __pfx_genl_rcv_msg+0x10/0x10
>   ? __pfx_ethnl_set_features+0x10/0x10
>   netlink_rcv_skb+0x121/0x380
>   ? __pfx_genl_rcv_msg+0x10/0x10
>   ? __pfx_netlink_rcv_skb+0x10/0x10
>   ? __pfx_down_read+0x10/0x10
>   genl_rcv+0x23/0x30
>   netlink_unicast+0x60f/0x830
>   ? __pfx_netlink_unicast+0x10/0x10
>   ? __pfx___alloc_skb+0x10/0x10
>   netlink_sendmsg+0x6ea/0xbc0
>   ? __pfx_netlink_sendmsg+0x10/0x10
>   ? __futex_queue+0x10b/0x1f0
>   ____sys_sendmsg+0x7a2/0x950
>   ? copy_msghdr_from_user+0x26b/0x430
>   ? __pfx_____sys_sendmsg+0x10/0x10
>   ? __pfx_copy_msghdr_from_user+0x10/0x10
>   ___sys_sendmsg+0xf8/0x180
>   ? __pfx____sys_sendmsg+0x10/0x10
>   ? __pfx_futex_wait+0x10/0x10
>   ? fdget+0x2e4/0x4a0
>   __sys_sendmsg+0x11f/0x1c0
>   ? __pfx___sys_sendmsg+0x10/0x10
>   do_syscall_64+0xe2/0x570
>   ? exc_page_fault+0x66/0xb0
>   entry_SYSCALL_64_after_hwframe+0x77/0x7f
>   </TASK>
> 
> This fix may be combined with another one in the ethtool subsystem:
> https://lore.kernel.org/all/20260322075917.254874-1-alex.popov@linux.com/T/#u
> 
> Fixes: d43c65b05b848e0b ("ethtool: runtime-resume netdev parent in ethnl_ops_begin")
> Cc: stable@vger.kernel.org
> Signed-off-by: Alexander Popov <alex.popov@linux.com>
> ---
>  drivers/net/wireless/virtual/virt_wifi.c | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/virtual/virt_wifi.c b/drivers/net/wireless/virtual/virt_wifi.c
> index 885dc7243e8d..97bd39d89e98 100644
> --- a/drivers/net/wireless/virtual/virt_wifi.c
> +++ b/drivers/net/wireless/virtual/virt_wifi.c
> @@ -557,7 +557,6 @@ static int virt_wifi_newlink(struct net_device *dev,
>  	eth_hw_addr_inherit(dev, priv->lowerdev);
>  	netif_stacked_transfer_operstate(priv->lowerdev, dev);
>  
> -	SET_NETDEV_DEV(dev, &priv->lowerdev->dev);
>  	dev->ieee80211_ptr = kzalloc_obj(*dev->ieee80211_ptr);
>  
>  	if (!dev->ieee80211_ptr) {
> -- 
> 2.53.0

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
  2026-03-24 22:46 [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free Alexander Popov
  2026-03-25  8:35 ` Greg KH
@ 2026-03-25  9:23 ` Breno Leitao
  2026-03-25 12:34 ` Andrew Lunn
  2 siblings, 0 replies; 6+ messages in thread
From: Breno Leitao @ 2026-03-25  9:23 UTC (permalink / raw)
  To: Alexander Popov
  Cc: Andrew Lunn, Jakub Kicinski, David Miller, Eric Dumazet,
	Paolo Abeni, Simon Horman, Maxime Chevallier, Michal Kubecek,
	Gal Pressman, Kory Maincent, Oleksij Rempel, Ido Schimmel,
	Heiner Kallweit, Greg KH, Johannes Berg, James Guan, Kees Cook,
	Paul Moses, linux-wireless, netdev, linux-kernel, security,
	notify

On Wed, Mar 25, 2026 at 01:46:02AM +0300, Alexander Popov wrote:
> Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
> the virt_wifi net devices. However, unregistering a virt_wifi device in
> netdev_run_todo() can happen together with the device referenced by
> SET_NETDEV_DEV().
> 
> It can result in use-after-free during the ethtool operations performed
> on a virt_wifi device that is currently being unregistered. Such a net
> device can have the `dev.parent` field pointing to the freed memory,
> but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.
> 
> Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:
> 
>  ==================================================================
>  BUG: KASAN: slab-use-after-free in __pm_runtime_resume+0xe2/0xf0
>  Read of size 2 at addr ffff88810cfc46f8 by task pm/606
> 
>  Call Trace:
>   <TASK>
>   dump_stack_lvl+0x4d/0x70
>   print_report+0x170/0x4f3
>   ? __pfx__raw_spin_lock_irqsave+0x10/0x10
>   kasan_report+0xda/0x110
>   ? __pm_runtime_resume+0xe2/0xf0
>   ? __pm_runtime_resume+0xe2/0xf0
>   __pm_runtime_resume+0xe2/0xf0
>   ethnl_ops_begin+0x49/0x270
>   ethnl_set_features+0x23c/0xab0
>   ? __pfx_ethnl_set_features+0x10/0x10
>   ? kvm_sched_clock_read+0x11/0x20
>   ? local_clock_noinstr+0xf/0xf0
>   ? local_clock+0x10/0x30
>   ? kasan_save_track+0x25/0x60
>   ? __kasan_kmalloc+0x7f/0x90
>   ? genl_family_rcv_msg_attrs_parse.isra.0+0x150/0x2c0
>   genl_family_rcv_msg_doit+0x1e7/0x2c0
>   ? __pfx_genl_family_rcv_msg_doit+0x10/0x10
>   ? __pfx_cred_has_capability.isra.0+0x10/0x10
>   ? stack_trace_save+0x8e/0xc0
>   genl_rcv_msg+0x411/0x660
>   ? __pfx_genl_rcv_msg+0x10/0x10
>   ? __pfx_ethnl_set_features+0x10/0x10
>   netlink_rcv_skb+0x121/0x380
>   ? __pfx_genl_rcv_msg+0x10/0x10
>   ? __pfx_netlink_rcv_skb+0x10/0x10
>   ? __pfx_down_read+0x10/0x10
>   genl_rcv+0x23/0x30
>   netlink_unicast+0x60f/0x830
>   ? __pfx_netlink_unicast+0x10/0x10
>   ? __pfx___alloc_skb+0x10/0x10
>   netlink_sendmsg+0x6ea/0xbc0
>   ? __pfx_netlink_sendmsg+0x10/0x10
>   ? __futex_queue+0x10b/0x1f0
>   ____sys_sendmsg+0x7a2/0x950
>   ? copy_msghdr_from_user+0x26b/0x430
>   ? __pfx_____sys_sendmsg+0x10/0x10
>   ? __pfx_copy_msghdr_from_user+0x10/0x10
>   ___sys_sendmsg+0xf8/0x180
>   ? __pfx____sys_sendmsg+0x10/0x10
>   ? __pfx_futex_wait+0x10/0x10
>   ? fdget+0x2e4/0x4a0
>   __sys_sendmsg+0x11f/0x1c0
>   ? __pfx___sys_sendmsg+0x10/0x10
>   do_syscall_64+0xe2/0x570
>   ? exc_page_fault+0x66/0xb0
>   entry_SYSCALL_64_after_hwframe+0x77/0x7f
>   </TASK>
> 
> This fix may be combined with another one in the ethtool subsystem:
> https://lore.kernel.org/all/20260322075917.254874-1-alex.popov@linux.com/T/#u
> 
> Fixes: d43c65b05b848e0b ("ethtool: runtime-resume netdev parent in ethnl_ops_begin")
> Cc: stable@vger.kernel.org
> Signed-off-by: Alexander Popov <alex.popov@linux.com>

Reviewed-by: Breno Leitao <leitao@debian.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
  2026-03-24 22:46 [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free Alexander Popov
  2026-03-25  8:35 ` Greg KH
  2026-03-25  9:23 ` Breno Leitao
@ 2026-03-25 12:34 ` Andrew Lunn
  2026-03-25 13:47   ` Greg KH
  2026-03-25 17:24   ` Alexander Popov
  2 siblings, 2 replies; 6+ messages in thread
From: Andrew Lunn @ 2026-03-25 12:34 UTC (permalink / raw)
  To: Alexander Popov
  Cc: Jakub Kicinski, David Miller, Eric Dumazet, Paolo Abeni,
	Simon Horman, Maxime Chevallier, Michal Kubecek, Gal Pressman,
	Kory Maincent, Oleksij Rempel, Ido Schimmel, Heiner Kallweit,
	Greg KH, Johannes Berg, James Guan, Kees Cook, Paul Moses,
	linux-wireless, netdev, linux-kernel, security, notify

On Wed, Mar 25, 2026 at 01:46:02AM +0300, Alexander Popov wrote:
> Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
> the virt_wifi net devices. However, unregistering a virt_wifi device in
> netdev_run_todo() can happen together with the device referenced by
> SET_NETDEV_DEV().
> 
> It can result in use-after-free during the ethtool operations performed
> on a virt_wifi device that is currently being unregistered. Such a net
> device can have the `dev.parent` field pointing to the freed memory,
> but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.
> 
> Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:

Did you have a look at all user of SET_NETDEV_DEV() to see if there
are other examples of the same bug?

What i found was:

https://elixir.bootlin.com/linux/v6.19.9/source/drivers/net/ethernet/mellanox/mlx4/en_netdev.c#L3180

Does this have the same problem?

     Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
  2026-03-25 12:34 ` Andrew Lunn
@ 2026-03-25 13:47   ` Greg KH
  2026-03-25 17:24   ` Alexander Popov
  1 sibling, 0 replies; 6+ messages in thread
From: Greg KH @ 2026-03-25 13:47 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Alexander Popov, Jakub Kicinski, David Miller, Eric Dumazet,
	Paolo Abeni, Simon Horman, Maxime Chevallier, Michal Kubecek,
	Gal Pressman, Kory Maincent, Oleksij Rempel, Ido Schimmel,
	Heiner Kallweit, Johannes Berg, James Guan, Kees Cook, Paul Moses,
	linux-wireless, netdev, linux-kernel, security, notify

On Wed, Mar 25, 2026 at 01:34:43PM +0100, Andrew Lunn wrote:
> On Wed, Mar 25, 2026 at 01:46:02AM +0300, Alexander Popov wrote:
> > Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
> > the virt_wifi net devices. However, unregistering a virt_wifi device in
> > netdev_run_todo() can happen together with the device referenced by
> > SET_NETDEV_DEV().
> > 
> > It can result in use-after-free during the ethtool operations performed
> > on a virt_wifi device that is currently being unregistered. Such a net
> > device can have the `dev.parent` field pointing to the freed memory,
> > but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.
> > 
> > Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:
> 
> Did you have a look at all user of SET_NETDEV_DEV() to see if there
> are other examples of the same bug?
> 
> What i found was:
> 
> https://elixir.bootlin.com/linux/v6.19.9/source/drivers/net/ethernet/mellanox/mlx4/en_netdev.c#L3180
> 
> Does this have the same problem?

That's not pointing to the "parent" device, but rather the actual device
under operation from what I can tell.  Or am I mistaking what "pdev"
means here?  Isn't that the pci device the driver is bound to?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free
  2026-03-25 12:34 ` Andrew Lunn
  2026-03-25 13:47   ` Greg KH
@ 2026-03-25 17:24   ` Alexander Popov
  1 sibling, 0 replies; 6+ messages in thread
From: Alexander Popov @ 2026-03-25 17:24 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Jakub Kicinski, David Miller, Eric Dumazet, Paolo Abeni,
	Simon Horman, Maxime Chevallier, Michal Kubecek, Gal Pressman,
	Kory Maincent, Oleksij Rempel, Ido Schimmel, Heiner Kallweit,
	Greg KH, Johannes Berg, James Guan, Kees Cook, Paul Moses,
	linux-wireless, netdev, linux-kernel, security, notify

On 3/25/26 15:34, Andrew Lunn wrote:
> On Wed, Mar 25, 2026 at 01:46:02AM +0300, Alexander Popov wrote:
>> Currently we execute `SET_NETDEV_DEV(dev, &priv->lowerdev->dev)` for
>> the virt_wifi net devices. However, unregistering a virt_wifi device in
>> netdev_run_todo() can happen together with the device referenced by
>> SET_NETDEV_DEV().
>>
>> It can result in use-after-free during the ethtool operations performed
>> on a virt_wifi device that is currently being unregistered. Such a net
>> device can have the `dev.parent` field pointing to the freed memory,
>> but ethnl_ops_begin() calls `pm_runtime_get_sync(dev->dev.parent)`.
>>
>> Let's remove SET_NETDEV_DEV for virt_wifi to avoid bugs like this:
> 
> Did you have a look at all user of SET_NETDEV_DEV() to see if there
> are other examples of the same bug?
> 
> What i found was:
> 
> https://elixir.bootlin.com/linux/v6.19.9/source/drivers/net/ethernet/mellanox/mlx4/en_netdev.c#L3180
> 
> Does this have the same problem?

Andrew, I can't say about this particular net device. Looks like it refers to a 
specific ethernet adapter.

How can we distinguish security-relevant bugs similar to this use-after-free:
an unprivileged user must be able to create a given net device via user namespaces.

As I mentioned, applying this fix in ethtool could help against them:
https://lore.kernel.org/all/20260322075917.254874-1-alex.popov@linux.com/T/#u

Best regards,
Alexander

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-03-25 17:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-24 22:46 [PATCH] wifi: virt_wifi: remove SET_NETDEV_DEV to avoid use-after-free Alexander Popov
2026-03-25  8:35 ` Greg KH
2026-03-25  9:23 ` Breno Leitao
2026-03-25 12:34 ` Andrew Lunn
2026-03-25 13:47   ` Greg KH
2026-03-25 17:24   ` Alexander Popov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox