On 11/21/2013 01:40 AM, Jesse Gross wrote:
On Wed, Nov 20, 2013 at 1:43 AM, Thomas Graf <tg...@redhat.com> wrote:
On 11/20/2013 10:14 AM, Jesse Gross wrote:
On Wed, Nov 20, 2013 at 1:08 AM, Thomas Graf <tg...@redhat.com> wrote:
I might be missing something but what about the rxhash == 0 case?

VXLAN does:
          hash = skb_get_rxhash(skb);
          if (!hash)
                  hash = jhash(skb->data, 2 * ETH_ALEN,
                               (__force u32) skb->protocol);

Shouldn't we hash the pkt_key then?


LISP is an L3 protocol rather than L2 like VXLAN so we're guaranteed
to have at least IP addresses to hash in skb_get_rxhash().


Right, unless skb_flow_dissect() fails which I think could be triggered
when an invalid GRE header is encapsulated on top of IP inside LISP.
Basically any header violation caught by skb_flow_dissect() that is not
caught by the flow extraction. An attacker could use such packets to
force unhashed source ports to overload a load balancer.

Same could happen if the RX NIC RSS results in 0, i.e.
(skb->l4_rxhash && !skb->rxhash)

VXLAN would handle these fine right now.

This seems like a more general problem with skb_flow_dissect() to me -
it would be better to extract as much entropy from the packet as
possible rather than just giving up and returning 0 if something is
invalid. This is effectively what VXLAN is doing - it's using the L2
headers as a last resort, even if the upper layers have a problem. I
think this would also apply to other users of the rxhash, such as RPS.

I agree. Fixing this in skb_flow_dissect() makes more sense to me as
well. I'm pointing it out in the context of this patch because
previously LISP did not have this vulnerability.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to