• Willem de Bruijn's avatar
    sit: fix use after free of fb_tunnel_dev · 9434266f
    Willem de Bruijn authored
    Bug: The fallback device is created in sit_init_net and assumed to be
    freed in sit_exit_net. First, it is dereferenced in that function, in
    sit_destroy_tunnels:
    
            struct net *net = dev_net(sitn->fb_tunnel_dev);
    
    Prior to this, rtnl_unlink_register has removed all devices that match
    rtnl_link_ops == sit_link_ops.
    
    Commit 205983c4 added the line
    
    +       sitn->fb_tunnel_dev->rtnl_link_ops = &sit_link_ops;
    
    which cases the fallback device to match here and be freed before it
    is last dereferenced.
    
    Fix: This commit adds an explicit .delllink callback to sit_link_ops
    that skips deallocation at rtnl_unlink_register for the fallback
    device. This mechanism is comparable to the one in ip_tunnel.
    
    It also modifies sit_destroy_tunnels and its only caller sit_exit_net
    to avoid the offending dereference in the first place. That double
    lookup is more complicated than required.
    
    Test: The bug is only triggered when CONFIG_NET_NS is enabled. It
    causes a GPF only when CONFIG_DEBUG_SLAB is enabled. Verified that
    this bug exists at the mentioned commit, at davem-net HEAD and at
    3.11.y HEAD. Verified that it went away after applying this patch.
    
    Fixes: 205983c4 ("sit: allow to use rtnl ops on fb tunnel")
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9434266f
sit.c 40.8 KB