mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ilya Maximets <i.maximets@ovn.org>
To: "Cen Zhang (Microsoft)" <blbllhy@gmail.com>,
	aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@redhat.com, horms@kernel.org
Cc: netdev@vger.kernel.org, dev@openvswitch.org,
	linux-kernel@vger.kernel.org,
	AutonomousCodeSecurity@microsoft.com,
	tgopinath@linux.microsoft.com, kys@microsoft.com
Subject: Re: [PATCH net v4] net/openvswitch: check Ethernet header length in key_extract()
Date: Mon, 27 Jul 2026 20:01:28 +0200	[thread overview]
Message-ID: <403ae4a4-5df3-4744-89e4-12e46fd56f25@ovn.org> (raw)
In-Reply-To: <20260725043128.193164-1-blbllhy@gmail.com>

On 7/25/26 6:31 AM, Cen Zhang (Microsoft) wrote:
> When a packet arrives on an ARPHRD_NONE device (e.g. TUN),
> ovs_flow_key_extract() trusts the user-provided skb->protocol field: if
> it is ETH_P_TEB, the packet is classified as MAC_PROTO_ETHERNET and
> key_extract() is called without ensuring the skb has ETH_HLEN (14) bytes
> of linear data. key_extract() unconditionally pulls 2 * ETH_ALEN bytes
> for MAC addresses and parse_ethertype() pulls 2 more, either of which
> triggers a kernel BUG in __skb_pull() when the linear area is too small.
> 
>   kernel BUG at include/linux/skbuff.h:2848!
>   RIP: 0010:key_extract+0xa7e/0xd90 net/openvswitch/flow.c:933
>   ovs_flow_key_extract+0x419/0xa70
>   ovs_vport_receive+0x222/0x390
>   netdev_frame_hook+0x3e0/0x630
>   tun_get_user+0x2d0c/0x38e0
> 
> Fixed by calling check_header() in key_extract() before accessing the
> Ethernet header.
> 
> Fixes: 217ac77a3c25 ("openvswitch: allow L3 netdev ports")
> Reported-by: AutonomousCodeSecurity@microsoft.com
> Signed-off-by: Cen Zhang (Microsoft) <blbllhy@gmail.com>
> ---
> v4: Update documentation and move variables into the Ethernet block.
> v3: Use check_header() per review, fix format issue.
> v2: Moved the check into key_extract() per Ilya Maximets.
> Link: https://lore.kernel.org/all/20260721143602.64677-1-blbllhy@gmail.com
> 
>  net/openvswitch/flow.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c
> index 66366982f604..8ad0be37a65a 100644
> --- a/net/openvswitch/flow.c
> +++ b/net/openvswitch/flow.c
> @@ -889,8 +889,6 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key)
>   * Ethernet header
>   * @key: output flow key
>   *
> - * The caller must ensure that skb->len >= ETH_HLEN.
> - *
>   * Initializes @skb header fields as follows:
>   *
>   *    - skb->mac_header: the L2 header.
> @@ -910,8 +908,6 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key)
>   */
>  static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)
>  {
> -	struct ethhdr *eth;
> -
>  	/* Flags are always used as part of stats */
>  	key->tp.flags = 0;
>  
> @@ -926,6 +922,12 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)
>  		skb_reset_network_header(skb);
>  		key->eth.type = skb->protocol;
>  	} else {
> +		struct ethhdr *eth;
> +		int err = check_header(skb, ETH_HLEN);

Please, use the reverse x-mass tree ordering for variable declaration,
i.e. lines longest to shortest.  In this particular case, just move
the initialization to a separate line:

		struct ethhdr *eth;
		int err;

		err = check_header(skb, ETH_HLEN);
		if (unlikely(err)) ...

Otherwise, LGTM.



Sashiko reports two pre-existing issues that are not related to this patch:

1. Potential use of uninitialized bits of the key during lookup if the
   code takes the positive branch of the if statement, since the addresses
   remain uninitialized in the flow key structure.

   There should be no functional issues, as those bits will be bitwise
   ANDed with zeroes form the mask before the lookup in most cases, and
   in case of L3 key comparison with the L2 flow where the addresses
   will not be zero, the key must not match anyway due to prior mismatch
   on the eth protocol.  However, it is possible that KASAN will not be
   happy with these operations producing warnings.  I'll try to take a
   closer look at this one.  The zeroing out of the key was previously
   removed for performance reasons, since it doesn't affect flow matching.
   But having KASAN splats is also not great and potentially dangerous.

2. There is an unlikely case where ovs_flow_key_update() might fail,
   which would cause skb leak on failure of recirc() or ct() actions.
   I'm not really sure if this condition is reachable in practice as it
   requires parsing to fail on a packet that we previously successfully
   parsed and then modified.  But should be fixed nevertheless.
   I'll send a separate small patch set for this.

Best regards, Ilya Maximets.

  parent reply	other threads:[~2026-07-27 18:01 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-25  4:31 Cen Zhang (Microsoft)
2026-07-27  9:21 ` Eelco Chaudron
2026-07-27 18:01 ` Ilya Maximets [this message]
2026-07-30 21:53   ` Cen Zhang (Microsoft)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=403ae4a4-5df3-4744-89e4-12e46fd56f25@ovn.org \
    --to=i.maximets@ovn.org \
    --cc=AutonomousCodeSecurity@microsoft.com \
    --cc=aconole@redhat.com \
    --cc=blbllhy@gmail.com \
    --cc=davem@davemloft.net \
    --cc=dev@openvswitch.org \
    --cc=echaudro@redhat.com \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=kys@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=tgopinath@linux.microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®