From: Szabolcs Nagy <szabolcs.nagy@arm.com>
To: Willem de Bruijn <willemdebruijn.kernel@gmail.com>,
netdev@vger.kernel.org
Cc: davem@davemloft.net, kuba@kernel.org, edumazet@google.com,
pabeni@redhat.com, mst@redhat.com, jasowang@redhat.com,
arefev@swemel.ru, alexander.duyck@gmail.com,
Willem de Bruijn <willemb@google.com>,
stable@vger.kernel.org, Jakub Sitnicki <jakub@cloudflare.com>,
Felix Fietkau <nbd@nbd.name>, Mark Brown <broonie@kernel.org>,
Yury Khrustalev <yury.khrustalev@arm.com>,
nd@arm.com
Subject: Re: [PATCH net v2] net: drop bad gso csum_start and offset in virtio_net_hdr
Date: Fri, 6 Sep 2024 15:35:06 +0100 [thread overview]
Message-ID: <ZtsTGp9FounnxZaN@arm.com> (raw)
In-Reply-To: <20240729201108.1615114-1-willemdebruijn.kernel@gmail.com>
The 07/29/2024 16:10, Willem de Bruijn wrote:
> From: Willem de Bruijn <willemb@google.com>
>
> Tighten csum_start and csum_offset checks in virtio_net_hdr_to_skb
> for GSO packets.
>
> The function already checks that a checksum requested with
> VIRTIO_NET_HDR_F_NEEDS_CSUM is in skb linear. But for GSO packets
> this might not hold for segs after segmentation.
>
> Syzkaller demonstrated to reach this warning in skb_checksum_help
>
> offset = skb_checksum_start_offset(skb);
> ret = -EINVAL;
> if (WARN_ON_ONCE(offset >= skb_headlen(skb)))
>
> By injecting a TSO packet:
>
> WARNING: CPU: 1 PID: 3539 at net/core/dev.c:3284 skb_checksum_help+0x3d0/0x5b0
> ip_do_fragment+0x209/0x1b20 net/ipv4/ip_output.c:774
> ip_finish_output_gso net/ipv4/ip_output.c:279 [inline]
> __ip_finish_output+0x2bd/0x4b0 net/ipv4/ip_output.c:301
> iptunnel_xmit+0x50c/0x930 net/ipv4/ip_tunnel_core.c:82
> ip_tunnel_xmit+0x2296/0x2c70 net/ipv4/ip_tunnel.c:813
> __gre_xmit net/ipv4/ip_gre.c:469 [inline]
> ipgre_xmit+0x759/0xa60 net/ipv4/ip_gre.c:661
> __netdev_start_xmit include/linux/netdevice.h:4850 [inline]
> netdev_start_xmit include/linux/netdevice.h:4864 [inline]
> xmit_one net/core/dev.c:3595 [inline]
> dev_hard_start_xmit+0x261/0x8c0 net/core/dev.c:3611
> __dev_queue_xmit+0x1b97/0x3c90 net/core/dev.c:4261
> packet_snd net/packet/af_packet.c:3073 [inline]
>
> The geometry of the bad input packet at tcp_gso_segment:
>
> [ 52.003050][ T8403] skb len=12202 headroom=244 headlen=12093 tailroom=0
> [ 52.003050][ T8403] mac=(168,24) mac_len=24 net=(192,52) trans=244
> [ 52.003050][ T8403] shinfo(txflags=0 nr_frags=1 gso(size=1552 type=3 segs=0))
> [ 52.003050][ T8403] csum(0x60000c7 start=199 offset=1536
> ip_summed=3 complete_sw=0 valid=0 level=0)
>
> Mitigate with stricter input validation.
>
> csum_offset: for GSO packets, deduce the correct value from gso_type.
> This is already done for USO. Extend it to TSO. Let UFO be:
> udp[46]_ufo_fragment ignores these fields and always computes the
> checksum in software.
>
> csum_start: finding the real offset requires parsing to the transport
> header. Do not add a parser, use existing segmentation parsing. Thanks
> to SKB_GSO_DODGY, that also catches bad packets that are hw offloaded.
> Again test both TSO and USO. Do not test UFO for the above reason, and
> do not test UDP tunnel offload.
>
> GSO packet are almost always CHECKSUM_PARTIAL. USO packets may be
> CHECKSUM_NONE since commit 10154dbded6d6 ("udp: Allow GSO transmit
> from devices with no checksum offload"), but then still these fields
> are initialized correctly in udp4_hwcsum/udp6_hwcsum_outgoing. So no
> need to test for ip_summed == CHECKSUM_PARTIAL first.
>
> This revises an existing fix mentioned in the Fixes tag, which broke
> small packets with GSO offload, as detected by kselftests.
>
> Link: https://syzkaller.appspot.com/bug?extid=e1db31216c789f552871
> Link: https://lore.kernel.org/netdev/20240723223109.2196886-1-kuba@kernel.org
> Fixes: e269d79c7d35 ("net: missing check virtio")
> Cc: stable@vger.kernel.org
> Signed-off-by: Willem de Bruijn <willemb@google.com>
>
> ---
>
> v1->v2
> - skb_transport_header instead of skb->transport_header (edumazet@)
> - typo: migitate -> mitigate
> ---
this breaks booting from nfs root on an arm64 fvp
model for me.
i see two fixup commits
commit 30b03f2a0592eee1267298298eac9dd655f55ab2
Author: Jakub Sitnicki <jakub@cloudflare.com>
AuthorDate: 2024-08-08 11:56:22 +0200
Commit: Jakub Kicinski <kuba@kernel.org>
CommitDate: 2024-08-09 21:58:08 -0700
udp: Fall back to software USO if IPv6 extension headers are present
and
commit b128ed5ab27330deeeaf51ea8bb69f1442a96f7f
Author: Felix Fietkau <nbd@nbd.name>
AuthorDate: 2024-08-19 17:06:21 +0200
Commit: Jakub Kicinski <kuba@kernel.org>
CommitDate: 2024-08-21 17:15:05 -0700
udp: fix receiving fraglist GSO packets
but they don't fix the issue for me,
at the boot console i see
...
[ 3.686846] Sending DHCP requests ., OK
[ 3.687302] IP-Config: Got DHCP answer from 172.20.51.254, my address is 172.20.51.1
[ 3.687423] IP-Config: Complete:
[ 3.687482] device=eth0, hwaddr=ea:0d:79:71:af:cd, ipaddr=172.20.51.1, mask=255.255.255.0, gw=172.20.51.254
[ 3.687631] host=172.20.51.1, domain=, nis-domain=(none)
[ 3.687719] bootserver=172.20.51.254, rootserver=10.2.80.41, rootpath=
[ 3.687771] nameserver0=172.20.51.254, nameserver1=172.20.51.252, nameserver2=172.20.51.251
[ 3.689075] clk: Disabling unused clocks
[ 3.689167] PM: genpd: Disabling unused power domains
[ 3.689258] ALSA device list:
[ 3.689330] No soundcards found.
[ 3.716297] VFS: Mounted root (nfs4 filesystem) on device 0:24.
[ 3.716843] devtmpfs: mounted
[ 3.734352] Freeing unused kernel memory: 10112K
[ 3.735178] Run /sbin/init as init process
[ 3.743770] eth0: bad gso: type: 1, size: 1440
[ 3.744186] eth0: bad gso: type: 1, size: 1440
...
[ 154.610991] eth0: bad gso: type: 1, size: 1440
[ 185.330941] nfs: server 10.2.80.41 not responding, still trying
...
the "bad gso" message keeps repeating and init
is not executed.
if i revert the 3 patches above on 6.11-rc6 then
init runs without "bad gso" error.
this affects testing the arm64-gcs patches on
top of 6.11-rc3 and 6.11-rc6
not sure if this is an fvp or kernel bug.
next prev parent reply other threads:[~2024-09-06 14:35 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-29 20:10 [PATCH net v2] net: drop bad gso csum_start and offset in virtio_net_hdr Willem de Bruijn
2024-07-31 2:00 ` patchwork-bot+netdevbpf
2024-09-06 14:35 ` Szabolcs Nagy [this message]
2024-09-06 15:52 ` Willem de Bruijn
2024-09-08 20:09 ` Willem de Bruijn
2024-09-08 20:43 ` Michael S. Tsirkin
2024-09-09 2:33 ` Jason Wang
2024-09-09 3:02 ` Willem de Bruijn
2024-09-09 3:24 ` Jason Wang
2024-09-09 3:39 ` Willem de Bruijn
2024-09-09 4:14 ` Jason Wang
2024-09-09 15:20 ` Willem de Bruijn
2024-09-09 21:09 ` Willem de Bruijn
2024-09-10 1:12 ` Willem de Bruijn
2024-09-09 9:45 ` Szabolcs Nagy
2024-09-09 11:14 ` Mark Brown
2024-09-09 15:14 ` Sudeep Holla
2024-09-09 15:21 ` Willem de Bruijn
2024-09-09 10:13 ` Yury Khrustalev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZtsTGp9FounnxZaN@arm.com \
--to=szabolcs.nagy@arm.com \
--cc=alexander.duyck@gmail.com \
--cc=arefev@swemel.ru \
--cc=broonie@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jakub@cloudflare.com \
--cc=jasowang@redhat.com \
--cc=kuba@kernel.org \
--cc=mst@redhat.com \
--cc=nbd@nbd.name \
--cc=nd@arm.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=stable@vger.kernel.org \
--cc=willemb@google.com \
--cc=willemdebruijn.kernel@gmail.com \
--cc=yury.khrustalev@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).