• Eric Dumazet's avatar
    ipv6: drop incoming packets having a v4mapped source address · 6af1799a
    Eric Dumazet authored
    This began with a syzbot report. syzkaller was injecting
    IPv6 TCP SYN packets having a v4mapped source address.
    
    After an unsuccessful 4-tuple lookup, TCP creates a request
    socket (SYN_RECV) and calls reqsk_queue_hash_req()
    
    reqsk_queue_hash_req() calls sk_ehashfn(sk)
    
    At this point we have AF_INET6 sockets, and the heuristic
    used by sk_ehashfn() to either hash the IPv4 or IPv6 addresses
    is to use ipv6_addr_v4mapped(&sk->sk_v6_daddr)
    
    For the particular spoofed packet, we end up hashing V4 addresses
    which were not initialized by the TCP IPv6 stack, so KMSAN fired
    a warning.
    
    I first fixed sk_ehashfn() to test both source and destination addresses,
    but then faced various problems, including user-space programs
    like packetdrill that had similar assumptions.
    
    Instead of trying to fix the whole ecosystem, it is better
    to admit that we have a dual stack behavior, and that we
    can not build linux kernels without V4 stack anyway.
    
    The dual stack API automatically forces the traffic to be IPv4
    if v4mapped addresses are used at bind() or connect(), so it makes
    no sense to allow IPv6 traffic to use the same v4mapped class.
    
    Fixes: 1da177e4 ("Linux-2.6.12-rc2")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Florian Westphal <fw@strlen.de>
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6af1799a
ip6_input.c 13.9 KB