4
#include <bpf/bpf_core_read.h>
5
#include <bpf/bpf_helpers.h>
7
#include <gadget/mntns_filter.h>
9
#define MAX_ENTRIES 10240
11
const volatile pid_t filtered_pid = 0;
12
const volatile int target_signal = 0;
13
const volatile bool failed_only = false;
16
const struct event *unusedevent __attribute__((unused));
19
__uint(type, BPF_MAP_TYPE_HASH);
20
__uint(max_entries, MAX_ENTRIES);
22
__type(value, struct event);
26
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
27
__uint(key_size, sizeof(__u32));
28
__uint(value_size, sizeof(__u32));
31
static int probe_entry(pid_t tpid, int sig)
33
struct event event = {};
38
mntns_id = gadget_get_mntns_id();
40
if (gadget_should_discard_mntns_id(mntns_id))
43
if (target_signal && sig != target_signal)
46
pid_tgid = bpf_get_current_pid_tgid();
48
tid = (__u32)pid_tgid;
49
if (filtered_pid && pid != filtered_pid)
55
event.mntns_id = mntns_id;
56
bpf_get_current_comm(event.comm, sizeof(event.comm));
57
bpf_map_update_elem(&values, &tid, &event, BPF_ANY);
61
static int probe_exit(void *ctx, int ret)
63
__u64 pid_tgid = bpf_get_current_pid_tgid();
64
__u64 uid_gid = bpf_get_current_uid_gid();
65
__u32 tid = (__u32)pid_tgid;
68
eventp = bpf_map_lookup_elem(&values, &tid);
72
if (failed_only && ret >= 0)
76
eventp->timestamp = bpf_ktime_get_boot_ns();
77
eventp->uid = (u32)uid_gid;
78
eventp->gid = (u32)(uid_gid >> 32);
79
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, eventp,
83
bpf_map_delete_elem(&values, &tid);
87
SEC("tracepoint/syscalls/sys_enter_kill")
88
int ig_sig_kill_e(struct trace_event_raw_sys_enter *ctx)
90
pid_t tpid = (pid_t)ctx->args[0];
91
int sig = (int)ctx->args[1];
93
return probe_entry(tpid, sig);
96
SEC("tracepoint/syscalls/sys_exit_kill")
97
int ig_sig_kill_x(struct trace_event_raw_sys_exit *ctx)
99
return probe_exit(ctx, ctx->ret);
102
SEC("tracepoint/syscalls/sys_enter_tkill")
103
int ig_sig_tkill_e(struct trace_event_raw_sys_enter *ctx)
105
pid_t tpid = (pid_t)ctx->args[0];
106
int sig = (int)ctx->args[1];
108
return probe_entry(tpid, sig);
111
SEC("tracepoint/syscalls/sys_exit_tkill")
112
int ig_sig_tkill_x(struct trace_event_raw_sys_exit *ctx)
114
return probe_exit(ctx, ctx->ret);
117
SEC("tracepoint/syscalls/sys_enter_tgkill")
118
int ig_sig_tgkill_e(struct trace_event_raw_sys_enter *ctx)
120
pid_t tpid = (pid_t)ctx->args[1];
121
int sig = (int)ctx->args[2];
123
return probe_entry(tpid, sig);
126
SEC("tracepoint/syscalls/sys_exit_tgkill")
127
int ig_sig_tgkill_x(struct trace_event_raw_sys_exit *ctx)
129
return probe_exit(ctx, ctx->ret);
132
SEC("tracepoint/signal/signal_generate")
133
int ig_sig_generate(struct trace_event_raw_signal_generate *ctx)
135
struct event event = {};
136
pid_t tpid = ctx->pid;
137
int ret = ctx->errno;
142
__u64 uid_gid = bpf_get_current_uid_gid();
144
mntns_id = gadget_get_mntns_id();
146
if (gadget_should_discard_mntns_id(mntns_id))
149
if (failed_only && ret == 0)
152
if (target_signal && sig != target_signal)
155
pid_tgid = bpf_get_current_pid_tgid();
156
pid = pid_tgid >> 32;
157
if (filtered_pid && pid != filtered_pid)
162
event.mntns_id = mntns_id;
165
event.uid = (u32)uid_gid;
166
event.gid = (u32)(uid_gid >> 32);
167
bpf_get_current_comm(event.comm, sizeof(event.comm));
168
event.timestamp = bpf_ktime_get_boot_ns();
169
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event,
174
char LICENSE[] SEC("license") = "Dual BSD/GPL";