[PATCH v2] net/rds: Fix a use after free in rds_message_map_pages

Subsystems: networking [general], rds - reliable datagram sockets, the rest

STALE1982d

3 messages, 3 authors, 2021-03-31 · open the first message on its own page

[PATCH v2] net/rds: Fix a use after free in rds_message_map_pages

From: Lv Yunlong <hidden>
Date: 2021-03-31 02:01:28

In rds_message_map_pages, the rm is freed by rds_message_put(rm).
But rm is still used by rm->data.op_sg in return value.

My patch assigns ERR_CAST(rm->data.op_sg) to err before the rm is
freed to avoid the uaf.

Fixes: 7dba92037baf3 ("net/rds: Use ERR_PTR for rds_message_alloc_sgs()")
Signed-off-by: Lv Yunlong <redacted>
---
 net/rds/message.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/rds/message.c b/net/rds/message.c
index 071a261fdaab..799034e0f513 100644
--- a/net/rds/message.c
+++ b/net/rds/message.c
@@ -347,8 +347,9 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in
 	rm->data.op_nents = DIV_ROUND_UP(total_len, PAGE_SIZE);
 	rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);
 	if (IS_ERR(rm->data.op_sg)) {
+		void *err = ERR_CAST(rm->data.op_sg);
 		rds_message_put(rm);
-		return ERR_CAST(rm->data.op_sg);
+		return err;
 	}
 
 	for (i = 0; i < rm->data.op_nents; ++i) {
-- 
2.25.1

Re: [PATCH v2] net/rds: Fix a use after free in rds_message_map_pages

From: Haakon Bugge <hidden>
Date: 2021-03-31 18:27:11

On 31 Mar 2021, at 03:59, Lv Yunlong [off-list ref] wrote:

In rds_message_map_pages, the rm is freed by rds_message_put(rm).
But rm is still used by rm->data.op_sg in return value.

My patch assigns ERR_CAST(rm->data.op_sg) to err before the rm is
freed to avoid the uaf.

Fixes: 7dba92037baf3 ("net/rds: Use ERR_PTR for rds_message_alloc_sgs()")
Signed-off-by: Lv Yunlong <redacted>
Reviewed-by: Håkon Bugge <redacted>


Thanks for fixing this:-)

Håkon

quoted hunk
---
net/rds/message.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/rds/message.c b/net/rds/message.c
index 071a261fdaab..799034e0f513 100644
--- a/net/rds/message.c
+++ b/net/rds/message.c
@@ -347,8 +347,9 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in
	rm->data.op_nents = DIV_ROUND_UP(total_len, PAGE_SIZE);
	rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs);
	if (IS_ERR(rm->data.op_sg)) {
+		void *err = ERR_CAST(rm->data.op_sg);
		rds_message_put(rm);
-		return ERR_CAST(rm->data.op_sg);
+		return err;
	}

	for (i = 0; i < rm->data.op_nents; ++i) {
-- 
2.25.1

Re: [PATCH v2] net/rds: Fix a use after free in rds_message_map_pages

From: patchwork-bot+netdevbpf@kernel.org
Date: 2021-03-31 21:30:53

Hello:

This patch was applied to netdev/net.git (refs/heads/master):

On Tue, 30 Mar 2021 18:59:59 -0700 you wrote:
In rds_message_map_pages, the rm is freed by rds_message_put(rm).
But rm is still used by rm->data.op_sg in return value.

My patch assigns ERR_CAST(rm->data.op_sg) to err before the rm is
freed to avoid the uaf.

Fixes: 7dba92037baf3 ("net/rds: Use ERR_PTR for rds_message_alloc_sgs()")
Signed-off-by: Lv Yunlong <redacted>

[...]
Here is the summary with links:
  - [v2] net/rds: Fix a use after free in rds_message_map_pages
    https://git.kernel.org/netdev/net/c/bdc2ab5c61a5

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

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help