CVE-2022-49501

usbnet: Run unregister_netdev() before unbind() again

High · published February 26, 2025

CVSS v3.1
7.8
EPSS
0%
Percentile
17.9
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

usbnet: Run unregister_netdev() before unbind() again

Commit 2c9d6c2b871d ("usbnet: run unbind() before unregister_netdev()")

sought to fix a use-after-free on disconnect of USB Ethernet adapters.

It turns out that a different fix is necessary to address the issue:

https://lore.kernel.org/netdev/18b3541e5372bc9b9fc733d422f4e698c089077c.1650177997.git.lukas@wunner.de/

So the commit was not necessary.

The commit made binding and unbinding of USB Ethernet asymmetrical:

Before, usbnet_probe() first invoked the ->bind() callback and then

register_netdev(). usbnet_disconnect() mirrored that by first invoking

unregister_netdev() and then ->unbind().

Since the commit, the order in usbnet_disconnect() is reversed and no

longer mirrors usbnet_probe().

One consequence is that a PHY disconnected (and stopped) in ->unbind()

is afterwards stopped once more by unregister_netdev() as it closes the

netdev before unregistering. That necessitates a contortion in ->stop()

because the PHY may only be stopped if it hasn't already been

disconnected.

Reverting the commit allows making the call to phy_stop() unconditional

in ->stop().

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00267 · 17.9th percentile
Published
2025-02-26T02:13Z
EPSS history
Timeline
  • 26 FEB 02:13Z
    usbnet: Run unregister_netdev() before unbind() again
    cvelistv5