All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id()
@ 2026-07-13  7:47 xuanqiang.luo
  2026-07-13  8:03 ` gang.yan
  2026-07-13  8:59 ` MPTCP CI
  0 siblings, 2 replies; 4+ messages in thread
From: xuanqiang.luo @ 2026-07-13  7:47 UTC (permalink / raw)
  To: mptcp; +Cc: matttbe, martineau, geliang, Xuanqiang Luo, stable

From: Xuanqiang Luo <luoxuanqiang@kylinos.cn>

mptcp_userspace_pm_get_local_id() looks up an address entry with
pm.lock held, but drops the lock before reading its ID. A concurrent
subflow destroy command can remove and free the entry in between,
resulting in a use-after-free while processing an MP_JOIN SYN.

Read the ID while holding pm.lock, then use the copied value after
unlocking.

Fixes: f012d796a6de ("mptcp: check addrs list in userspace_pm_get_local_id")
Cc: stable@vger.kernel.org
Signed-off-by: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
---
The race window is narrow. It was reproduced only with a locally
constructed stress test that repeatedly overlaps an MP_JOIN SYN with a
MPTCP_PM_CMD_SUBFLOW_DESTROY request.

However, the KASAN report below confirms that the race is reachable:

[  666.319362] ==================================================================
[  666.319376] BUG: KASAN: slab-use-after-free in mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
[  666.319386] Read of size 1 at addr ffff888124845610 by task swapper/0/0
...
[  666.319401] Call Trace:
[  666.319405]  <IRQ>
[  666.319408]  dump_stack_lvl+0x53/0x70
[  666.319412]  print_address_description.constprop.0+0x2c/0x3b0
[  666.319418]  print_report+0xbe/0x2b0
[  666.319421]  ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
[  666.319423]  kasan_report+0xce/0x100
[  666.319426]  ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
[  666.319429]  mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
[  666.319433]  mptcp_pm_get_local_id+0x371/0x440
...
[  666.319821] Allocated by task 45539:
[  666.319844]  kasan_save_stack+0x33/0x60
[  666.319855]  kasan_save_track+0x14/0x30
[  666.319858]  __kasan_kmalloc+0x8f/0xa0
[  666.319863]  __kmalloc_noprof+0x1e7/0x520
[  666.319867]  sock_kmalloc+0xdf/0x130
[  666.319885]  sock_kmemdup+0x1b/0x40
[  666.319888]  mptcp_userspace_pm_append_new_local_addr+0x261/0x500
[  666.319910]  mptcp_pm_nl_announce_doit+0x16a/0x610
...
[  666.319967] Freed by task 45560:
[  666.319988]  kasan_save_stack+0x33/0x60
[  666.319991]  kasan_save_track+0x14/0x30
[  666.319994]  kasan_save_free_info+0x3b/0x60
[  666.319998]  __kasan_slab_free+0x43/0x70
[  666.320000]  kfree+0x166/0x440
[  666.320003]  sock_kfree_s+0x1d/0x50
[  666.320007]  mptcp_userspace_pm_delete_local_addr.isra.0+0x157/0x200
[  666.320011]  mptcp_pm_nl_subflow_destroy_doit+0x51d/0xea0

 net/mptcp/pm_userspace.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index d100867e9202f..27fa8dc757b4f 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -132,12 +132,15 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
 	__be16 msk_sport =  ((struct inet_sock *)
 			     inet_sk((struct sock *)msk))->inet_sport;
 	struct mptcp_pm_addr_entry *entry;
+	int id = -1;
 
 	spin_lock_bh(&msk->pm.lock);
 	entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
-	spin_unlock_bh(&msk->pm.lock);
 	if (entry)
-		return entry->addr.id;
+		id = entry->addr.id;
+	spin_unlock_bh(&msk->pm.lock);
+	if (id >= 0)
+		return id;
 
 	if (skc->addr.port == msk_sport)
 		skc->addr.port = 0;
-- 
2.43.0

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

* Re: [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id()
  2026-07-13  7:47 [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id() xuanqiang.luo
@ 2026-07-13  8:03 ` gang.yan
  2026-07-13  8:21   ` luoxuanqiang
  2026-07-13  8:59 ` MPTCP CI
  1 sibling, 1 reply; 4+ messages in thread
From: gang.yan @ 2026-07-13  8:03 UTC (permalink / raw)
  To: xuanqiang.luo, mptcp; +Cc: matttbe, martineau, geliang, Xuanqiang Luo, stable

July 13, 2026 at 3:47 PM, xuanqiang.luo@linux.dev mailto:xuanqiang.luo@linux.dev  wrote:


Hi xuanqiang,

Thanks for the patch.

But AFAIK, geliang has fixed this in [1], and your test verified this issues.

@Matt, it seems that [1](geliang's patch) can be merged.

[1]https://patchwork.kernel.org/project/mptcp/patch/4e50adfde3b80f433e13b86919596be229045edc.1782799876.git.tanggeliang@kylinos.cn/

Thanks
Gang

> 
> From: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
> 
> mptcp_userspace_pm_get_local_id() looks up an address entry with
> pm.lock held, but drops the lock before reading its ID. A concurrent
> subflow destroy command can remove and free the entry in between,
> resulting in a use-after-free while processing an MP_JOIN SYN.
> 
> Read the ID while holding pm.lock, then use the copied value after
> unlocking.
> 
> Fixes: f012d796a6de ("mptcp: check addrs list in userspace_pm_get_local_id")
> Cc: stable@vger.kernel.org
> Signed-off-by: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
> ---
> The race window is narrow. It was reproduced only with a locally
> constructed stress test that repeatedly overlaps an MP_JOIN SYN with a
> MPTCP_PM_CMD_SUBFLOW_DESTROY request.
> 
> However, the KASAN report below confirms that the race is reachable:
> 
> [ 666.319362] ==================================================================
> [ 666.319376] BUG: KASAN: slab-use-after-free in mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319386] Read of size 1 at addr ffff888124845610 by task swapper/0/0
> ...
> [ 666.319401] Call Trace:
> [ 666.319405] <IRQ>
> [ 666.319408] dump_stack_lvl+0x53/0x70
> [ 666.319412] print_address_description.constprop.0+0x2c/0x3b0
> [ 666.319418] print_report+0xbe/0x2b0
> [ 666.319421] ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319423] kasan_report+0xce/0x100
> [ 666.319426] ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319429] mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319433] mptcp_pm_get_local_id+0x371/0x440
> ...
> [ 666.319821] Allocated by task 45539:
> [ 666.319844] kasan_save_stack+0x33/0x60
> [ 666.319855] kasan_save_track+0x14/0x30
> [ 666.319858] __kasan_kmalloc+0x8f/0xa0
> [ 666.319863] __kmalloc_noprof+0x1e7/0x520
> [ 666.319867] sock_kmalloc+0xdf/0x130
> [ 666.319885] sock_kmemdup+0x1b/0x40
> [ 666.319888] mptcp_userspace_pm_append_new_local_addr+0x261/0x500
> [ 666.319910] mptcp_pm_nl_announce_doit+0x16a/0x610
> ...
> [ 666.319967] Freed by task 45560:
> [ 666.319988] kasan_save_stack+0x33/0x60
> [ 666.319991] kasan_save_track+0x14/0x30
> [ 666.319994] kasan_save_free_info+0x3b/0x60
> [ 666.319998] __kasan_slab_free+0x43/0x70
> [ 666.320000] kfree+0x166/0x440
> [ 666.320003] sock_kfree_s+0x1d/0x50
> [ 666.320007] mptcp_userspace_pm_delete_local_addr.isra.0+0x157/0x200
> [ 666.320011] mptcp_pm_nl_subflow_destroy_doit+0x51d/0xea0
> 
>  net/mptcp/pm_userspace.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
> index d100867e9202f..27fa8dc757b4f 100644
> --- a/net/mptcp/pm_userspace.c
> +++ b/net/mptcp/pm_userspace.c
> @@ -132,12 +132,15 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
>  __be16 msk_sport = ((struct inet_sock *)
>  inet_sk((struct sock *)msk))->inet_sport;
>  struct mptcp_pm_addr_entry *entry;
> + int id = -1;
>  
>  spin_lock_bh(&msk->pm.lock);
>  entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
> - spin_unlock_bh(&msk->pm.lock);
>  if (entry)
> - return entry->addr.id;
> + id = entry->addr.id;
> + spin_unlock_bh(&msk->pm.lock);
> + if (id >= 0)
> + return id;
>  
>  if (skc->addr.port == msk_sport)
>  skc->addr.port = 0;
> -- 
> 2.43.0
>

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

* Re: [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id()
  2026-07-13  8:03 ` gang.yan
@ 2026-07-13  8:21   ` luoxuanqiang
  0 siblings, 0 replies; 4+ messages in thread
From: luoxuanqiang @ 2026-07-13  8:21 UTC (permalink / raw)
  To: gang.yan, mptcp; +Cc: matttbe, martineau, geliang, Xuanqiang Luo, stable


在 2026/7/13 16:03, gang.yan@linux.dev 写道:
> July 13, 2026 at 3:47 PM, xuanqiang.luo@linux.dev mailto:xuanqiang.luo@linux.dev  wrote:
>
>
> Hi xuanqiang,
>
> Thanks for the patch.
>
> But AFAIK, geliang has fixed this in [1], and your test verified this issues.
>
> @Matt, it seems that [1](geliang's patch) can be merged.
>
> [1]https://patchwork.kernel.org/project/mptcp/patch/4e50adfde3b80f433e13b86919596be229045edc.1782799876.git.tanggeliang@kylinos.cn/
>
> Thanks
> Gang

I see it now.
Indeed, I missed the pending patch;
Thank you for pointing it out!

Thanks
Xuanqiang


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

* Re: [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id()
  2026-07-13  7:47 [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id() xuanqiang.luo
  2026-07-13  8:03 ` gang.yan
@ 2026-07-13  8:59 ` MPTCP CI
  1 sibling, 0 replies; 4+ messages in thread
From: MPTCP CI @ 2026-07-13  8:59 UTC (permalink / raw)
  To: Xuanqiang Luo; +Cc: mptcp

Hi Xuanqiang,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal (except selftest_mptcp_join): Success! ✅
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Success! ✅
- KVM Validation: debug (only selftest_mptcp_join): Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/29234124591

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/b45c87910b87
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1126398


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-normal

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)

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

end of thread, other threads:[~2026-07-13  8:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-13  7:47 [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id() xuanqiang.luo
2026-07-13  8:03 ` gang.yan
2026-07-13  8:21   ` luoxuanqiang
2026-07-13  8:59 ` MPTCP CI

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.