• Daniel Borkmann's avatar
    net, bpf: Fix ip6ip6 crash with collect_md populated skbs · a188bb56
    Daniel Borkmann authored
    I ran into a crash where setting up a ip6ip6 tunnel device which was /not/
    set to collect_md mode was receiving collect_md populated skbs for xmit.
    
    The BPF prog was populating the skb via bpf_skb_set_tunnel_key() which is
    assigning special metadata dst entry and then redirecting the skb to the
    device, taking ip6_tnl_start_xmit() -> ipxip6_tnl_xmit() -> ip6_tnl_xmit()
    and in the latter it performs a neigh lookup based on skb_dst(skb) where
    we trigger a NULL pointer dereference on dst->ops->neigh_lookup() since
    the md_dst_ops do not populate neigh_lookup callback with a fake handler.
    
    Transform the md_dst_ops into generic dst_blackhole_ops that can also be
    reused elsewhere when needed, and use them for the metadata dst entries as
    callback ops.
    
    Also, remove the dst_md_discard{,_out}() ops and rely on dst_discard{,_out}()
    from dst_init() which free the skb the same way modulo the splat. Given we
    will be able to recover just fine from there, avoid any potential splats
    iff this gets ever triggered in future (or worse, panic on warns when set).
    
    Fixes: f38a9eb1 ("dst: Metadata destinations")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a188bb56
dst.c 8.61 KB