Fix ICMPv6 redirects

icmp6_redirect_input() validates that a redirect packet came from the
current gateway for the respective destination.  To do this, it compares
the source address, which has an embedded scope zone id, to the next-hop
address, which does not.  If the address is link-local, which should be
the case, the comparison fails and the redirect is ignored.

Insert the scope zone id into the next-hop address so the comparison
is accurate.

Unsurprisingly, this fixes 35 UNH IPv6 conformance test cases.

Submitted by:	Farrell Woods <Farrell_Woods@Dell.com> (initial revision)
Reviewed by:	ae melifaro dab
MFC after:	1 week
Relnotes:	yes
Sponsored by:	Dell EMC
Differential Revision:	https://reviews.freebsd.org/D14254
This commit is contained in:
Eric van Gyzen 2018-02-09 00:13:05 +00:00
parent 31461aa2f1
commit 43105e589a

View File

@ -2305,6 +2305,14 @@ icmp6_redirect_input(struct mbuf *m, int off)
goto bad;
}
/*
* Embed scope zone id into next hop address, since
* fib6_lookup_nh_basic() returns address without embedded
* scope zone id.
*/
if (in6_setscope(&nh6.nh_addr, m->m_pkthdr.rcvif, NULL))
goto freeit;
if (IN6_ARE_ADDR_EQUAL(&src6, &nh6.nh_addr) == 0) {
nd6log((LOG_ERR,
"ICMP6 redirect rejected; "