Skip to content

[ciqlts9_6] bpf, sockmap: Avoid using sk_socket after free when sending#941

Closed
ciq-kernel-automation[bot] wants to merge 1 commit intociqlts9_6from
{ciq_kernel_automation}_ciqlts9_6
Closed

[ciqlts9_6] bpf, sockmap: Avoid using sk_socket after free when sending#941
ciq-kernel-automation[bot] wants to merge 1 commit intociqlts9_6from
{ciq_kernel_automation}_ciqlts9_6

Conversation

@ciq-kernel-automation
Copy link

Summary

This PR has been automatically created after successful completion of all CI stages.

Commit Message(s)

bpf, sockmap: Avoid using sk_socket after free when sending

jira VULN-163385
cve CVE-2025-38154
commit-author Jiayuan Chen <jiayuan.chen@linux.dev>
commit 8259eb0e06d8f64c700f5fbdb28a5c18e10de291

Test Results

✅ Build Stage

Architecture Build Time Total Time
x86_64 32m 44s 36m 53s
aarch64 18m 58s 21m 52s

✅ Boot Verification

✅ Kernel Selftests

Architecture Passed Failed
x86_64 206 44
aarch64 156 44

Test Comparison

x86_64:

  • ⚠️ Status: Skipped - No baseline available

aarch64:

  • ⚠️ Status: Skipped - No baseline available

🤖 This PR was automatically generated by GitHub Actions
Run ID: 22725198195

jira VULN-163385
cve CVE-2025-38154
commit-author Jiayuan Chen <jiayuan.chen@linux.dev>
commit 8259eb0

The sk->sk_socket is not locked or referenced in backlog thread, and
during the call to skb_send_sock(), there is a race condition with
the release of sk_socket. All types of sockets(tcp/udp/unix/vsock)
will be affected.

Race conditions:
'''
CPU0                               CPU1

backlog::skb_send_sock
  sendmsg_unlocked
    sock_sendmsg
      sock_sendmsg_nosec
                                   close(fd):
                                     ...
                                     ops->release() -> sock_map_close()
                                     sk_socket->ops = NULL
                                     free(socket)
      sock->ops->sendmsg
            ^
            panic here
'''

The ref of psock become 0 after sock_map_close() executed.
'''
void sock_map_close()
{
    ...
    if (likely(psock)) {
    ...
    // !! here we remove psock and the ref of psock become 0
    sock_map_remove_links(sk, psock)
    psock = sk_psock_get(sk);
    if (unlikely(!psock))
        goto no_psock; <=== Control jumps here via goto
        ...
        cancel_delayed_work_sync(&psock->work); <=== not executed
        sk_psock_put(sk, psock);
        ...
}
'''

Based on the fact that we already wait for the workqueue to finish in
sock_map_close() if psock is held, we simply increase the psock
reference count to avoid race conditions.

With this patch, if the backlog thread is running, sock_map_close() will
wait for the backlog thread to complete and cancel all pending work.

If no backlog running, any pending work that hasn't started by then will
fail when invoked by sk_psock_get(), as the psock reference count have
been zeroed, and sk_psock_drop() will cancel all jobs via
cancel_delayed_work_sync().

In summary, we require synchronization to coordinate the backlog thread
and close() thread.

The panic I catched:
'''
Workqueue: events sk_psock_backlog
RIP: 0010:sock_sendmsg+0x21d/0x440
RAX: 0000000000000000 RBX: ffffc9000521fad8 RCX: 0000000000000001
...
Call Trace:
 <TASK>
 ? die_addr+0x40/0xa0
 ? exc_general_protection+0x14c/0x230
 ? asm_exc_general_protection+0x26/0x30
 ? sock_sendmsg+0x21d/0x440
 ? sock_sendmsg+0x3e0/0x440
 ? __pfx_sock_sendmsg+0x10/0x10
 __skb_send_sock+0x543/0xb70
 sk_psock_backlog+0x247/0xb80
...
'''

Fixes: 4b4647a ("sock_map: avoid race between sock_map_close and sk_psock_put")
	Reported-by: Michal Luczaj <mhal@rbox.co>
	Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
	Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
	Reviewed-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/r/20250516141713.291150-1-jiayuan.chen@linux.dev
(cherry picked from commit 8259eb0)
	Signed-off-by: CIQ Kernel Automation <ciq_kernel_automation@ciq.com>
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🤖 Validation Checks In Progress Workflow run: https://github.com/ctrliq/kernel-src-tree/actions/runs/22731791021

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🔍 Interdiff Analysis

  • ⚠️ PR commit 157a3e01a46 (bpf, sockmap: Avoid using sk_socket after free when sending) → upstream 8259eb0e06d8
    Differences found:
================================================================================
*    CONTEXT DIFFERENCES - surrounding code differences between the patches    *
================================================================================

--- b/net/core/skmsg.c
+++ b/net/core/skmsg.c
@@ -644,5 +645,5 @@
 	int ret;
 
 	mutex_lock(&psock->work_mutex);
-	if (unlikely(state->skb)) {
-		spin_lock_bh(&psock->ingress_lock);
+	while ((skb = skb_peek(&psock->ingress_skb))) {
+		len = skb->len;

This is an automated interdiff check for backported commits.

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

JIRA PR Check Results

1 commit(s) with issues found:

Commit 157a3e01a46a

Summary: bpf, sockmap: Avoid using sk_socket after free when sending

❌ Errors:

  • VULN-163385: Status is 'To Do', expected 'In Progress'

⚠️ Warnings:

  • VULN-163385: No time logged - please log time manually

Summary: Checked 1 commit(s) total.

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

Validation checks completed with issues View full results: https://github.com/ctrliq/kernel-src-tree/actions/runs/22731791021

@roxanan1996 roxanan1996 closed this Mar 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant