1*d717b7e8SChristian Brauner // SPDX-License-Identifier: GPL-2.0 2*d717b7e8SChristian Brauner /* Copyright (c) 2026 Christian Brauner */ 3*d717b7e8SChristian Brauner 4*d717b7e8SChristian Brauner #include <vmlinux.h> 5*d717b7e8SChristian Brauner #include <bpf/bpf_tracing.h> 6*d717b7e8SChristian Brauner #include <bpf/bpf_helpers.h> 7*d717b7e8SChristian Brauner #include <bpf/bpf_core_read.h> 8*d717b7e8SChristian Brauner #include "bpf_experimental.h" 9*d717b7e8SChristian Brauner #include "bpf_misc.h" 10*d717b7e8SChristian Brauner 11*d717b7e8SChristian Brauner char _license[] SEC("license") = "GPL"; 12*d717b7e8SChristian Brauner 13*d717b7e8SChristian Brauner char value[16]; 14*d717b7e8SChristian Brauner int read_ret = -1; 15*d717b7e8SChristian Brauner __u32 monitored_pid = 0; 16*d717b7e8SChristian Brauner 17*d717b7e8SChristian Brauner static __always_inline void read_xattr(struct socket *sock) 18*d717b7e8SChristian Brauner { 19*d717b7e8SChristian Brauner struct bpf_dynptr value_ptr; 20*d717b7e8SChristian Brauner 21*d717b7e8SChristian Brauner bpf_dynptr_from_mem(value, sizeof(value), 0, &value_ptr); 22*d717b7e8SChristian Brauner bpf_sock_read_xattr(sock, "user.bpf_test", &value_ptr); 23*d717b7e8SChristian Brauner } 24*d717b7e8SChristian Brauner 25*d717b7e8SChristian Brauner SEC("lsm.s/socket_connect") 26*d717b7e8SChristian Brauner __success 27*d717b7e8SChristian Brauner int BPF_PROG(trusted_sock_ptr_sleepable, struct socket *sock) 28*d717b7e8SChristian Brauner { 29*d717b7e8SChristian Brauner read_xattr(sock); 30*d717b7e8SChristian Brauner return 0; 31*d717b7e8SChristian Brauner } 32*d717b7e8SChristian Brauner 33*d717b7e8SChristian Brauner SEC("lsm/socket_connect") 34*d717b7e8SChristian Brauner __success 35*d717b7e8SChristian Brauner int BPF_PROG(trusted_sock_ptr_non_sleepable, struct socket *sock) 36*d717b7e8SChristian Brauner { 37*d717b7e8SChristian Brauner read_xattr(sock); 38*d717b7e8SChristian Brauner return 0; 39*d717b7e8SChristian Brauner } 40*d717b7e8SChristian Brauner 41*d717b7e8SChristian Brauner SEC("lsm.s/socket_connect") 42*d717b7e8SChristian Brauner __success 43*d717b7e8SChristian Brauner int BPF_PROG(read_sock_xattr, struct socket *sock) 44*d717b7e8SChristian Brauner { 45*d717b7e8SChristian Brauner struct bpf_dynptr value_ptr; 46*d717b7e8SChristian Brauner __u32 pid = bpf_get_current_pid_tgid() >> 32; 47*d717b7e8SChristian Brauner 48*d717b7e8SChristian Brauner if (pid != monitored_pid) 49*d717b7e8SChristian Brauner return 0; 50*d717b7e8SChristian Brauner 51*d717b7e8SChristian Brauner bpf_dynptr_from_mem(value, sizeof(value), 0, &value_ptr); 52*d717b7e8SChristian Brauner read_ret = bpf_sock_read_xattr(sock, "user.bpf_test", &value_ptr); 53*d717b7e8SChristian Brauner return 0; 54*d717b7e8SChristian Brauner } 55