Patch "ipv6: Fix an uninit variable access bug in __ip6_make_skb()" has been added to the 4.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipv6: Fix an uninit variable access bug in __ip6_make_skb()

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipv6-fix-an-uninit-variable-access-bug-in-__ip6_make.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b93bf3bcd3bdab56232abb5a45242301a1cbd7cd
Author: Ziyang Xuan <william.xuanziyang@xxxxxxxxxx>
Date:   Mon Apr 3 15:34:17 2023 +0800

    ipv6: Fix an uninit variable access bug in __ip6_make_skb()
    
    [ Upstream commit ea30388baebcce37fd594d425a65037ca35e59e8 ]
    
    Syzbot reported a bug as following:
    
    =====================================================
    BUG: KMSAN: uninit-value in arch_atomic64_inc arch/x86/include/asm/atomic64_64.h:88 [inline]
    BUG: KMSAN: uninit-value in arch_atomic_long_inc include/linux/atomic/atomic-long.h:161 [inline]
    BUG: KMSAN: uninit-value in atomic_long_inc include/linux/atomic/atomic-instrumented.h:1429 [inline]
    BUG: KMSAN: uninit-value in __ip6_make_skb+0x2f37/0x30f0 net/ipv6/ip6_output.c:1956
     arch_atomic64_inc arch/x86/include/asm/atomic64_64.h:88 [inline]
     arch_atomic_long_inc include/linux/atomic/atomic-long.h:161 [inline]
     atomic_long_inc include/linux/atomic/atomic-instrumented.h:1429 [inline]
     __ip6_make_skb+0x2f37/0x30f0 net/ipv6/ip6_output.c:1956
     ip6_finish_skb include/net/ipv6.h:1122 [inline]
     ip6_push_pending_frames+0x10e/0x550 net/ipv6/ip6_output.c:1987
     rawv6_push_pending_frames+0xb12/0xb90 net/ipv6/raw.c:579
     rawv6_sendmsg+0x297e/0x2e60 net/ipv6/raw.c:922
     inet_sendmsg+0x101/0x180 net/ipv4/af_inet.c:827
     sock_sendmsg_nosec net/socket.c:714 [inline]
     sock_sendmsg net/socket.c:734 [inline]
     ____sys_sendmsg+0xa8e/0xe70 net/socket.c:2476
     ___sys_sendmsg+0x2a1/0x3f0 net/socket.c:2530
     __sys_sendmsg net/socket.c:2559 [inline]
     __do_sys_sendmsg net/socket.c:2568 [inline]
     __se_sys_sendmsg net/socket.c:2566 [inline]
     __x64_sys_sendmsg+0x367/0x540 net/socket.c:2566
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Uninit was created at:
     slab_post_alloc_hook mm/slab.h:766 [inline]
     slab_alloc_node mm/slub.c:3452 [inline]
     __kmem_cache_alloc_node+0x71f/0xce0 mm/slub.c:3491
     __do_kmalloc_node mm/slab_common.c:967 [inline]
     __kmalloc_node_track_caller+0x114/0x3b0 mm/slab_common.c:988
     kmalloc_reserve net/core/skbuff.c:492 [inline]
     __alloc_skb+0x3af/0x8f0 net/core/skbuff.c:565
     alloc_skb include/linux/skbuff.h:1270 [inline]
     __ip6_append_data+0x51c1/0x6bb0 net/ipv6/ip6_output.c:1684
     ip6_append_data+0x411/0x580 net/ipv6/ip6_output.c:1854
     rawv6_sendmsg+0x2882/0x2e60 net/ipv6/raw.c:915
     inet_sendmsg+0x101/0x180 net/ipv4/af_inet.c:827
     sock_sendmsg_nosec net/socket.c:714 [inline]
     sock_sendmsg net/socket.c:734 [inline]
     ____sys_sendmsg+0xa8e/0xe70 net/socket.c:2476
     ___sys_sendmsg+0x2a1/0x3f0 net/socket.c:2530
     __sys_sendmsg net/socket.c:2559 [inline]
     __do_sys_sendmsg net/socket.c:2568 [inline]
     __se_sys_sendmsg net/socket.c:2566 [inline]
     __x64_sys_sendmsg+0x367/0x540 net/socket.c:2566
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    It is because icmp6hdr does not in skb linear region under the scenario
    of SOCK_RAW socket. Access icmp6_hdr(skb)->icmp6_type directly will
    trigger the uninit variable access bug.
    
    Use a local variable icmp6_type to carry the correct value in different
    scenarios.
    
    Fixes: 14878f75abd5 ("[IPV6]: Add ICMPMsgStats MIB (RFC 4293) [rev 2]")
    Reported-by: syzbot+8257f4dcef79de670baf@xxxxxxxxxxxxxxxxxxxxxxxxx
    Link: https://syzkaller.appspot.com/bug?id=3d605ec1d0a7f2a269a1a6936ac7f2b85975ee9c
    Signed-off-by: Ziyang Xuan <william.xuanziyang@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 4f40331ceb5ae..36647d3211074 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1715,8 +1715,13 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
 	IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
 	if (proto == IPPROTO_ICMPV6) {
 		struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
+		u8 icmp6_type;
 
-		ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type);
+		if (sk->sk_socket->type == SOCK_RAW && !inet_sk(sk)->hdrincl)
+			icmp6_type = fl6->fl6_icmp_type;
+		else
+			icmp6_type = icmp6_hdr(skb)->icmp6_type;
+		ICMP6MSGOUT_INC_STATS(net, idev, icmp6_type);
 		ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
 	}
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux