|
| 1 | +#include <uapi/linux/ptrace.h> |
| 2 | +#include <linux/sched.h> |
| 3 | + |
| 4 | +#define MAX_FILENAME_LEN_EBPF 256 |
| 5 | +#define TASK_COMM_LEN_EBPF 16 |
| 6 | + |
| 7 | +enum event_type { EVENT_OPEN = 0, EVENT_CLOSE = 1 }; |
| 8 | + |
| 9 | +struct data_t { |
| 10 | + u64 timestamp_ns; u32 pid; char comm[TASK_COMM_LEN_EBPF]; |
| 11 | + enum event_type type; char filename[MAX_FILENAME_LEN_EBPF]; |
| 12 | + int fd; int ret_val; |
| 13 | +}; |
| 14 | +BPF_RINGBUF_OUTPUT(events, 8); |
| 15 | + |
| 16 | +struct temp_filename_t { char fname[MAX_FILENAME_LEN_EBPF]; }; |
| 17 | +BPF_HASH(open_filenames_map, u64, struct temp_filename_t); |
| 18 | + |
| 19 | +enum debug_stage { |
| 20 | + DBG_OPEN_ENTRY_START = 100, DBG_OPEN_ENTRY_READ_DONE = 101, |
| 21 | + DBG_OPEN_RETURN_START = 200, DBG_OPEN_RETURN_LOOKUP_DONE = 201, |
| 22 | +}; |
| 23 | +struct debug_event_t { u64 id; enum debug_stage stage; long val1; long val2; }; |
| 24 | +BPF_RINGBUF_OUTPUT(debug_events_rb, 4); |
| 25 | + |
| 26 | +TRACEPOINT_PROBE(syscalls, sys_enter_openat) { |
| 27 | + u64 id = bpf_get_current_pid_tgid(); |
| 28 | + struct temp_filename_t temp_fn_data = {}; |
| 29 | + long read_res = 0; |
| 30 | + const char __user *filename_ptr_from_args = (const char __user *)args->filename; |
| 31 | + |
| 32 | + struct debug_event_t *dbg_evt = debug_events_rb.ringbuf_reserve(sizeof(struct debug_event_t)); |
| 33 | + if (dbg_evt) { |
| 34 | + dbg_evt->id = id; dbg_evt->stage = DBG_OPEN_ENTRY_START; |
| 35 | + dbg_evt->val1 = 0; dbg_evt->val2 = 0; |
| 36 | + debug_events_rb.ringbuf_submit(dbg_evt, 0); |
| 37 | + } |
| 38 | + |
| 39 | + read_res = bpf_probe_read_user_str(&temp_fn_data.fname, sizeof(temp_fn_data.fname), (void *)filename_ptr_from_args); |
| 40 | + |
| 41 | + dbg_evt = debug_events_rb.ringbuf_reserve(sizeof(struct debug_event_t)); |
| 42 | + if (dbg_evt) { |
| 43 | + dbg_evt->id = id; dbg_evt->stage = DBG_OPEN_ENTRY_READ_DONE; |
| 44 | + dbg_evt->val1 = read_res; dbg_evt->val2 = (read_res > 0) ? 1 : 0; |
| 45 | + debug_events_rb.ringbuf_submit(dbg_evt, 0); |
| 46 | + } |
| 47 | + |
| 48 | + if (read_res <= 0) { return 0; } |
| 49 | + temp_fn_data.fname[MAX_FILENAME_LEN_EBPF - 1] = '\0'; // CORRECTED |
| 50 | + open_filenames_map.update(&id, &temp_fn_data); |
| 51 | + return 0; |
| 52 | +} |
| 53 | + |
| 54 | +int trace_openat_return_kretprobe(struct pt_regs *ctx) { |
| 55 | + u64 id = bpf_get_current_pid_tgid(); |
| 56 | + int ret_fd = PT_REGS_RC(ctx); |
| 57 | + struct temp_filename_t *temp_fn_ptr = NULL; |
| 58 | + long lookup_success = 0; |
| 59 | + |
| 60 | + struct debug_event_t *dbg_evt = debug_events_rb.ringbuf_reserve(sizeof(struct debug_event_t)); |
| 61 | + if (dbg_evt) { |
| 62 | + dbg_evt->id = id; dbg_evt->stage = DBG_OPEN_RETURN_START; |
| 63 | + dbg_evt->val1 = ret_fd; dbg_evt->val2 = 0; |
| 64 | + debug_events_rb.ringbuf_submit(dbg_evt, 0); |
| 65 | + } |
| 66 | + |
| 67 | + if (ret_fd < 0) { |
| 68 | + open_filenames_map.delete(&id); |
| 69 | + return 0; |
| 70 | + } |
| 71 | + |
| 72 | + temp_fn_ptr = open_filenames_map.lookup(&id); |
| 73 | + lookup_success = (temp_fn_ptr != NULL) ? 1 : 0; |
| 74 | + |
| 75 | + dbg_evt = debug_events_rb.ringbuf_reserve(sizeof(struct debug_event_t)); |
| 76 | + if (dbg_evt) { |
| 77 | + dbg_evt->id = id; dbg_evt->stage = DBG_OPEN_RETURN_LOOKUP_DONE; |
| 78 | + dbg_evt->val1 = ret_fd; dbg_evt->val2 = lookup_success; |
| 79 | + debug_events_rb.ringbuf_submit(dbg_evt, 0); |
| 80 | + } |
| 81 | + |
| 82 | + if (!temp_fn_ptr) { return 0; } |
| 83 | + |
| 84 | + struct data_t *event_data_ptr = events.ringbuf_reserve(sizeof(struct data_t)); |
| 85 | + if (!event_data_ptr) { |
| 86 | + open_filenames_map.delete(&id); |
| 87 | + return 0; |
| 88 | + } |
| 89 | + event_data_ptr->timestamp_ns = bpf_ktime_get_ns(); |
| 90 | + event_data_ptr->pid = id >> 32; |
| 91 | + bpf_get_current_comm(&event_data_ptr->comm, sizeof(event_data_ptr->comm)); |
| 92 | + event_data_ptr->comm[TASK_COMM_LEN_EBPF - 1] = '\0'; // CORRECTED |
| 93 | + event_data_ptr->type = EVENT_OPEN; |
| 94 | + event_data_ptr->fd = ret_fd; |
| 95 | + event_data_ptr->ret_val = ret_fd; |
| 96 | + __builtin_memcpy(event_data_ptr->filename, temp_fn_ptr->fname, MAX_FILENAME_LEN_EBPF); |
| 97 | + event_data_ptr->filename[MAX_FILENAME_LEN_EBPF - 1] = '\0'; // CORRECTED |
| 98 | + events.ringbuf_submit(event_data_ptr, 0); |
| 99 | + open_filenames_map.delete(&id); |
| 100 | + return 0; |
| 101 | +} |
| 102 | + |
| 103 | +int trace_close_entry_kprobe(struct pt_regs *ctx, int fd_to_close) { |
| 104 | + u64 id = bpf_get_current_pid_tgid(); |
| 105 | + struct data_t *event_data_ptr = events.ringbuf_reserve(sizeof(struct data_t)); |
| 106 | + if (!event_data_ptr) { return 0; } |
| 107 | + event_data_ptr->timestamp_ns = bpf_ktime_get_ns(); |
| 108 | + event_data_ptr->pid = id >> 32; |
| 109 | + bpf_get_current_comm(&event_data_ptr->comm, sizeof(event_data_ptr->comm)); |
| 110 | + event_data_ptr->comm[TASK_COMM_LEN_EBPF - 1] = '\0'; // CORRECTED |
| 111 | + event_data_ptr->type = EVENT_CLOSE; |
| 112 | + event_data_ptr->fd = fd_to_close; |
| 113 | + event_data_ptr->filename[0] = '\0'; // CORRECTED |
| 114 | + event_data_ptr->ret_val = 0; |
| 115 | + events.ringbuf_submit(event_data_ptr, 0); |
| 116 | + return 0; |
| 117 | +} |
0 commit comments