From: Kuniyuki Iwashima <kuniyu@amazon.com>
To: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
David Ahern <dsahern@kernel.org>
Cc: Steffen Klassert <steffen.klassert@secunet.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
Willem de Bruijn <willemb@google.com>,
Kuniyuki Iwashima <kuniyu@amazon.com>,
Kuniyuki Iwashima <kuni1840@gmail.com>, <netdev@vger.kernel.org>,
syzkaller <syzkaller@googlegroups.com>
Subject: [PATCH v1 net 1/5] sit: Pull header after checking skb->protocol in sit_tunnel_xmit().
Date: Mon, 15 Apr 2024 15:20:37 -0700 [thread overview]
Message-ID: <20240415222041.18537-2-kuniyu@amazon.com> (raw)
In-Reply-To: <20240415222041.18537-1-kuniyu@amazon.com>
syzkaller crafted a GSO packet of ETH_P_8021AD + ETH_P_NSH and sent it
over sit0.
After nsh_gso_segment(), skb->data - skb->head was 138, on the other
hand, skb->network_header was 128.
Later, sit_tunnel_xmit() called pskb_inet_may_pull() for the skb, and
it caused underflow and triggered the warning in pskb_may_pull_reason().
pskb_network_may_pull(skb, nhlen)
`- pskb_may_pull(skb, skb_network_offset(skb) + nhlen)
-> skb_network_offset(skb) + nhlen
= skb_network_offset(skb) + 0 (because skb->protocol is not IPv4/IPv6)
= skb_network_header(skb) - skb->data
= skb->head + skb->network_header - skb->data
= 128 - 138
= -10
Let's check skb->protocol before pulling the next header in
sit_tunnel_xmit().
WARNING: CPU: 1 PID: 5300 at include/linux/skbuff.h:2740 pskb_may_pull_reason include/linux/skbuff.h:2740 [inline]
WARNING: CPU: 1 PID: 5300 at include/linux/skbuff.h:2740 pskb_may_pull include/linux/skbuff.h:2756 [inline]
WARNING: CPU: 1 PID: 5300 at include/linux/skbuff.h:2740 pskb_network_may_pull include/linux/skbuff.h:3077 [inline]
WARNING: CPU: 1 PID: 5300 at include/linux/skbuff.h:2740 pskb_inet_may_pull include/net/ip_tunnels.h:361 [inline]
WARNING: CPU: 1 PID: 5300 at include/linux/skbuff.h:2740 sit_tunnel_xmit+0x1080/0x1fd8 net/ipv6/sit.c:1068
Modules linked in:
CPU: 1 PID: 5300 Comm: syz-executor.5 Not tainted 6.8.0-12821-g537c2e91d354-dirty #11
Hardware name: linux,dummy-virt (DT)
pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : pskb_may_pull_reason include/linux/skbuff.h:2740 [inline]
pc : pskb_may_pull include/linux/skbuff.h:2756 [inline]
pc : pskb_network_may_pull include/linux/skbuff.h:3077 [inline]
pc : pskb_inet_may_pull include/net/ip_tunnels.h:361 [inline]
pc : sit_tunnel_xmit+0x1080/0x1fd8 net/ipv6/sit.c:1068
lr : pskb_may_pull_reason include/linux/skbuff.h:2740 [inline]
lr : pskb_may_pull include/linux/skbuff.h:2756 [inline]
lr : pskb_network_may_pull include/linux/skbuff.h:3077 [inline]
lr : pskb_inet_may_pull include/net/ip_tunnels.h:361 [inline]
lr : sit_tunnel_xmit+0x1080/0x1fd8 net/ipv6/sit.c:1068
sp : ffff8000aa017260
x29: ffff8000aa0173e0 x28: ffff00000cd0c000 x27: ffff000046200080
x26: ffff700015402e64 x25: 00000000fffffff6 x24: 1fffe00009835b7f
x23: dfff800000000000 x22: ffff00004c1adbf4 x21: ffff00004c1adbf8
x20: ffff00004c1adb40 x19: 1fffe00009835b7e x18: ffff800086d72d10
x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000001
x14: 1fffe0000a15c217 x13: 0000000000000000 x12: ffff8000aa017320
x11: 0000000000040000 x10: 0000000000000b86 x9 : ffff8000a2639000
x8 : 0000000000000b87 x7 : 0000000000000001 x6 : 0000000000000001
x5 : ffff8000aa016c98 x4 : ffff800086d8b120 x3 : ffff800083f7f7d4
x2 : 0000000000000001 x1 : 00000000fffffff6 x0 : 0000000000000000
Call trace:
pskb_may_pull_reason include/linux/skbuff.h:2740 [inline]
pskb_may_pull include/linux/skbuff.h:2756 [inline]
pskb_network_may_pull include/linux/skbuff.h:3077 [inline]
pskb_inet_may_pull include/net/ip_tunnels.h:361 [inline]
sit_tunnel_xmit+0x1080/0x1fd8 net/ipv6/sit.c:1068
__netdev_start_xmit include/linux/netdevice.h:4903 [inline]
netdev_start_xmit include/linux/netdevice.h:4917 [inline]
xmit_one net/core/dev.c:3531 [inline]
dev_hard_start_xmit+0x1a0/0x370 net/core/dev.c:3547
__dev_queue_xmit+0x12e8/0x2b04 net/core/dev.c:4335
dev_queue_xmit include/linux/netdevice.h:3091 [inline]
packet_xmit+0x6c/0x31c net/packet/af_packet.c:276
packet_snd net/packet/af_packet.c:3081 [inline]
packet_sendmsg+0x3818/0x4e50 net/packet/af_packet.c:3113
sock_sendmsg_nosec net/socket.c:730 [inline]
__sock_sendmsg net/socket.c:745 [inline]
__sys_sendto+0x324/0x470 net/socket.c:2191
__do_sys_sendto net/socket.c:2203 [inline]
__se_sys_sendto net/socket.c:2199 [inline]
__arm64_sys_sendto+0xd8/0xf8 net/socket.c:2199
__invoke_syscall arch/arm64/kernel/syscall.c:34 [inline]
invoke_syscall+0x98/0x2b8 arch/arm64/kernel/syscall.c:48
el0_svc_common+0x130/0x23c arch/arm64/kernel/syscall.c:133
do_el0_svc+0x48/0x58 arch/arm64/kernel/syscall.c:152
el0_svc+0x30/0x78 arch/arm64/kernel/entry-common.c:712
el0t_64_sync_handler+0x84/0xfc arch/arm64/kernel/entry-common.c:730
el0t_64_sync+0x190/0x194 arch/arm64/kernel/entry.S:598
Reported-by: syzkaller <syzkaller@googlegroups.com>
Fixes: cb9f1b783850 ("ip: validate header length on virtual device xmit")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
net/ipv6/sit.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 655c9b1a19b8..b83c28369d46 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1065,14 +1065,17 @@ static netdev_tx_t sit_tunnel_xmit__(struct sk_buff *skb,
static netdev_tx_t sit_tunnel_xmit(struct sk_buff *skb,
struct net_device *dev)
{
- if (!pskb_inet_may_pull(skb))
- goto tx_err;
-
switch (skb->protocol) {
case htons(ETH_P_IP):
+ if (!pskb_network_may_pull(skb, sizeof(struct iphdr)))
+ goto tx_err;
+
sit_tunnel_xmit__(skb, dev, IPPROTO_IPIP);
break;
case htons(ETH_P_IPV6):
+ if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr)))
+ goto tx_err;
+
ipip6_tunnel_xmit(skb, dev);
break;
#if IS_ENABLED(CONFIG_MPLS)
--
2.30.2
next prev parent reply other threads:[~2024-04-15 22:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-15 22:20 [PATCH v1 net 0/5] ip: Fix warning in pskb_may_pull_reason() for tunnel devices Kuniyuki Iwashima
2024-04-15 22:20 ` Kuniyuki Iwashima [this message]
2024-04-18 2:04 ` [PATCH v1 net 1/5] sit: Pull header after checking skb->protocol in sit_tunnel_xmit() Jakub Kicinski
2024-04-18 3:31 ` Kuniyuki Iwashima
2024-04-18 6:56 ` Eric Dumazet
2024-04-18 7:00 ` Eric Dumazet
2024-04-18 8:57 ` Paolo Abeni
2024-04-18 17:02 ` Kuniyuki Iwashima
2024-04-15 22:20 ` [PATCH v1 net 2/5] vti: Pull header after checking skb->protocol in vti_tunnel_xmit() Kuniyuki Iwashima
2024-04-15 22:20 ` [PATCH v1 net 3/5] ip6_vti: Pull header after checking skb->protocol in vti6_tnl_xmit() Kuniyuki Iwashima
2024-04-15 22:20 ` [PATCH v1 net 4/5] ipip: Pull header after checking skb->protocol in ipip_tunnel_xmit() Kuniyuki Iwashima
2024-04-15 22:20 ` [PATCH v1 net 5/5] ip6_tunnel: Pull header after checking skb->protocol in ip6_tnl_start_xmit() Kuniyuki Iwashima
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=20240415222041.18537-2-kuniyu@amazon.com \
--to=kuniyu@amazon.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=herbert@gondor.apana.org.au \
--cc=kuba@kernel.org \
--cc=kuni1840@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=steffen.klassert@secunet.com \
--cc=syzkaller@googlegroups.com \
--cc=willemb@google.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 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.