All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jialiang Wang <wangjialiang0806@163.com>
To: simon.horman@corigine.com, kuba@kernel.org, davem@davemloft.net,
	edumazet@google.com, pabeni@redhat.com, niejianglei2021@163.com,
	wangjialiang0806@163.com
Cc: oss-drivers@corigine.com, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v3] nfp: fix use-after-free in area_cache_get()
Date: Wed, 10 Aug 2022 15:30:57 +0800	[thread overview]
Message-ID: <20220810073057.4032-1-wangjialiang0806@163.com> (raw)

area_cache_get() is used to distribute cache->area and set cache->id,
 and if cache->id is not 0 and cache->area->kref refcount is 0, it will
 release the cache->area by nfp_cpp_area_release(). area_cache_get()
 set cache->id before cpp->op->area_init() and nfp_cpp_area_acquire().

But if area_init() or nfp_cpp_area_acquire() fails, the cache->id is
 is already set but the refcount is not increased as expected. At this
 time, calling the nfp_cpp_area_release() will cause use-after-free.

To avoid the use-after-free, set cache->id after area_init() and
 nfp_cpp_area_acquire() complete successfully.

Note: This vulnerability is triggerable by providing emulated device
 equipped with specified configuration.

 BUG: KASAN: use-after-free in nfp6000_area_init (/home/user/Kernel/v5.19
/x86_64/src/drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.c:760)
  Write of size 4 at addr ffff888005b7f4a0 by task swapper/0/1

 Call Trace:
  <TASK>
 nfp6000_area_init (/home/user/Kernel/v5.19/x86_64/src/drivers/net
/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.c:760)
 area_cache_get.constprop.8 (/home/user/Kernel/v5.19/x86_64/src/drivers
/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:884)

 Allocated by task 1:
 nfp_cpp_area_alloc_with_name (/home/user/Kernel/v5.19/x86_64/src/drivers
/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:303)
 nfp_cpp_area_cache_add (/home/user/Kernel/v5.19/x86_64/src/drivers/net
/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:802)
 nfp6000_init (/home/user/Kernel/v5.19/x86_64/src/drivers/net/ethernet
/netronome/nfp/nfpcore/nfp6000_pcie.c:1230)
 nfp_cpp_from_operations (/home/user/Kernel/v5.19/x86_64/src/drivers/net
/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:1215)
 nfp_pci_probe (/home/user/Kernel/v5.19/x86_64/src/drivers/net/ethernet
/netronome/nfp/nfp_main.c:744)

 Freed by task 1:
 kfree (/home/user/Kernel/v5.19/x86_64/src/mm/slub.c:4562)
 area_cache_get.constprop.8 (/home/user/Kernel/v5.19/x86_64/src/drivers
/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:873)
 nfp_cpp_read (/home/user/Kernel/v5.19/x86_64/src/drivers/net/ethernet
/netronome/nfp/nfpcore/nfp_cppcore.c:924 /home/user/Kernel/v5.19/x86_64
/src/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c:973)
 nfp_cpp_readl (/home/user/Kernel/v5.19/x86_64/src/drivers/net/ethernet
/netronome/nfp/nfpcore/nfp_cpplib.c:48)

Signed-off-by: Jialiang Wang <wangjialiang0806@163.com>
---
 drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c
index 34c0d2ddf9ef..a8286d0032d1 100644
--- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c
+++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c
@@ -874,7 +874,6 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
 	}
 
 	/* Adjust the start address to be cache size aligned */
-	cache->id = id;
 	cache->addr = addr & ~(u64)(cache->size - 1);
 
 	/* Re-init to the new ID and address */
@@ -894,6 +893,8 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
 		return NULL;
 	}
 
+	cache->id = id;
+
 exit:
 	/* Adjust offset */
 	*offset = addr - cache->addr;
-- 
2.17.1


             reply	other threads:[~2022-08-10  7:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-10  7:30 Jialiang Wang [this message]
2022-08-11  4:10 ` [PATCH v3] nfp: fix use-after-free in area_cache_get() Yinjun Zhang
2022-08-11  8:34   ` Simon Horman
2022-08-11 16:10 ` patchwork-bot+netdevbpf
2022-12-07 12:21 ` Lee Jones
2022-12-08 14:09   ` Simon Horman
2022-12-14 10:20     ` Lee Jones
2022-12-15  9:25     ` Lee Jones
2022-12-15  9:45       ` Greg KH
2022-12-15  9:51         ` Lee Jones

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=20220810073057.4032-1-wangjialiang0806@163.com \
    --to=wangjialiang0806@163.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=niejianglei2021@163.com \
    --cc=oss-drivers@corigine.com \
    --cc=pabeni@redhat.com \
    --cc=simon.horman@corigine.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.