• L
    net: bridge: mcast: fix broken length + header check for MRDv6 Adv. · be260f5c
    Linus Lüssing 提交于
    stable inclusion
    from stable-5.10.37
    commit e2c34cacff7b2a7491fb32134ca8771dcef83713
    bugzilla: 51868
    CVE: NA
    
    --------------------------------
    
    [ Upstream commit 99014088 ]
    
    The IPv6 Multicast Router Advertisements parsing has the following two
    issues:
    
    For one thing, ICMPv6 MRD Advertisements are smaller than ICMPv6 MLD
    messages (ICMPv6 MRD Adv.: 8 bytes vs. ICMPv6 MLDv1/2: >= 24 bytes,
    assuming MLDv2 Reports with at least one multicast address entry).
    When ipv6_mc_check_mld_msg() tries to parse an Multicast Router
    Advertisement its MLD length check will fail - and it will wrongly
    return -EINVAL, even if we have a valid MRD Advertisement. With the
    returned -EINVAL the bridge code will assume a broken packet and will
    wrongly discard it, potentially leading to multicast packet loss towards
    multicast routers.
    
    The second issue is the MRD header parsing in
    br_ip6_multicast_mrd_rcv(): It wrongly checks for an ICMPv6 header
    immediately after the IPv6 header (IPv6 next header type). However
    according to RFC4286, section 2 all MRD messages contain a Router Alert
    option (just like MLD). So instead there is an IPv6 Hop-by-Hop option
    for the Router Alert between the IPv6 and ICMPv6 header, again leading
    to the bridge wrongly discarding Multicast Router Advertisements.
    
    To fix these two issues, introduce a new return value -ENODATA to
    ipv6_mc_check_mld() to indicate a valid ICMPv6 packet with a hop-by-hop
    option which is not an MLD but potentially an MRD packet. This also
    simplifies further parsing in the bridge code, as ipv6_mc_check_mld()
    already fully checks the ICMPv6 header and hop-by-hop option.
    
    These issues were found and fixed with the help of the mrdisc tool
    (https://github.com/troglobit/mrdisc).
    
    Fixes: 4b3087c7 ("bridge: Snoop Multicast Router Advertisements")
    Signed-off-by: NLinus Lüssing <linus.luessing@c0d3.blue>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Acked-by: NWeilong Chen <chenweilong@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    be260f5c
mcast_snoop.c 4.4 KB