public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking
@ 2025-01-22 17:43 Hagar Hemdan
  2025-01-22 17:43 ` [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash() Hagar Hemdan
  2025-01-22 22:38 ` [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Sasha Levin
  0 siblings, 2 replies; 4+ messages in thread
From: Hagar Hemdan @ 2025-01-22 17:43 UTC (permalink / raw)
  Cc: stable, Madhuparna Bhowmik, Wei Liu, David S . Miller,
	Hagar Hemdan

From: Madhuparna Bhowmik <madhuparnabhowmik04@gmail.com>

commit f3265971ded98a069ad699b51b8a5ab95e9e5be1 upstream.

list_for_each_entry_rcu has built-in RCU and lock checking.
Pass cond argument to list_for_each_entry_rcu.

Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik04@gmail.com>
Acked-by: Wei Liu <wei.liu@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
---
This is a dependency to fix CVE-2024-49936 in 5.4.

diff --git a/drivers/net/xen-netback/hash.c b/drivers/net/xen-netback/hash.c
--- a/drivers/net/xen-netback/hash.c
+++ b/drivers/net/xen-netback/hash.c
@@ -51,7 +51,8 @@ static void xenvif_add_hash(struct xenvif *vif, const u8 *tag,
 
 	found = false;
 	oldest = NULL;
-	list_for_each_entry_rcu(entry, &vif->hash.cache.list, link) {
+	list_for_each_entry_rcu(entry, &vif->hash.cache.list, link,
+				lockdep_is_held(&vif->hash.cache.lock)) {
 		/* Make sure we don't add duplicate entries */
 		if (entry->len == len &&
 		    memcmp(entry->tag, tag, len) == 0)
@@ -102,7 +103,8 @@ static void xenvif_flush_hash(struct xenvif *vif)
 
 	spin_lock_irqsave(&vif->hash.cache.lock, flags);
 
-	list_for_each_entry_rcu(entry, &vif->hash.cache.list, link) {
+	list_for_each_entry_rcu(entry, &vif->hash.cache.list, link,
+				lockdep_is_held(&vif->hash.cache.lock)) {
 		list_del_rcu(&entry->link);
 		vif->hash.cache.count--;
 		kfree_rcu(entry, rcu);

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

* [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash()
  2025-01-22 17:43 [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Hagar Hemdan
@ 2025-01-22 17:43 ` Hagar Hemdan
  2025-01-22 22:38   ` Sasha Levin
  2025-01-22 22:38 ` [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Sasha Levin
  1 sibling, 1 reply; 4+ messages in thread
From: Hagar Hemdan @ 2025-01-22 17:43 UTC (permalink / raw)
  Cc: stable, Jeongjun Park, Jakub Kicinski, Hagar Hemdan

From: Jeongjun Park <aha310510@gmail.com>

commit 0fa5e94a1811d68fbffa0725efe6d4ca62c03d12 upstream.

During the list_for_each_entry_rcu iteration call of xenvif_flush_hash,
kfree_rcu does not exist inside the rcu read critical section, so if
kfree_rcu is called when the rcu grace period ends during the iteration,
UAF occurs when accessing head->next after the entry becomes free.

Therefore, to solve this, you need to change it to list_for_each_entry_safe.

Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Link: https://patch.msgid.link/20240822181109.2577354-1-aha310510@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
---
This is the main fix for CVE-2024-49936.

diff --git a/drivers/net/xen-netback/hash.c b/drivers/net/xen-netback/hash.c
--- a/drivers/net/xen-netback/hash.c
+++ b/drivers/net/xen-netback/hash.c
@@ -95,7 +95,7 @@ static u32 xenvif_new_hash(struct xenvif *vif, const u8 *data,
 
 static void xenvif_flush_hash(struct xenvif *vif)
 {
-	struct xenvif_hash_cache_entry *entry;
+	struct xenvif_hash_cache_entry *entry, *n;
 	unsigned long flags;
 
 	if (xenvif_hash_cache_size == 0)
@@ -103,8 +103,7 @@ static void xenvif_flush_hash(struct xenvif *vif)
 
 	spin_lock_irqsave(&vif->hash.cache.lock, flags);
 
-	list_for_each_entry_rcu(entry, &vif->hash.cache.list, link,
-				lockdep_is_held(&vif->hash.cache.lock)) {
+	list_for_each_entry_safe(entry, n, &vif->hash.cache.list, link) {
 		list_del_rcu(&entry->link);
 		vif->hash.cache.count--;
 		kfree_rcu(entry, rcu);

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

* Re: [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash()
  2025-01-22 17:43 ` [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash() Hagar Hemdan
@ 2025-01-22 22:38   ` Sasha Levin
  0 siblings, 0 replies; 4+ messages in thread
From: Sasha Levin @ 2025-01-22 22:38 UTC (permalink / raw)
  To: stable; +Cc: Hagar Hemdan, Sasha Levin

[ Sasha's backport helper bot ]

Hi,

The upstream commit SHA1 provided is correct: 0fa5e94a1811d68fbffa0725efe6d4ca62c03d12

WARNING: Author mismatch between patch and upstream commit:
Backport author: Hagar Hemdan<hagarhem@amazon.com>
Commit author: Jeongjun Park<aha310510@gmail.com>


Status in newer kernel trees:
6.12.y | Present (exact SHA1)
6.6.y | Present (different SHA1: 143edf098b80)
6.1.y | Present (different SHA1: efcff6ce7467)
5.15.y | Present (different SHA1: a0465723b858)
5.10.y | Present (different SHA1: a7f0073fcd12)
5.4.y | Not found

Note: The patch differs from the upstream commit:
---
Failed to apply patch cleanly, falling back to interdiff...
---

Results of testing on various branches:

| Branch                    | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-5.4.y        |  Failed     |  N/A       |

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

* Re: [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking
  2025-01-22 17:43 [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Hagar Hemdan
  2025-01-22 17:43 ` [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash() Hagar Hemdan
@ 2025-01-22 22:38 ` Sasha Levin
  1 sibling, 0 replies; 4+ messages in thread
From: Sasha Levin @ 2025-01-22 22:38 UTC (permalink / raw)
  To: stable; +Cc: Hagar Hemdan, Sasha Levin

[ Sasha's backport helper bot ]

Hi,

The upstream commit SHA1 provided is correct: f3265971ded98a069ad699b51b8a5ab95e9e5be1

WARNING: Author mismatch between patch and upstream commit:
Backport author: Hagar Hemdan<hagarhem@amazon.com>
Commit author: Madhuparna Bhowmik<madhuparnabhowmik04@gmail.com>


Status in newer kernel trees:
6.12.y | Present (exact SHA1)
6.6.y | Present (exact SHA1)
6.1.y | Present (exact SHA1)
5.15.y | Present (exact SHA1)
5.10.y | Present (exact SHA1)
5.4.y | Not found

Note: The patch differs from the upstream commit:
---
1:  f3265971ded98 ! 1:  3a1397498ef8f net: xen-netback: hash.c: Use built-in RCU list checking
    @@ Metadata
      ## Commit message ##
         net: xen-netback: hash.c: Use built-in RCU list checking
     
    +    commit f3265971ded98a069ad699b51b8a5ab95e9e5be1 upstream.
    +
         list_for_each_entry_rcu has built-in RCU and lock checking.
         Pass cond argument to list_for_each_entry_rcu.
     
         Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik04@gmail.com>
         Acked-by: Wei Liu <wei.liu@kernel.org>
         Signed-off-by: David S. Miller <davem@davemloft.net>
    +    Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
     
      ## drivers/net/xen-netback/hash.c ##
     @@ drivers/net/xen-netback/hash.c: static void xenvif_add_hash(struct xenvif *vif, const u8 *tag,
---

Results of testing on various branches:

| Branch                    | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-5.4.y        |  Success    |  Success   |

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

end of thread, other threads:[~2025-01-22 22:38 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-22 17:43 [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Hagar Hemdan
2025-01-22 17:43 ` [PATCH 5.4] net/xen-netback: prevent UAF in xenvif_flush_hash() Hagar Hemdan
2025-01-22 22:38   ` Sasha Levin
2025-01-22 22:38 ` [PATCH 5.4] net: xen-netback: hash.c: Use built-in RCU list checking Sasha Levin

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