lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 08 Feb 2022 09:25:45 +0100 From: Paolo Abeni <pabeni@...hat.com> To: Lina Wang <lina.wang@...iatek.com>, "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, Matthias Brugger <matthias.bgg@...il.com>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Andrii Nakryiko <andrii@...nel.org> Cc: netdev@...r.kernel.org, linux-kernel@...r.kernel.org, bpf@...r.kernel.org, Martin KaFai Lau <kafai@...com>, Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>, John Fastabend <john.fastabend@...il.com>, KP Singh <kpsingh@...nel.org>, maze@...gle.com, willemb@...gle.com, edumazet@...gle.com Subject: Re: [PATCH] net: fix wrong network header length Hello, On Tue, 2022-02-08 at 10:55 +0800, Lina Wang wrote: > When clatd starts with ebpf offloaing, and NETIF_F_GRO_FRAGLIST is enable, > several skbs are gathered in skb_shinfo(skb)->frag_list. The first skb's > ipv6 header will be changed to ipv4 after bpf_skb_proto_6_to_4, > network_header\transport_header\mac_header have been updated as ipv4 acts, > but other skbs in frag_list didnot update anything, just ipv6 packets. > > udp_queue_rcv_skb will call skb_segment_list to traverse other skbs in > frag_list and make sure right udp payload is delivered to user space. > Unfortunately, other skbs in frag_list who are still ipv6 packets are > updated like the first skb and will have wrong transport header length. > > e.g.before bpf_skb_proto_6_to_4,the first skb and other skbs in frag_list > has the same network_header(24)& transport_header(64), after > bpf_skb_proto_6_to_4, ipv6 protocol has been changed to ipv4, the first > skb's network_header is 44,transport_header is 64, other skbs in frag_list > didnot change.After skb_segment_list, the other skbs in frag_list has > different network_header(24) and transport_header(44), so there will be 20 > bytes difference,that is difference between ipv6 header and ipv4 header. > Actually, there are two solutions to fix it, one is traversing all skbs > and changing every skb header in bpf_skb_proto_6_to_4, the other is > modifying frag_list skb's header in skb_segment_list. I don't think the above should be addressed into the GSO layer. The ebpf program is changing the GRO packet in arbitrary way violating the GSO packet constraint - arguably, it's corrupting the packet. I think it would be better change the bpf_skb_proto_6_to_4() to properly handle FRAGLIST GSO packets. If traversing the segments become too costly, you can try replacing GRO_FRAGLIST with GRO_UDP_FWD. Thanks! Paolo
Powered by blists - more mailing lists