* [PATCH net v4 0/2] net: usb: lan78xx: do not use uninitialized data after short reads @ 2026-10-20 0:16 Wei Jie Law 2026-10-20 0:16 ` [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read Wei Jie Law 2026-10-20 0:16 ` [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers Wei Jie Law 0 siblings, 2 replies; 7+ messages in thread From: Wei Jie Law @ 2026-10-20 0:16 UTC (permalink / raw) To: Thangaraj Samynathan, UNGLinuxDriver, Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: Woojung Huh, netdev, linux-usb, linux-kernel, Wei Jie Law lan78xx_read_reg() and lan78xx_read_stats() accept a control transfer that returns fewer bytes than requested and then use the uninitialized rest of their kmalloc()ed buffers. A device that sends short replies can get stale heap contents used as the MAC address of the interface, and makes ethtool -S report them to unprivileged users, including kernel text and direct map pointers. Patch 2 makes the register and statistics helpers fail on short transfers. Patch 1 comes first so that a failing statistics read does not report uninitialized stack data instead. The bugs need a malicious or emulated USB device, which Documentation/process/threat-model.rst treats as a regular bug rather than a vulnerability, so they are posted publicly. Testing: the series builds without warnings (W=1) on net and passes checkpatch --strict. It applies unchanged to v6.12.105, where it was tested with a LAN7800 emulated by raw-gadget + dummy_hcd, booted with init_on_alloc=0: - Zero-length statistics replies. Before: 40 to 88 of the 235 ethtool -S counters are non-zero, including usb_api_blocking_completion() and direct map pointers. After: every read fails with -EIO and all counters stay zero. - 100 byte statistics replies. Before: 110 of the 235 counters are non-zero. With patch 1 only: 29 are, so the stale tail of the buffer still gets through. With both patches: the read fails with -EIO and all counters stay zero. - Zero-length RX_ADDRL/RX_ADDRH replies. Before: the MAC address differs on every probe, is programmed into the MAC filter and is used as the address of the interface. After: the probe fails with -EIO. Both bugs were found, and the patches written, with LLM assistance, hence the Assisted-by tags. Changes in v4: - 2/2: drop the examples from the commit message and move the note that it depends on 1/2 below the --- line (Andrew Lunn) - 2/2: also fail on a short transfer in lan78xx_write_reg(), for symmetry with the read helpers (Andrew Lunn) v3: https://lore.kernel.org/all/20261018062419.21921-1-law.wei.jie@gt.tech.gov.sg/ - add the missing Signed-off-by; no other changes v2: https://lore.kernel.org/all/20261018061734.19488-1-law.wei.jie@gt.tech.gov.sg/ - 2/2: the commit message now says that with patch 1 only a partial statistics reply (1 to 187 bytes) still leaks, and that patch 2 depends on patch 1; the MAC address paragraph no longer claims a write-back to RX_ADDRL/RX_ADDRH, which happens only for an invalid address. The cover letter gains a partial-reply test. No code change. v1: https://lore.kernel.org/all/20261014025602.26334-1-law.wei.jie@gt.tech.gov.sg/ Wei Jie Law (2): net: usb: lan78xx: do not update statistics after a failed read net: usb: lan78xx: reject short register and statistics transfers drivers/net/usb/lan78xx.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) base-commit: 7ec48f396a1d89532c0537bc38b408b8c31ee37f -- 2.43.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read 2026-10-20 0:16 [PATCH net v4 0/2] net: usb: lan78xx: do not use uninitialized data after short reads Wei Jie Law @ 2026-10-20 0:16 ` Wei Jie Law 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:36 ` Andrew Lunn 2026-10-20 0:16 ` [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers Wei Jie Law 1 sibling, 2 replies; 7+ messages in thread From: Wei Jie Law @ 2026-10-20 0:16 UTC (permalink / raw) To: Thangaraj Samynathan, UNGLinuxDriver, Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: Woojung Huh, netdev, linux-usb, linux-kernel, Wei Jie Law, stable lan78xx_update_stats() reads the hardware counters into an on-stack struct lan78xx_statstage. If lan78xx_read_stats() fails, only the rollover check is skipped: the counters are still recomputed from the uninitialized stack buffer and stored in dev->stats.curr_stat, which is then reported to user space by ethtool -S. Keep the previous values when the read fails. Found by code review with LLM assistance. Tested together with the next patch, which makes short reads fail: with an emulated device, ethtool -S then keeps reporting the previous counters. Fixes: 20ff55655a93 ("lan78xx: handle statistics counter rollover") Cc: stable@vger.kernel.org Assisted-by: LLM Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> --- drivers/net/usb/lan78xx.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 5655941f1478..cb8204371f5c 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -789,11 +789,13 @@ static void lan78xx_update_stats(struct lan78xx_net *dev) mutex_lock(&dev->stats.access_lock); - if (lan78xx_read_stats(dev, &lan78xx_stats) > 0) + if (lan78xx_read_stats(dev, &lan78xx_stats) > 0) { lan78xx_check_stat_rollover(dev, &lan78xx_stats); - for (i = 0; i < (sizeof(lan78xx_stats) / (sizeof(u32))); i++) - data[i] = (u64)p[i] + ((u64)count[i] * ((u64)max[i] + 1)); + for (i = 0; i < (sizeof(lan78xx_stats) / (sizeof(u32))); i++) + data[i] = (u64)p[i] + + ((u64)count[i] * ((u64)max[i] + 1)); + } mutex_unlock(&dev->stats.access_lock); -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read 2026-10-20 0:16 ` [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read Wei Jie Law @ 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:36 ` Andrew Lunn 1 sibling, 0 replies; 7+ messages in thread From: sashiko-bot @ 2026-10-20 0:25 UTC (permalink / raw) To: Wei Jie Law; +Cc: linux-usb > lan78xx_update_stats() reads the hardware counters into an on-stack > struct lan78xx_statstage. If lan78xx_read_stats() fails, only the > rollover check is skipped: the counters are still recomputed from the > uninitialized stack buffer and stored in dev->stats.curr_stat, which is > then reported to user space by ethtool -S. > > Keep the previous values when the read fails. > > Found by code review with LLM assistance. Tested together with the next > patch, which makes short reads fail: with an emulated device, ethtool -S > then keeps reporting the previous counters. > > Fixes: 20ff55655a93 ("lan78xx: handle statistics counter rollover") > Cc: stable@vger.kernel.org > Assisted-by: LLM > Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> Sashiko has reviewed this patch and found no issues. -- Sashiko AI review · https://sashiko.dev/#/patchset/20261020001621.2920-1-law.wei.jie@gt.tech.gov.sg?part=1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read 2026-10-20 0:16 ` [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read Wei Jie Law 2026-10-20 0:25 ` sashiko-bot @ 2026-10-20 0:36 ` Andrew Lunn 1 sibling, 0 replies; 7+ messages in thread From: Andrew Lunn @ 2026-10-20 0:36 UTC (permalink / raw) To: Wei Jie Law Cc: Thangaraj Samynathan, UNGLinuxDriver, Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Woojung Huh, netdev, linux-usb, linux-kernel, Wei Jie Law, stable On Tue, Oct 20, 2026 at 08:16:20AM +0800, Wei Jie Law wrote: > lan78xx_update_stats() reads the hardware counters into an on-stack > struct lan78xx_statstage. If lan78xx_read_stats() fails, only the > rollover check is skipped: the counters are still recomputed from the > uninitialized stack buffer and stored in dev->stats.curr_stat, which is > then reported to user space by ethtool -S. > > Keep the previous values when the read fails. > > Found by code review with LLM assistance. Tested together with the next > patch, which makes short reads fail: with an emulated device, ethtool -S > then keeps reporting the previous counters. > > Fixes: 20ff55655a93 ("lan78xx: handle statistics counter rollover") > Cc: stable@vger.kernel.org > Assisted-by: LLM > Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> net-next please. https://www.kernel.org/doc/html/latest/process/maintainer-netdev.html Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers 2026-10-20 0:16 [PATCH net v4 0/2] net: usb: lan78xx: do not use uninitialized data after short reads Wei Jie Law 2026-10-20 0:16 ` [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read Wei Jie Law @ 2026-10-20 0:16 ` Wei Jie Law 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:35 ` Andrew Lunn 1 sibling, 2 replies; 7+ messages in thread From: Wei Jie Law @ 2026-10-20 0:16 UTC (permalink / raw) To: Thangaraj Samynathan, UNGLinuxDriver, Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: Woojung Huh, netdev, linux-usb, linux-kernel, Wei Jie Law, stable, Andrew Lunn lan78xx_read_reg() and lan78xx_read_stats() read from the device into a freshly kmalloc()ed buffer, but only treat a negative return value from usb_control_msg() as an error. A device that answers with fewer bytes than requested leaves part or all of the buffer uninitialized, and those bytes are then used as the register value or the counters. Treat a short transfer as -EIO in both helpers. lan78xx_write_reg() does not use uninitialized data, since it fills its buffer before the transfer, but make it fail on a short transfer as well, so that all the register helpers report a partial transfer as an error. The write path validation was suggested by Andrew. Found by code review with LLM assistance and reproduced with an emulated USB device (raw-gadget + dummy_hcd). Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver") Cc: stable@vger.kernel.org Suggested-by: Andrew Lunn <andrew@lunn.ch> Assisted-by: LLM Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> --- Notes: This patch depends on the previous one. Without it, a failed statistics read would make lan78xx_update_stats() compute the counters from its uninitialized on-stack buffer, so the leak would move from the heap to the stack. Both patches are Cc: stable and should be backported together. drivers/net/usb/lan78xx.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index cb8204371f5c..c19df8e80b52 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -612,6 +612,9 @@ static int lan78xx_read_reg(struct lan78xx_net *dev, u32 index, u32 *data) USB_VENDOR_REQUEST_READ_REGISTER, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, index, buf, 4, USB_CTRL_GET_TIMEOUT); + if (ret >= 0 && ret != sizeof(*buf)) + ret = -EIO; + if (likely(ret >= 0)) { le32_to_cpus(buf); *data = *buf; @@ -645,6 +648,9 @@ static int lan78xx_write_reg(struct lan78xx_net *dev, u32 index, u32 data) USB_VENDOR_REQUEST_WRITE_REGISTER, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, index, buf, 4, USB_CTRL_SET_TIMEOUT); + if (ret >= 0 && ret != sizeof(*buf)) + ret = -EIO; + if (unlikely(ret < 0) && net_ratelimit()) { netdev_warn(dev->net, @@ -695,6 +701,9 @@ static int lan78xx_read_stats(struct lan78xx_net *dev, (void *)stats, sizeof(*stats), USB_CTRL_SET_TIMEOUT); + if (ret >= 0 && ret != sizeof(*stats)) + ret = -EIO; + if (likely(ret >= 0)) { src = (u32 *)stats; dst = (u32 *)data; -- 2.43.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers 2026-10-20 0:16 ` [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers Wei Jie Law @ 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:35 ` Andrew Lunn 1 sibling, 0 replies; 7+ messages in thread From: sashiko-bot @ 2026-10-20 0:25 UTC (permalink / raw) To: Wei Jie Law; +Cc: linux-usb > lan78xx_read_reg() and lan78xx_read_stats() read from the device into > a freshly kmalloc()ed buffer, but only treat a negative return value > from usb_control_msg() as an error. A device that answers with fewer > bytes than requested leaves part or all of the buffer uninitialized, > and those bytes are then used as the register value or the counters. > > Treat a short transfer as -EIO in both helpers. lan78xx_write_reg() > does not use uninitialized data, since it fills its buffer before the > transfer, but make it fail on a short transfer as well, so that all the > register helpers report a partial transfer as an error. > > The write path validation was suggested by Andrew. > > Found by code review with LLM assistance and reproduced with an > emulated USB device (raw-gadget + dummy_hcd). > > Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver") > Cc: stable@vger.kernel.org > Suggested-by: Andrew Lunn <andrew@lunn.ch> > Assisted-by: LLM > Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> Sashiko has reviewed this patch and found no issues. -- Sashiko AI review · https://sashiko.dev/#/patchset/20261020001621.2920-1-law.wei.jie@gt.tech.gov.sg?part=2 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers 2026-10-20 0:16 ` [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers Wei Jie Law 2026-10-20 0:25 ` sashiko-bot @ 2026-10-20 0:35 ` Andrew Lunn 1 sibling, 0 replies; 7+ messages in thread From: Andrew Lunn @ 2026-10-20 0:35 UTC (permalink / raw) To: Wei Jie Law Cc: Thangaraj Samynathan, UNGLinuxDriver, Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Woojung Huh, netdev, linux-usb, linux-kernel, Wei Jie Law, stable On Tue, Oct 20, 2026 at 08:16:21AM +0800, Wei Jie Law wrote: > lan78xx_read_reg() and lan78xx_read_stats() read from the device into > a freshly kmalloc()ed buffer, but only treat a negative return value > from usb_control_msg() as an error. A device that answers with fewer > bytes than requested leaves part or all of the buffer uninitialized, > and those bytes are then used as the register value or the counters. > > Treat a short transfer as -EIO in both helpers. lan78xx_write_reg() > does not use uninitialized data, since it fills its buffer before the > transfer, but make it fail on a short transfer as well, so that all the > register helpers report a partial transfer as an error. > > The write path validation was suggested by Andrew. > > Found by code review with LLM assistance and reproduced with an > emulated USB device (raw-gadget + dummy_hcd). > > Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver") > Cc: stable@vger.kernel.org > Suggested-by: Andrew Lunn <andrew@lunn.ch> > Assisted-by: LLM > Signed-off-by: Wei Jie Law <law.wei.jie@gt.tech.gov.sg> It probably never happens or users would of noticed. Please post to net-next, without the Fixes: tag, once the merge window closes. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-20 0:36 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-20 0:16 [PATCH net v4 0/2] net: usb: lan78xx: do not use uninitialized data after short reads Wei Jie Law 2026-10-20 0:16 ` [PATCH net v4 1/2] net: usb: lan78xx: do not update statistics after a failed read Wei Jie Law 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:36 ` Andrew Lunn 2026-10-20 0:16 ` [PATCH net v4 2/2] net: usb: lan78xx: reject short register and statistics transfers Wei Jie Law 2026-10-20 0:25 ` sashiko-bot 2026-10-20 0:35 ` Andrew Lunn
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.