Patch "ip6mr: fix UAF issue in ip6mr_sk_done() when addrconf_init_net() failed" has been added to the 6.0-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

    ip6mr: fix UAF issue in ip6mr_sk_done() when addrconf_init_net() failed

to the 6.0-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:
     ip6mr-fix-uaf-issue-in-ip6mr_sk_done-when-addrconf_i.patch
and it can be found in the queue-6.0 subdirectory.

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



commit 4ba656b77ee49b3a5e095ab41072c7fa82465edc
Author: Zhengchao Shao <shaozhengchao@xxxxxxxxxx>
Date:   Mon Oct 17 16:03:31 2022 +0800

    ip6mr: fix UAF issue in ip6mr_sk_done() when addrconf_init_net() failed
    
    [ Upstream commit 1ca695207ed2271ecbf8ee6c641970f621c157cc ]
    
    If the initialization fails in calling addrconf_init_net(), devconf_all is
    the pointer that has been released. Then ip6mr_sk_done() is called to
    release the net, accessing devconf->mc_forwarding directly causes invalid
    pointer access.
    
    The process is as follows:
    setup_net()
            ops_init()
                    addrconf_init_net()
                    all = kmemdup(...)           ---> alloc "all"
                    ...
                    net->ipv6.devconf_all = all;
                    __addrconf_sysctl_register() ---> failed
                    ...
                    kfree(all);                  ---> ipv6.devconf_all invalid
                    ...
            ops_exit_list()
                    ...
                    ip6mr_sk_done()
                            devconf = net->ipv6.devconf_all;
                            //devconf is invalid pointer
                            if (!devconf || !atomic_read(&devconf->mc_forwarding))
    
    The following is the Call Trace information:
    BUG: KASAN: use-after-free in ip6mr_sk_done+0x112/0x3a0
    Read of size 4 at addr ffff888075508e88 by task ip/14554
    Call Trace:
    <TASK>
    dump_stack_lvl+0x8e/0xd1
    print_report+0x155/0x454
    kasan_report+0xba/0x1f0
    kasan_check_range+0x35/0x1b0
    ip6mr_sk_done+0x112/0x3a0
    rawv6_close+0x48/0x70
    inet_release+0x109/0x230
    inet6_release+0x4c/0x70
    sock_release+0x87/0x1b0
    igmp6_net_exit+0x6b/0x170
    ops_exit_list+0xb0/0x170
    setup_net+0x7ac/0xbd0
    copy_net_ns+0x2e6/0x6b0
    create_new_namespaces+0x382/0xa50
    unshare_nsproxy_namespaces+0xa6/0x1c0
    ksys_unshare+0x3a4/0x7e0
    __x64_sys_unshare+0x2d/0x40
    do_syscall_64+0x35/0x80
    entry_SYSCALL_64_after_hwframe+0x46/0xb0
    RIP: 0033:0x7f7963322547
    
    </TASK>
    Allocated by task 14554:
    kasan_save_stack+0x1e/0x40
    kasan_set_track+0x21/0x30
    __kasan_kmalloc+0xa1/0xb0
    __kmalloc_node_track_caller+0x4a/0xb0
    kmemdup+0x28/0x60
    addrconf_init_net+0x1be/0x840
    ops_init+0xa5/0x410
    setup_net+0x5aa/0xbd0
    copy_net_ns+0x2e6/0x6b0
    create_new_namespaces+0x382/0xa50
    unshare_nsproxy_namespaces+0xa6/0x1c0
    ksys_unshare+0x3a4/0x7e0
    __x64_sys_unshare+0x2d/0x40
    do_syscall_64+0x35/0x80
    entry_SYSCALL_64_after_hwframe+0x46/0xb0
    
    Freed by task 14554:
    kasan_save_stack+0x1e/0x40
    kasan_set_track+0x21/0x30
    kasan_save_free_info+0x2a/0x40
    ____kasan_slab_free+0x155/0x1b0
    slab_free_freelist_hook+0x11b/0x220
    __kmem_cache_free+0xa4/0x360
    addrconf_init_net+0x623/0x840
    ops_init+0xa5/0x410
    setup_net+0x5aa/0xbd0
    copy_net_ns+0x2e6/0x6b0
    create_new_namespaces+0x382/0xa50
    unshare_nsproxy_namespaces+0xa6/0x1c0
    ksys_unshare+0x3a4/0x7e0
    __x64_sys_unshare+0x2d/0x40
    do_syscall_64+0x35/0x80
    entry_SYSCALL_64_after_hwframe+0x46/0xb0
    
    Fixes: 7d9b1b578d67 ("ip6mr: fix use-after-free in ip6mr_sk_done()")
    Signed-off-by: Zhengchao Shao <shaozhengchao@xxxxxxxxxx>
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221017080331.16878-1-shaozhengchao@xxxxxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 10ce86bf228e..d5967cba5b56 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -7214,9 +7214,11 @@ static int __net_init addrconf_init_net(struct net *net)
 	__addrconf_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL);
 err_reg_all:
 	kfree(dflt);
+	net->ipv6.devconf_dflt = NULL;
 #endif
 err_alloc_dflt:
 	kfree(all);
+	net->ipv6.devconf_all = NULL;
 err_alloc_all:
 	kfree(net->ipv6.inet6_addr_lst);
 err_alloc_addr:



[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