• Alexey Dobriyan's avatar
    netns: publish net_generic correctly · 1a9a0592
    Alexey Dobriyan authored
    Publishing net_generic pointer is done with silly mistake: new array is
    published BEFORE setting freshly acquired pernet subsystem pointer.
    
    	memcpy
    	rcu_assign_pointer
    	kfree_rcu
    	ng->ptr[id - 1] = data;
    
    This bug was introduced with commit dec827d1
    ("[NETNS]: The generic per-net pointers.") in the glorious days of
    chopping networking stack into containers proper 8.5 years ago (whee...)
    
    How it didn't trigger for so long?
    Well, you need quite specific set of conditions:
    
    *) race window opens once per pernet subsystem addition
       (read: modprobe or boot)
    
    *) not every pernet subsystem is eligible (need ->id and ->size)
    
    *) not every pernet subsystem is vulnerable (need incorrect or absense
       of ordering of register_pernet_sybsys() and actually using net_generic())
    
    *) to hide the bug even more, default is to preallocate 13 pointers which
       is actually quite a lot. You need IPv6, netfilter, bridging etc together
       loaded to trigger reallocation in the first place. Trimmed down
       config are OK.
    Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1a9a0592
net_namespace.c 23.7 KB