summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorAndrea Mayer <andrea.mayer@uniroma2.it>2026-10-28 18:15:11 +0100
committerJakub Kicinski <kuba@kernel.org>2026-10-29 16:56:36 -0700
commit5838f10563d58afca6711edb5e4eda968ca181d9 (patch)
treecfa96b48875672e0e6ca8d9eca57c673d99cca18 /include/linux
parent4dd16e31135ea8437a720222df34e8745f385d6d (diff)
seg6: fix transport header for inner IPv4 with IP options
The End.DT4, End.DT46 (its IPv4 path only) and End.DX4 behaviors set the transport header of the decapsulated IPv4 packet at a fixed 20 bytes, the size of an IPv4 header without options. They do not validate the header length either. With options, the transport header points at the first option byte. The effects include: - ping -R sends an echo request with a 60-byte IPv4 header to a local address through an End.DT4 or an End.DX4 SID. Since icmp_rcv() computes the ICMP checksum from the first option byte, the request fails the check and is counted in IcmpInCsumErrors. - A UDP datagram can reach a port that an iptables rule drops. The rule checks the UDP header after the full IPv4 header, while the socket lookup reads it at the fixed 20-byte offset. - With an inbound AH state, ah_input() reads the AH header at the fixed 20-byte offset, but copies the IPv4 header over it with the length in the IHL field. A packet shorter than that length can make ah_input() write past the end of the data, into skb_shared_info when the skb has no tailroom. Validate the inner IPv4 header length with the new helper seg6_validate_iphdr_len() and set the transport header at that length. A packet that is not IPv4, whose header length field is below 5, or whose header is truncated, is dropped with a drop reason. The fix is limited to the header length, which the transport header relies on. Other checks done on IPv4 input, such as the header checksum, the total length and the IP options, are not addressed here. Found by code inspection while reviewing commit 44930446dde4 ("ipv6: seg6: clear IPv4 control block on IPIP decapsulation"), as a pre-existing issue that Sashiko also reported on v2 of that patch. Without this patch, a bpftrace probe on ah_input() shows the reporter's reproducer packet written into skb_shared_info. With it, that packet is dropped before ah_input(), ping -R no longer fails the ICMP checksum, the UDP datagram reaches its real port, and the SRv6 selftests still pass. These effects reproduce on an unmodified kernel, without error injection. Fixes: 891ef8dd2a8d ("ipv6: sr: implement additional seg6local actions") Fixes: 664d6f86868b ("seg6: add support for the SRv6 End.DT4 behavior") Reported-by: Hazley Samsudin <hazleycryilis@gmail.com> Closes: https://lore.kernel.org/netdev/20260809221915.2ffc1ecd0f445fcb70270e31@uniroma2.it/ Reviewed-by: David Ahern <dsahern@kernel.org> Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn> Signed-off-by: Andrea Mayer <andrea.mayer@uniroma2.it> Link: https://patch.msgid.link/20261028171511.35-1-andrea.mayer@uniroma2.it Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include/linux')
0 files changed, 0 insertions, 0 deletions