xref: /aosp_15_r20/external/bcc/libbpf-tools/mountsnoop.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 */
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2021 Hengqi Chen */
3*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_core_read.h>
6*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
7*387f9dfdSAndroid Build Coastguard Worker 
8*387f9dfdSAndroid Build Coastguard Worker #include "compat.bpf.h"
9*387f9dfdSAndroid Build Coastguard Worker #include "mountsnoop.h"
10*387f9dfdSAndroid Build Coastguard Worker 
11*387f9dfdSAndroid Build Coastguard Worker #define MAX_ENTRIES 10240
12*387f9dfdSAndroid Build Coastguard Worker 
13*387f9dfdSAndroid Build Coastguard Worker const volatile pid_t target_pid = 0;
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker struct {
16*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_HASH);
17*387f9dfdSAndroid Build Coastguard Worker 	__uint(max_entries, MAX_ENTRIES);
18*387f9dfdSAndroid Build Coastguard Worker 	__type(key, __u32);
19*387f9dfdSAndroid Build Coastguard Worker 	__type(value, struct arg);
20*387f9dfdSAndroid Build Coastguard Worker } args SEC(".maps");
21*387f9dfdSAndroid Build Coastguard Worker 
probe_entry(const char * src,const char * dest,const char * fs,__u64 flags,const char * data,enum op op)22*387f9dfdSAndroid Build Coastguard Worker static int probe_entry(const char *src, const char *dest, const char *fs,
23*387f9dfdSAndroid Build Coastguard Worker 		       __u64 flags, const char *data, enum op op)
24*387f9dfdSAndroid Build Coastguard Worker {
25*387f9dfdSAndroid Build Coastguard Worker 	__u64 pid_tgid = bpf_get_current_pid_tgid();
26*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = pid_tgid >> 32;
27*387f9dfdSAndroid Build Coastguard Worker 	__u32 tid = (__u32)pid_tgid;
28*387f9dfdSAndroid Build Coastguard Worker 	struct arg arg = {};
29*387f9dfdSAndroid Build Coastguard Worker 
30*387f9dfdSAndroid Build Coastguard Worker 	if (target_pid && target_pid != pid)
31*387f9dfdSAndroid Build Coastguard Worker 		return 0;
32*387f9dfdSAndroid Build Coastguard Worker 
33*387f9dfdSAndroid Build Coastguard Worker 	arg.ts = bpf_ktime_get_ns();
34*387f9dfdSAndroid Build Coastguard Worker 	arg.flags = flags;
35*387f9dfdSAndroid Build Coastguard Worker 	arg.src = src;
36*387f9dfdSAndroid Build Coastguard Worker 	arg.dest = dest;
37*387f9dfdSAndroid Build Coastguard Worker 	arg.fs = fs;
38*387f9dfdSAndroid Build Coastguard Worker 	arg.data= data;
39*387f9dfdSAndroid Build Coastguard Worker 	arg.op = op;
40*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_update_elem(&args, &tid, &arg, BPF_ANY);
41*387f9dfdSAndroid Build Coastguard Worker 	return 0;
42*387f9dfdSAndroid Build Coastguard Worker };
43*387f9dfdSAndroid Build Coastguard Worker 
probe_exit(void * ctx,int ret)44*387f9dfdSAndroid Build Coastguard Worker static int probe_exit(void *ctx, int ret)
45*387f9dfdSAndroid Build Coastguard Worker {
46*387f9dfdSAndroid Build Coastguard Worker 	__u64 pid_tgid = bpf_get_current_pid_tgid();
47*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = pid_tgid >> 32;
48*387f9dfdSAndroid Build Coastguard Worker 	__u32 tid = (__u32)pid_tgid;
49*387f9dfdSAndroid Build Coastguard Worker 	struct task_struct *task;
50*387f9dfdSAndroid Build Coastguard Worker 	struct event *eventp;
51*387f9dfdSAndroid Build Coastguard Worker 	struct arg *argp;
52*387f9dfdSAndroid Build Coastguard Worker 
53*387f9dfdSAndroid Build Coastguard Worker 	argp = bpf_map_lookup_elem(&args, &tid);
54*387f9dfdSAndroid Build Coastguard Worker 	if (!argp)
55*387f9dfdSAndroid Build Coastguard Worker 		return 0;
56*387f9dfdSAndroid Build Coastguard Worker 
57*387f9dfdSAndroid Build Coastguard Worker 	eventp = reserve_buf(sizeof(*eventp));
58*387f9dfdSAndroid Build Coastguard Worker 	if (!eventp)
59*387f9dfdSAndroid Build Coastguard Worker 		goto cleanup;
60*387f9dfdSAndroid Build Coastguard Worker 
61*387f9dfdSAndroid Build Coastguard Worker 	task = (struct task_struct *)bpf_get_current_task();
62*387f9dfdSAndroid Build Coastguard Worker 	eventp->delta = bpf_ktime_get_ns() - argp->ts;
63*387f9dfdSAndroid Build Coastguard Worker 	eventp->flags = argp->flags;
64*387f9dfdSAndroid Build Coastguard Worker 	eventp->pid = pid;
65*387f9dfdSAndroid Build Coastguard Worker 	eventp->tid = tid;
66*387f9dfdSAndroid Build Coastguard Worker 	eventp->mnt_ns = BPF_CORE_READ(task, nsproxy, mnt_ns, ns.inum);
67*387f9dfdSAndroid Build Coastguard Worker 	eventp->ret = ret;
68*387f9dfdSAndroid Build Coastguard Worker 	eventp->op = argp->op;
69*387f9dfdSAndroid Build Coastguard Worker 	bpf_get_current_comm(&eventp->comm, sizeof(eventp->comm));
70*387f9dfdSAndroid Build Coastguard Worker 	if (argp->src)
71*387f9dfdSAndroid Build Coastguard Worker 		bpf_probe_read_user_str(eventp->src, sizeof(eventp->src), argp->src);
72*387f9dfdSAndroid Build Coastguard Worker 	else
73*387f9dfdSAndroid Build Coastguard Worker 		eventp->src[0] = '\0';
74*387f9dfdSAndroid Build Coastguard Worker 	if (argp->dest)
75*387f9dfdSAndroid Build Coastguard Worker 		bpf_probe_read_user_str(eventp->dest, sizeof(eventp->dest), argp->dest);
76*387f9dfdSAndroid Build Coastguard Worker 	else
77*387f9dfdSAndroid Build Coastguard Worker 		eventp->dest[0] = '\0';
78*387f9dfdSAndroid Build Coastguard Worker 	if (argp->fs)
79*387f9dfdSAndroid Build Coastguard Worker 		bpf_probe_read_user_str(eventp->fs, sizeof(eventp->fs), argp->fs);
80*387f9dfdSAndroid Build Coastguard Worker 	else
81*387f9dfdSAndroid Build Coastguard Worker 		eventp->fs[0] = '\0';
82*387f9dfdSAndroid Build Coastguard Worker 	if (argp->data)
83*387f9dfdSAndroid Build Coastguard Worker 		bpf_probe_read_user_str(eventp->data, sizeof(eventp->data), argp->data);
84*387f9dfdSAndroid Build Coastguard Worker 	else
85*387f9dfdSAndroid Build Coastguard Worker 		eventp->data[0] = '\0';
86*387f9dfdSAndroid Build Coastguard Worker 
87*387f9dfdSAndroid Build Coastguard Worker 	submit_buf(ctx, eventp, sizeof(*eventp));
88*387f9dfdSAndroid Build Coastguard Worker 
89*387f9dfdSAndroid Build Coastguard Worker cleanup:
90*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_delete_elem(&args, &tid);
91*387f9dfdSAndroid Build Coastguard Worker 	return 0;
92*387f9dfdSAndroid Build Coastguard Worker }
93*387f9dfdSAndroid Build Coastguard Worker 
94*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_mount")
mount_entry(struct trace_event_raw_sys_enter * ctx)95*387f9dfdSAndroid Build Coastguard Worker int mount_entry(struct trace_event_raw_sys_enter *ctx)
96*387f9dfdSAndroid Build Coastguard Worker {
97*387f9dfdSAndroid Build Coastguard Worker 	const char *src = (const char *)ctx->args[0];
98*387f9dfdSAndroid Build Coastguard Worker 	const char *dest = (const char *)ctx->args[1];
99*387f9dfdSAndroid Build Coastguard Worker 	const char *fs = (const char *)ctx->args[2];
100*387f9dfdSAndroid Build Coastguard Worker 	__u64 flags = (__u64)ctx->args[3];
101*387f9dfdSAndroid Build Coastguard Worker 	const char *data = (const char *)ctx->args[4];
102*387f9dfdSAndroid Build Coastguard Worker 
103*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(src, dest, fs, flags, data, MOUNT);
104*387f9dfdSAndroid Build Coastguard Worker }
105*387f9dfdSAndroid Build Coastguard Worker 
106*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_mount")
mount_exit(struct trace_event_raw_sys_exit * ctx)107*387f9dfdSAndroid Build Coastguard Worker int mount_exit(struct trace_event_raw_sys_exit *ctx)
108*387f9dfdSAndroid Build Coastguard Worker {
109*387f9dfdSAndroid Build Coastguard Worker 	return probe_exit(ctx, (int)ctx->ret);
110*387f9dfdSAndroid Build Coastguard Worker }
111*387f9dfdSAndroid Build Coastguard Worker 
112*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_umount")
umount_entry(struct trace_event_raw_sys_enter * ctx)113*387f9dfdSAndroid Build Coastguard Worker int umount_entry(struct trace_event_raw_sys_enter *ctx)
114*387f9dfdSAndroid Build Coastguard Worker {
115*387f9dfdSAndroid Build Coastguard Worker 	const char *dest = (const char *)ctx->args[0];
116*387f9dfdSAndroid Build Coastguard Worker 	__u64 flags = (__u64)ctx->args[1];
117*387f9dfdSAndroid Build Coastguard Worker 
118*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(NULL, dest, NULL, flags, NULL, UMOUNT);
119*387f9dfdSAndroid Build Coastguard Worker }
120*387f9dfdSAndroid Build Coastguard Worker 
121*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_umount")
umount_exit(struct trace_event_raw_sys_exit * ctx)122*387f9dfdSAndroid Build Coastguard Worker int umount_exit(struct trace_event_raw_sys_exit *ctx)
123*387f9dfdSAndroid Build Coastguard Worker {
124*387f9dfdSAndroid Build Coastguard Worker 	return probe_exit(ctx, (int)ctx->ret);
125*387f9dfdSAndroid Build Coastguard Worker }
126*387f9dfdSAndroid Build Coastguard Worker 
127*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "Dual BSD/GPL";
128