• Sabrina Dubroca's avatar
    ipv6: make DAD fail with enhanced DAD when nonce length differs · e6651599
    Sabrina Dubroca authored
    Commit adc176c5 ("ipv6 addrconf: Implemented enhanced DAD (RFC7527)")
    added enhanced DAD with a nonce length of 6 bytes. However, RFC7527
    doesn't specify the length of the nonce, other than being 6 + 8*k bytes,
    with integer k >= 0 (RFC3971 5.3.2). The current implementation simply
    assumes that the nonce will always be 6 bytes, but others systems are
    free to choose different sizes.
    
    If another system sends a nonce of different length but with the same 6
    bytes prefix, it shouldn't be considered as the same nonce. Thus, check
    that the length of the received nonce is the same as the length we sent.
    
    Ugly scapy test script running on veth0:
    
    def loop():
        pkt=sniff(iface="veth0", filter="icmp6", count=1)
        pkt = pkt[0]
        b = bytearray(pkt[Raw].load)
        b[1] += 1
        b += b'\xde\xad\xbe\xef\xde\xad\xbe\xef'
        pkt[Raw].load = bytes(b)
        pkt[IPv6].plen += 8
        # fixup checksum after modifying the payload
        pkt[IPv6].payload.cksum -= 0x3b44
        if pkt[IPv6].payload.cksum < 0:
            pkt[IPv6].payload.cksum += 0xffff
        sendp(pkt, iface="veth0")
    
    This should result in DAD failure for any address added to veth0's peer,
    but is currently ignored.
    
    Fixes: adc176c5 ("ipv6 addrconf: Implemented enhanced DAD (RFC7527)")
    Signed-off-by: default avatarSabrina Dubroca <sd@queasysnail.net>
    Reviewed-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e6651599
ndisc.c 47.9 KB