public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
@ 2023-12-02 16:14 Shigeru Yoshida
  2023-12-03  6:58 ` [EXT] " Suman Ghosh
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Shigeru Yoshida @ 2023-12-02 16:14 UTC (permalink / raw)
  To: davem, dsahern, edumazet, kuba, pabeni
  Cc: netdev, linux-kernel, Shigeru Yoshida

In ipgre_xmit(), skb_pull() may fail even if pskb_inet_may_pull() returns
true. For example, applications can use PF_PACKET to create a malformed
packet with no IP header. This type of packet causes a problem such as
uninit-value access.

This patch ensures that skb_pull() can pull the required size by checking
the skb with pskb_network_may_pull() before skb_pull().

Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.")
Signed-off-by: Shigeru Yoshida <syoshida@redhat.com>
---
v1 -> v2:
- Change the title
- Update the code with Eric's suggestion
  https://lore.kernel.org/all/20231126151652.372783-1-syoshida@redhat.com/
---
 net/ipv4/ip_gre.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 22a26d1d29a0..5169c3c72cff 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -635,15 +635,18 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
 	}
 
 	if (dev->header_ops) {
+		int pull_len = tunnel->hlen + sizeof(struct iphdr);
+
 		if (skb_cow_head(skb, 0))
 			goto free_skb;
 
 		tnl_params = (const struct iphdr *)skb->data;
 
-		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
-		 * to gre header.
-		 */
-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
+		if (!pskb_network_may_pull(skb, pull_len))
+			goto free_skb;
+
+		/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
+		skb_pull(skb, pull_len);
 		skb_reset_mac_header(skb);
 
 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* RE: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-02 16:14 [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() Shigeru Yoshida
@ 2023-12-03  6:58 ` Suman Ghosh
  2023-12-03 11:03   ` Eric Dumazet
  2023-12-03 11:54   ` Shigeru Yoshida
  2023-12-03 15:18 ` Suman Ghosh
  2023-12-06  9:20 ` patchwork-bot+netdevbpf
  2 siblings, 2 replies; 8+ messages in thread
From: Suman Ghosh @ 2023-12-03  6:58 UTC (permalink / raw)
  To: Shigeru Yoshida, davem@davemloft.net, dsahern@kernel.org,
	edumazet@google.com, kuba@kernel.org, pabeni@redhat.com
  Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org

Hi Shigeru,

>diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index
>22a26d1d29a0..5169c3c72cff 100644
>--- a/net/ipv4/ip_gre.c
>+++ b/net/ipv4/ip_gre.c
>@@ -635,15 +635,18 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
> 	}
>
> 	if (dev->header_ops) {
>+		int pull_len = tunnel->hlen + sizeof(struct iphdr);
>+
> 		if (skb_cow_head(skb, 0))
> 			goto free_skb;
>
> 		tnl_params = (const struct iphdr *)skb->data;
>
>-		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
>-		 * to gre header.
>-		 */
>-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
>+		if (!pskb_network_may_pull(skb, pull_len))
[Suman] Since this is transmit path, should we add unlikely() here?
>+			goto free_skb;
>+
>+		/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
>+		skb_pull(skb, pull_len);
> 		skb_reset_mac_header(skb);
>
> 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
>--
>2.41.0
>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-03  6:58 ` [EXT] " Suman Ghosh
@ 2023-12-03 11:03   ` Eric Dumazet
  2023-12-03 11:54   ` Shigeru Yoshida
  1 sibling, 0 replies; 8+ messages in thread
From: Eric Dumazet @ 2023-12-03 11:03 UTC (permalink / raw)
  To: Suman Ghosh
  Cc: Shigeru Yoshida, davem@davemloft.net, dsahern@kernel.org,
	kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org

On Sun, Dec 3, 2023 at 7:58 AM Suman Ghosh <sumang@marvell.com> wrote:
>
> Hi Shigeru,
>
> >diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index
> >22a26d1d29a0..5169c3c72cff 100644
> >--- a/net/ipv4/ip_gre.c
> >+++ b/net/ipv4/ip_gre.c
> >@@ -635,15 +635,18 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
> >       }
> >
> >       if (dev->header_ops) {
> >+              int pull_len = tunnel->hlen + sizeof(struct iphdr);
> >+
> >               if (skb_cow_head(skb, 0))
> >                       goto free_skb;
> >
> >               tnl_params = (const struct iphdr *)skb->data;
> >
> >-              /* Pull skb since ip_tunnel_xmit() needs skb->data pointing
> >-               * to gre header.
> >-               */
> >-              skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
> >+              if (!pskb_network_may_pull(skb, pull_len))
> [Suman] Since this is transmit path, should we add unlikely() here?

Adding unlikely() is not needed, it is already done generically from
the inline helpers.

Reviewed-by: Eric Dumazet <edumazet@google.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-03  6:58 ` [EXT] " Suman Ghosh
  2023-12-03 11:03   ` Eric Dumazet
@ 2023-12-03 11:54   ` Shigeru Yoshida
  2023-12-03 15:17     ` Suman Ghosh
  1 sibling, 1 reply; 8+ messages in thread
From: Shigeru Yoshida @ 2023-12-03 11:54 UTC (permalink / raw)
  To: sumang; +Cc: davem, dsahern, edumazet, kuba, pabeni, netdev, linux-kernel

Hi Suman,

On Sun, 3 Dec 2023 06:58:19 +0000, Suman Ghosh wrote:
> Hi Shigeru,
> 
>>diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index
>>22a26d1d29a0..5169c3c72cff 100644
>>--- a/net/ipv4/ip_gre.c
>>+++ b/net/ipv4/ip_gre.c
>>@@ -635,15 +635,18 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
>> 	}
>>
>> 	if (dev->header_ops) {
>>+		int pull_len = tunnel->hlen + sizeof(struct iphdr);
>>+
>> 		if (skb_cow_head(skb, 0))
>> 			goto free_skb;
>>
>> 		tnl_params = (const struct iphdr *)skb->data;
>>
>>-		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
>>-		 * to gre header.
>>-		 */
>>-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
>>+		if (!pskb_network_may_pull(skb, pull_len))
> [Suman] Since this is transmit path, should we add unlikely() here?

Thanks for your comment.

I traced this function and found that pskb_may_pull_reason() seems to
have appropriate likely() and unlikely() as Eric says.

I'm new to Linux networking. Could you kindly explain the background
of your suggestion?

I understand that a transmit path must be as fast as possible, so we
should use unlikely() for rare cases such like this error path. Am I
correct?

Thanks,
Shigeru

>>+			goto free_skb;
>>+
>>+		/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
>>+		skb_pull(skb, pull_len);
>> 		skb_reset_mac_header(skb);
>>
>> 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
>>--
>>2.41.0
>>
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-03 11:54   ` Shigeru Yoshida
@ 2023-12-03 15:17     ` Suman Ghosh
  2023-12-03 15:38       ` Shigeru Yoshida
  0 siblings, 1 reply; 8+ messages in thread
From: Suman Ghosh @ 2023-12-03 15:17 UTC (permalink / raw)
  To: Shigeru Yoshida
  Cc: davem@davemloft.net, dsahern@kernel.org, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org

>>> 	}
>>>
>>> 	if (dev->header_ops) {
>>>+		int pull_len = tunnel->hlen + sizeof(struct iphdr);
>>>+
>>> 		if (skb_cow_head(skb, 0))
>>> 			goto free_skb;
>>>
>>> 		tnl_params = (const struct iphdr *)skb->data;
>>>
>>>-		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
>>>-		 * to gre header.
>>>-		 */
>>>-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
>>>+		if (!pskb_network_may_pull(skb, pull_len))
>> [Suman] Since this is transmit path, should we add unlikely() here?
>
>Thanks for your comment.
>
>I traced this function and found that pskb_may_pull_reason() seems to
>have appropriate likely() and unlikely() as Eric says.
>
>I'm new to Linux networking. Could you kindly explain the background of
>your suggestion?
>
>I understand that a transmit path must be as fast as possible, so we
>should use unlikely() for rare cases such like this error path. Am I
>correct?
>
>Thanks,
>Shigeru
[Suman] Yes. Likely()/unlikely() helps the compiler for branch prediction and we use it mostly on the data path.
But I cross checked that this is static inline and the function pskb_may_pull() already have likely()/unlikely() in place.
So, you can ignore my comment here.
>
>>>+			goto free_skb;
>>>+
>>>+		/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
>>>+		skb_pull(skb, pull_len);
>>> 		skb_reset_mac_header(skb);
>>>
>>> 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
>>>--
>>>2.41.0
>>>
>>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-02 16:14 [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() Shigeru Yoshida
  2023-12-03  6:58 ` [EXT] " Suman Ghosh
@ 2023-12-03 15:18 ` Suman Ghosh
  2023-12-06  9:20 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 8+ messages in thread
From: Suman Ghosh @ 2023-12-03 15:18 UTC (permalink / raw)
  To: Shigeru Yoshida, davem@davemloft.net, dsahern@kernel.org,
	edumazet@google.com, kuba@kernel.org, pabeni@redhat.com
  Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org

>In ipgre_xmit(), skb_pull() may fail even if pskb_inet_may_pull()
>returns true. For example, applications can use PF_PACKET to create a
>malformed packet with no IP header. This type of packet causes a problem
>such as uninit-value access.
>
>This patch ensures that skb_pull() can pull the required size by
>checking the skb with pskb_network_may_pull() before skb_pull().
>
>Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.")
>Signed-off-by: Shigeru Yoshida <syoshida@redhat.com>
>---
Reviewed-by: Suman Ghosh <sumang@marvell.com>

>v1 -> v2:
>- Change the title
>- Update the code with Eric's suggestion
>  


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [EXT] [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-03 15:17     ` Suman Ghosh
@ 2023-12-03 15:38       ` Shigeru Yoshida
  0 siblings, 0 replies; 8+ messages in thread
From: Shigeru Yoshida @ 2023-12-03 15:38 UTC (permalink / raw)
  To: sumang; +Cc: davem, dsahern, edumazet, kuba, pabeni, netdev, linux-kernel

On Sun, 3 Dec 2023 15:17:09 +0000, Suman Ghosh wrote:
>>>> 	}
>>>>
>>>> 	if (dev->header_ops) {
>>>>+		int pull_len = tunnel->hlen + sizeof(struct iphdr);
>>>>+
>>>> 		if (skb_cow_head(skb, 0))
>>>> 			goto free_skb;
>>>>
>>>> 		tnl_params = (const struct iphdr *)skb->data;
>>>>
>>>>-		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
>>>>-		 * to gre header.
>>>>-		 */
>>>>-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
>>>>+		if (!pskb_network_may_pull(skb, pull_len))
>>> [Suman] Since this is transmit path, should we add unlikely() here?
>>
>>Thanks for your comment.
>>
>>I traced this function and found that pskb_may_pull_reason() seems to
>>have appropriate likely() and unlikely() as Eric says.
>>
>>I'm new to Linux networking. Could you kindly explain the background of
>>your suggestion?
>>
>>I understand that a transmit path must be as fast as possible, so we
>>should use unlikely() for rare cases such like this error path. Am I
>>correct?
>>
>>Thanks,
>>Shigeru
> [Suman] Yes. Likely()/unlikely() helps the compiler for branch prediction and we use it mostly on the data path.
> But I cross checked that this is static inline and the function pskb_may_pull() already have likely()/unlikely() in place.
> So, you can ignore my comment here.

Thank you for your explanation. It is very informative. And thanks for
the review as well.

Shigeru

>>
>>>>+			goto free_skb;
>>>>+
>>>>+		/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
>>>>+		skb_pull(skb, pull_len);
>>>> 		skb_reset_mac_header(skb);
>>>>
>>>> 		if (skb->ip_summed == CHECKSUM_PARTIAL &&
>>>>--
>>>>2.41.0
>>>>
>>>
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
  2023-12-02 16:14 [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() Shigeru Yoshida
  2023-12-03  6:58 ` [EXT] " Suman Ghosh
  2023-12-03 15:18 ` Suman Ghosh
@ 2023-12-06  9:20 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-12-06  9:20 UTC (permalink / raw)
  To: Shigeru Yoshida
  Cc: davem, dsahern, edumazet, kuba, pabeni, netdev, linux-kernel

Hello:

This patch was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Sun,  3 Dec 2023 01:14:41 +0900 you wrote:
> In ipgre_xmit(), skb_pull() may fail even if pskb_inet_may_pull() returns
> true. For example, applications can use PF_PACKET to create a malformed
> packet with no IP header. This type of packet causes a problem such as
> uninit-value access.
> 
> This patch ensures that skb_pull() can pull the required size by checking
> the skb with pskb_network_may_pull() before skb_pull().
> 
> [...]

Here is the summary with links:
  - [net,v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()
    https://git.kernel.org/netdev/net/c/80d875cfc9d3

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-12-06  9:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-02 16:14 [PATCH net v2] ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() Shigeru Yoshida
2023-12-03  6:58 ` [EXT] " Suman Ghosh
2023-12-03 11:03   ` Eric Dumazet
2023-12-03 11:54   ` Shigeru Yoshida
2023-12-03 15:17     ` Suman Ghosh
2023-12-03 15:38       ` Shigeru Yoshida
2023-12-03 15:18 ` Suman Ghosh
2023-12-06  9:20 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox