Skip to content

Commit acfea29

Browse files
committed
kprobe: support 38+ override on lsm funcs
1. Allow kprobe to use shared override programs. 2. The pinned path of ebpf programs and maps will be as below: /bpffs/tetragon/__override__ /bpffs/tetragon/__override__/kprobe /bpffs/tetragon/__override__/kprobe/__x64_sys_symlinkat /bpffs/tetragon/__override__/kprobe/__x64_sys_symlinkat/link_override /bpffs/tetragon/__override__/kprobe/__x64_sys_symlinkat/prog_override /bpffs/tetragon/__override__/kprobe/__x64_sys_execve /bpffs/tetragon/__override__/kprobe/__x64_sys_execve/link_override /bpffs/tetragon/__override__/kprobe/__x64_sys_execve/prog_override /bpffs/tetragon/__override__/override_tasks /bpffs/tetragon/__override__/fmod_ret /bpffs/tetragon/__override__/fmod_ret/security_bprm_creds_for_exec /bpffs/tetragon/__override__/fmod_ret/security_bprm_creds_for_exec/prog 3. Make sure that unused override programs are cleaned up via unloaderOverride(). 4. Move bpf functions regarding overrides into another object file. Signed-off-by: Sam Wang (holyspectral) <[email protected]>
1 parent 9d68fba commit acfea29

File tree

15 files changed

+357
-213
lines changed

15 files changed

+357
-213
lines changed

bpf/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ PROCESS += bpf_execve_event_v310.o bpf_exit_v310.o bpf_fork_v310.o
4444
PROCESS += bpf_execve_event.o bpf_fork.o bpf_exit.o bpf_execve_bprm_commit_creds.o
4545
# generic probes
4646
PROCESS += bpf_generic_kprobe.o bpf_generic_retkprobe.o bpf_generic_tracepoint.o \
47-
bpf_generic_uprobe.o bpf_generic_rawtp.o bpf_generic_usdt.o
47+
bpf_generic_uprobe.o bpf_generic_rawtp.o bpf_generic_usdt.o bpf_generic_override.o
4848

4949
# lsm
5050
PROCESS += bpf_generic_lsm_core.o bpf_generic_lsm_output.o

bpf/process/bpf_generic_kprobe.c

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,9 @@ struct {
4848

4949
#ifdef __MULTI_KPROBE
5050
#define MAIN "kprobe.multi/generic_kprobe"
51-
#define OVERRIDE "kprobe.multi/generic_kprobe_override"
5251
#define COMMON "kprobe.multi"
5352
#else
5453
#define MAIN "kprobe/generic_kprobe"
55-
#define OVERRIDE "kprobe/generic_kprobe_override"
5654
#define COMMON "kprobe"
5755
#endif
5856

@@ -139,35 +137,3 @@ generic_kprobe_path(void *ctx)
139137
return generic_path(ctx, (struct bpf_map_def *)&kprobe_calls);
140138
}
141139
#endif
142-
143-
__attribute__((section(OVERRIDE), used)) int
144-
generic_kprobe_override(void *ctx)
145-
{
146-
__u64 id = get_current_pid_tgid();
147-
__s32 *error;
148-
149-
error = map_lookup_elem(&override_tasks, &id);
150-
if (!error)
151-
return 0;
152-
153-
override_return(ctx, *error);
154-
map_delete_elem(&override_tasks, &id);
155-
return 0;
156-
}
157-
158-
/* Putting security_task_prctl in here to pass contrib/verify/verify.sh test,
159-
* in normal run the function is set by tetragon dynamically.
160-
*/
161-
__attribute__((section("fmod_ret/security_task_prctl"), used)) long
162-
generic_fmodret_override(void *ctx)
163-
{
164-
__u64 id = get_current_pid_tgid();
165-
__s32 *error;
166-
167-
error = map_lookup_elem(&override_tasks, &id);
168-
if (!error)
169-
return 0;
170-
171-
map_delete_elem(&override_tasks, &id);
172-
return (long)*error;
173-
}

bpf/process/bpf_generic_lsm_output.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
#include "bpf_task.h"
1515
#include "retprobe_map.h"
1616
#include "types/basic.h"
17-
#include "generic_maps.h"
18-
1917
#include "generic_maps.h"
2018
#include "generic_calls.h"
2119

bpf/process/bpf_generic_override.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+
/* Copyright Authors of Cilium */
3+
4+
#include "vmlinux.h"
5+
#include "api.h"
6+
#include "bpf_helpers.h"
7+
#include "generic.h"
8+
#include "bpf_override_maps.h"
9+
10+
char _license[] __attribute__((section("license"), used)) = "Dual BSD/GPL";
11+
12+
__attribute__((section("kprobe/generic_kprobe_override"), used)) int
13+
generic_kprobe_override(void *ctx)
14+
{
15+
__u64 id = get_current_pid_tgid();
16+
__s32 *error;
17+
18+
error = map_lookup_elem(&override_tasks, &id);
19+
if (!error)
20+
return 0;
21+
22+
override_return(ctx, *error);
23+
map_delete_elem(&override_tasks, &id);
24+
return 0;
25+
}
26+
27+
/* Putting security_task_prctl in here to pass contrib/verify/verify.sh test,
28+
* in normal run the function is set by tetragon dynamically.
29+
*/
30+
__attribute__((section("fmod_ret/security_task_prctl"), used)) long
31+
generic_fmodret_override(void *ctx)
32+
{
33+
__u64 id = get_current_pid_tgid();
34+
__s32 *error;
35+
36+
error = map_lookup_elem(&override_tasks, &id);
37+
if (!error)
38+
return 0;
39+
40+
map_delete_elem(&override_tasks, &id);
41+
return (long)*error;
42+
}

bpf/process/bpf_override_maps.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+
/* Copyright Authors of Cilium */
3+
4+
#ifndef _BPF_OVERRIDE_MAPS__
5+
#define _BPF_OVERRIDE_MAPS__
6+
7+
#include "lib/data_msg.h"
8+
9+
struct {
10+
__uint(type, BPF_MAP_TYPE_HASH);
11+
__uint(max_entries, 1); // will be resized by agent when needed
12+
__type(key, __u64);
13+
__type(value, __s32);
14+
} override_tasks SEC(".maps");
15+
16+
#endif

bpf/process/generic_calls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "policy_stats.h"
1414
#include "generic_path.h"
1515
#include "bpf_ktime.h"
16+
#include "bpf_override_maps.h"
1617

1718
#define MAX_TOTAL 9000
1819

bpf/process/generic_maps.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,6 @@ struct {
1313
__type(value, struct msg_generic_kprobe);
1414
} process_call_heap SEC(".maps");
1515

16-
struct {
17-
__uint(type, BPF_MAP_TYPE_HASH);
18-
__uint(max_entries, 1); // will be resized by agent when needed
19-
__type(key, __u64);
20-
__type(value, __s32);
21-
} override_tasks SEC(".maps");
22-
2316
#ifdef __LARGE_BPF_PROG
2417
#if defined(GENERIC_TRACEPOINT) || defined(GENERIC_UPROBE)
2518
#define data_heap_ptr 0

pkg/sensors/load.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ func (s *Sensor) policyDir() string {
6565

6666
func (s *Sensor) createDirs(bpfDir string) {
6767
for _, p := range s.Progs {
68-
// setup sensor based program pin path
69-
p.PinPath = filepath.Join(s.policyDir(), s.Name, p.PinName)
68+
// setup sensor based program pin path if it's not specified
69+
if p.PinPath == "" {
70+
p.PinPath = filepath.Join(s.policyDir(), s.Name, p.PinName)
71+
}
7072
// and make the path
7173
if err := os.MkdirAll(filepath.Join(bpfDir, p.PinPath), os.ModeDir); err != nil {
7274
logger.GetLogger().Warn("Failed to create program dir",

pkg/sensors/load_linux.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ import (
1919
)
2020

2121
func (s *Sensor) setMapPinPath(m *program.Map) {
22+
if m.PinPath != "" {
23+
// Use the specified one when m.PinPath is already available.
24+
return
25+
}
2226
policy := s.policyDir()
2327
switch m.Type {
2428
case program.MapTypeGlobal:

0 commit comments

Comments
 (0)