Patch "bpf: Fix the kernel crash caused by bpf_setsockopt()." has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf: Fix the kernel crash caused by bpf_setsockopt().

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-fix-the-kernel-crash-caused-by-bpf_setsockopt.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 89ca4b1cbbd9accd7550f97aa00952a3c2856424
Author: Kui-Feng Lee <kuifeng@xxxxxxxx>
Date:   Thu Jan 26 16:17:32 2023 -0800

    bpf: Fix the kernel crash caused by bpf_setsockopt().
    
    [ Upstream commit 5416c9aea8323583e8696f0500b6142dfae80821 ]
    
    The kernel crash was caused by a BPF program attached to the
    "lsm_cgroup/socket_sock_rcv_skb" hook, which performed a call to
    `bpf_setsockopt()` in order to set the TCP_NODELAY flag as an
    example. Flags like TCP_NODELAY can prompt the kernel to flush a
    socket's outgoing queue, and this hook
    "lsm_cgroup/socket_sock_rcv_skb" is frequently triggered by
    softirqs. The issue was that in certain circumstances, when
    `tcp_write_xmit()` was called to flush the queue, it would also allow
    BH (bottom-half) to run. This could lead to our program attempting to
    flush the same socket recursively, which caused a `skbuff` to be
    unlinked twice.
    
    `security_sock_rcv_skb()` is triggered by `tcp_filter()`. This occurs
    before the sock ownership is checked in `tcp_v4_rcv()`. Consequently,
    if a bpf program runs on `security_sock_rcv_skb()` while under softirq
    conditions, it may not possess the lock needed for `bpf_setsockopt()`,
    thus presenting an issue.
    
    The patch fixes this issue by ensuring that a BPF program attached to
    the "lsm_cgroup/socket_sock_rcv_skb" hook is not allowed to call
    `bpf_setsockopt()`.
    
    The differences from v1 are
     - changing commit log to explain holding the lock of the sock,
     - emphasizing that TCP_NODELAY is not the only flag, and
     - adding the fixes tag.
    
    v1: https://lore.kernel.org/bpf/20230125000244.1109228-1-kuifeng@xxxxxxxx/
    
    Signed-off-by: Kui-Feng Lee <kuifeng@xxxxxxxx>
    Fixes: 9113d7e48e91 ("bpf: expose bpf_{g,s}etsockopt to lsm cgroup")
    Link: https://lore.kernel.org/r/20230127001732.4162630-1-kuifeng@xxxxxxxx
    Signed-off-by: Martin KaFai Lau <martin.lau@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/bpf/bpf_lsm.c b/kernel/bpf/bpf_lsm.c
index d6c9b3705f24..e6a76da4bca7 100644
--- a/kernel/bpf/bpf_lsm.c
+++ b/kernel/bpf/bpf_lsm.c
@@ -51,7 +51,6 @@ BTF_SET_END(bpf_lsm_current_hooks)
  */
 BTF_SET_START(bpf_lsm_locked_sockopt_hooks)
 #ifdef CONFIG_SECURITY_NETWORK
-BTF_ID(func, bpf_lsm_socket_sock_rcv_skb)
 BTF_ID(func, bpf_lsm_sock_graft)
 BTF_ID(func, bpf_lsm_inet_csk_clone)
 BTF_ID(func, bpf_lsm_inet_conn_established)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux