<div dir="ltr"><div>Acked-by: Luke Nowakowski-Krijger <<a href="mailto:luke.nowakowskikrijger@canonical.com">luke.nowakowskikrijger@canonical.com</a>><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 2, 2022 at 6:27 AM Tim Gardner <<a href="mailto:tim.gardner@canonical.com">tim.gardner@canonical.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Eric Dumazet <<a href="mailto:edumazet@google.com" target="_blank">edumazet@google.com</a>><br>
<br>
BugLink: <a href="https://bugs.launchpad.net/bugs/1981658" rel="noreferrer" target="_blank">https://bugs.launchpad.net/bugs/1981658</a><br>
<br>
commit ba5a4fdd63ae0c575707030db0b634b160baddd7 upstream.<br>
<br>
syzbot complained about a recent change in TCP stack,<br>
hitting a NULL pointer [1]<br>
<br>
tcp request sockets have an af_specific pointer, which<br>
was used before the blamed change only for SYNACK generation<br>
in non SYNCOOKIE mode.<br>
<br>
tcp requests sockets momentarily created when third packet<br>
coming from client in SYNCOOKIE mode were not using<br>
treq->af_specific.<br>
<br>
Make sure this field is populated, in the same way normal<br>
TCP requests sockets do in tcp_conn_request().<br>
<br>
[1]<br>
TCP: request_sock_TCPv6: Possible SYN flooding on port 20002. Sending cookies.  Check SNMP counters.<br>
general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN<br>
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]<br>
CPU: 1 PID: 3695 Comm: syz-executor864 Not tainted 5.18.0-rc3-syzkaller-00224-g5fd1fe4807f9 #0<br>
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011<br>
RIP: 0010:tcp_create_openreq_child+0xe16/0x16b0 net/ipv4/tcp_minisocks.c:534<br>
Code: 48 c1 ea 03 80 3c 02 00 0f 85 e5 07 00 00 4c 8b b3 28 01 00 00 48 b8 00 00 00 00 00 fc ff df 49 8d 7e 08 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c9 07 00 00 48 8b 3c 24 48 89 de 41 ff 56 08 48<br>
RSP: 0018:ffffc90000de0588 EFLAGS: 00010202<br>
RAX: dffffc0000000000 RBX: ffff888076490330 RCX: 0000000000000100<br>
RDX: 0000000000000001 RSI: ffffffff87d67ff0 RDI: 0000000000000008<br>
RBP: ffff88806ee1c7f8 R08: 0000000000000000 R09: 0000000000000000<br>
R10: ffffffff87d67f00 R11: 0000000000000000 R12: ffff88806ee1bfc0<br>
R13: ffff88801b0e0368 R14: 0000000000000000 R15: 0000000000000000<br>
FS:  00007f517fe58700(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000<br>
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033<br>
CR2: 00007ffcead76960 CR3: 000000006f97b000 CR4: 00000000003506e0<br>
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000<br>
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400<br>
Call Trace:<br>
 <IRQ><br>
 tcp_v6_syn_recv_sock+0x199/0x23b0 net/ipv6/tcp_ipv6.c:1267<br>
 tcp_get_cookie_sock+0xc9/0x850 net/ipv4/syncookies.c:207<br>
 cookie_v6_check+0x15c3/0x2340 net/ipv6/syncookies.c:258<br>
 tcp_v6_cookie_check net/ipv6/tcp_ipv6.c:1131 [inline]<br>
 tcp_v6_do_rcv+0x1148/0x13b0 net/ipv6/tcp_ipv6.c:1486<br>
 tcp_v6_rcv+0x3305/0x3840 net/ipv6/tcp_ipv6.c:1725<br>
 ip6_protocol_deliver_rcu+0x2e9/0x1900 net/ipv6/ip6_input.c:422<br>
 ip6_input_finish+0x14c/0x2c0 net/ipv6/ip6_input.c:464<br>
 NF_HOOK include/linux/netfilter.h:307 [inline]<br>
 NF_HOOK include/linux/netfilter.h:301 [inline]<br>
 ip6_input+0x9c/0xd0 net/ipv6/ip6_input.c:473<br>
 dst_input include/net/dst.h:461 [inline]<br>
 ip6_rcv_finish net/ipv6/ip6_input.c:76 [inline]<br>
 NF_HOOK include/linux/netfilter.h:307 [inline]<br>
 NF_HOOK include/linux/netfilter.h:301 [inline]<br>
 ipv6_rcv+0x27f/0x3b0 net/ipv6/ip6_input.c:297<br>
 __netif_receive_skb_one_core+0x114/0x180 net/core/dev.c:5405<br>
 __netif_receive_skb+0x24/0x1b0 net/core/dev.c:5519<br>
 process_backlog+0x3a0/0x7c0 net/core/dev.c:5847<br>
 __napi_poll+0xb3/0x6e0 net/core/dev.c:6413<br>
 napi_poll net/core/dev.c:6480 [inline]<br>
 net_rx_action+0x8ec/0xc60 net/core/dev.c:6567<br>
 __do_softirq+0x29b/0x9c2 kernel/softirq.c:558<br>
 invoke_softirq kernel/softirq.c:432 [inline]<br>
 __irq_exit_rcu+0x123/0x180 kernel/softirq.c:637<br>
 irq_exit_rcu+0x5/0x20 kernel/softirq.c:649<br>
 sysvec_apic_timer_interrupt+0x93/0xc0 arch/x86/kernel/apic/apic.c:1097<br>
<br>
Fixes: 5b0b9e4c2c89 ("tcp: md5: incorrect tcp_header_len for incoming connections")<br>
Signed-off-by: Eric Dumazet <<a href="mailto:edumazet@google.com" target="_blank">edumazet@google.com</a>><br>
Cc: Francesco Ruggeri <<a href="mailto:fruggeri@arista.com" target="_blank">fruggeri@arista.com</a>><br>
Signed-off-by: David S. Miller <<a href="mailto:davem@davemloft.net" target="_blank">davem@davemloft.net</a>><br>
[fruggeri: Account for backport conflicts from 35b2c3211609 and 6fc8c827dd4f]<br>
Signed-off-by: Francesco Ruggeri <<a href="mailto:fruggeri@arista.com" target="_blank">fruggeri@arista.com</a>><br>
Signed-off-by: Greg Kroah-Hartman <<a href="mailto:gregkh@linuxfoundation.org" target="_blank">gregkh@linuxfoundation.org</a>><br>
(cherry picked from commit 6c2176f5ad48095aa1e2608b51bada5bebc568c1 linux-4.19.y)<br>
Signed-off-by: Tim Gardner <<a href="mailto:tim.gardner@canonical.com" target="_blank">tim.gardner@canonical.com</a>><br>
---<br>
<br>
This patch necessitates a respin for all 4.15 based kernels.<br>
<br>
---<br>
 include/net/tcp.h     | 5 +++++<br>
 net/ipv4/syncookies.c | 1 +<br>
 net/ipv4/tcp_ipv4.c   | 2 +-<br>
 net/ipv6/syncookies.c | 1 +<br>
 net/ipv6/tcp_ipv6.c   | 2 +-<br>
 5 files changed, 9 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/include/net/tcp.h b/include/net/tcp.h<br>
index 6f8c1aab59d1..8750147b15ca 100644<br>
--- a/include/net/tcp.h<br>
+++ b/include/net/tcp.h<br>
@@ -1870,6 +1870,11 @@ struct tcp_request_sock_ops {<br>
                           enum tcp_synack_type synack_type);<br>
 };<br>
<br>
+extern const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops;<br>
+#if IS_ENABLED(CONFIG_IPV6)<br>
+extern const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops;<br>
+#endif<br>
+<br>
 #ifdef CONFIG_SYN_COOKIES<br>
 static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops,<br>
                                         const struct sock *sk, struct sk_buff *skb,<br>
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c<br>
index 7e43d867fe21..7c1f1131b965 100644<br>
--- a/net/ipv4/syncookies.c<br>
+++ b/net/ipv4/syncookies.c<br>
@@ -337,6 +337,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)<br>
<br>
        ireq = inet_rsk(req);<br>
        treq = tcp_rsk(req);<br>
+       treq->af_specific       = &tcp_request_sock_ipv4_ops;<br>
        treq->rcv_isn           = ntohl(th->seq) - 1;<br>
        treq->snt_isn           = cookie;<br>
        treq->ts_off            = 0;<br>
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c<br>
index 8dd878f18aa7..e14183cf8b2a 100644<br>
--- a/net/ipv4/tcp_ipv4.c<br>
+++ b/net/ipv4/tcp_ipv4.c<br>
@@ -1306,7 +1306,7 @@ struct request_sock_ops tcp_request_sock_ops __read_mostly = {<br>
        .syn_ack_timeout =      tcp_syn_ack_timeout,<br>
 };<br>
<br>
-static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {<br>
+const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {<br>
        .mss_clamp      =       TCP_MSS_DEFAULT,<br>
 #ifdef CONFIG_TCP_MD5SIG<br>
        .req_md5_lookup =       tcp_v4_md5_lookup,<br>
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c<br>
index 4e6c886f1b73..84b2858f82c0 100644<br>
--- a/net/ipv6/syncookies.c<br>
+++ b/net/ipv6/syncookies.c<br>
@@ -181,6 +181,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)<br>
<br>
        ireq = inet_rsk(req);<br>
        treq = tcp_rsk(req);<br>
+       treq->af_specific = &tcp_request_sock_ipv6_ops;<br>
        treq->tfo_listener = false;<br>
<br>
        if (security_inet_conn_request(sk, skb, req))<br>
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c<br>
index faad76566be3..3a0d50ac30e1 100644<br>
--- a/net/ipv6/tcp_ipv6.c<br>
+++ b/net/ipv6/tcp_ipv6.c<br>
@@ -774,7 +774,7 @@ struct request_sock_ops tcp6_request_sock_ops __read_mostly = {<br>
        .syn_ack_timeout =      tcp_syn_ack_timeout,<br>
 };<br>
<br>
-static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {<br>
+const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {<br>
        .mss_clamp      =       IPV6_MIN_MTU - sizeof(struct tcphdr) -<br>
                                sizeof(struct ipv6hdr),<br>
 #ifdef CONFIG_TCP_MD5SIG<br>
-- <br>
2.37.1<br>
<br>
<br>
-- <br>
kernel-team mailing list<br>
<a href="mailto:kernel-team@lists.ubuntu.com" target="_blank">kernel-team@lists.ubuntu.com</a><br>
<a href="https://lists.ubuntu.com/mailman/listinfo/kernel-team" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/kernel-team</a><br>
</blockquote></div></div>