Re: [PATCH] net: usb: smsc95xx: Limit packet length to skb->len

From: Szymon Heidrich
Date: Thu Mar 16 2023 - 07:14:11 EST


On 16/03/2023 05:24, Jakub Kicinski wrote:
> On Mon, 13 Mar 2023 23:01:24 +0100 Szymon Heidrich wrote:
>> Packet length retrieved from skb data may be larger than
>
> nit: s/skb data/descriptor/ may be better in terms of terminology
>
>> the actual socket buffer length (up to 1526 bytes). In such
>
> nit: the "up to 1526 bytes" is a bit confusing, I'd remove it.
>
>> case the cloned skb passed up the network stack will leak
>> kernel memory contents.
>
>
>
>> Fixes: 2f7ca802bdae ("net: Add SMSC LAN9500 USB2.0 10/100 ethernet adapter driver")
>> Signed-off-by: Szymon Heidrich <szymon.heidrich@xxxxxxxxx>
>> ---
>> drivers/net/usb/smsc95xx.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
>> index 32d2c60d3..ba766bdb2 100644
>> --- a/drivers/net/usb/smsc95xx.c
>> +++ b/drivers/net/usb/smsc95xx.c
>> @@ -1851,7 +1851,8 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
>> }
>> } else {
>> /* ETH_FRAME_LEN + 4(CRC) + 2(COE) + 4(Vlan) */
>> - if (unlikely(size > (ETH_FRAME_LEN + 12))) {
>> + if (unlikely(size > (ETH_FRAME_LEN + 12) ||
>> + size > skb->len)) {
>
> We need this check on both sides of the big if {} statement.
>
> In case the error bit is set and we drop the packet we still
> end up in skb_pull() which if size > skb->len will panic the
> kernel.
>
> So let's do this check right after size and align are calculated?
> The patch for smsc75xx has sadly already been applied so you'll
> need to prepare a fix to the fix :(
>
>> netif_dbg(dev, rx_err, dev->net,
>> "size err header=0x%08x\n", header);
>> return 0;
>

Thank you very much for you suggestions Kuba, I provided an updated patch for
smsc95xx and a new patch addressing smsc75xx. Please let me know in case additional
amendments are required.