|
@@ -220,6 +220,16 @@ static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
|
|
|
if (ipv6_addr_is_multicast(&hdr->saddr))
|
|
if (ipv6_addr_is_multicast(&hdr->saddr))
|
|
|
goto err;
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
+ /* While RFC4291 is not explicit about v4mapped addresses
|
|
|
|
|
+ * in IPv6 headers, it seems clear linux dual-stack
|
|
|
|
|
+ * model can not deal properly with these.
|
|
|
|
|
+ * Security models could be fooled by ::ffff:127.0.0.1 for example.
|
|
|
|
|
+ *
|
|
|
|
|
+ * https://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02
|
|
|
|
|
+ */
|
|
|
|
|
+ if (ipv6_addr_v4mapped(&hdr->saddr))
|
|
|
|
|
+ goto err;
|
|
|
|
|
+
|
|
|
skb->transport_header = skb->network_header + sizeof(*hdr);
|
|
skb->transport_header = skb->network_header + sizeof(*hdr);
|
|
|
IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
|
|
IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
|
|
|
|
|
|