Skip to content

Commit c0067a5

Browse files
committed
feat(sensors): support 38+ override on lsm funcs
Signed-off-by: Sam Wang (holyspectral) <[email protected]>
1 parent 7e7a703 commit c0067a5

File tree

5 files changed

+97
-28
lines changed

5 files changed

+97
-28
lines changed

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:

pkg/sensors/program/loader_linux.go

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,21 +132,10 @@ func KprobeOpen(load *Program) OpenFunc {
132132
// The generic_kprobe_override program is part of bpf_generic_kprobe.o object,
133133
// so let's disable it if the override is not configured. Otherwise it gets
134134
// loaded and bpftool will show it.
135-
if !load.Override {
135+
if !load.Override || load.OverrideFmodRet {
136136
disableProg(coll, "generic_kprobe_override")
137-
disableProg(coll, "generic_fmodret_override")
138-
} else {
139-
if load.OverrideFmodRet {
140-
spec, ok := coll.Programs["generic_fmodret_override"]
141-
if !ok {
142-
return errors.New("failed to find generic_fmodret_override")
143-
}
144-
spec.AttachTo = load.Attach
145-
disableProg(coll, "generic_kprobe_override")
146-
} else {
147-
disableProg(coll, "generic_fmodret_override")
148-
}
149137
}
138+
disableProg(coll, "generic_fmodret_override")
150139
return nil
151140
}
152141
}
@@ -266,15 +255,9 @@ func KprobeAttach(load *Program, bpfDir string) AttachFunc {
266255
return func(coll *ebpf.Collection, collSpec *ebpf.CollectionSpec,
267256
prog *ebpf.Program, spec *ebpf.ProgramSpec) (unloader.Unloader, error) {
268257

269-
if load.Override {
270-
if load.OverrideFmodRet {
271-
if err := fmodretAttachOverride(load, bpfDir, coll, collSpec); err != nil {
272-
return nil, err
273-
}
274-
} else {
275-
if err := kprobeAttachOverride(load, bpfDir, coll, collSpec); err != nil {
276-
return nil, err
277-
}
258+
if load.Override && !load.OverrideFmodRet {
259+
if err := kprobeAttachOverride(load, bpfDir, coll, collSpec); err != nil {
260+
return nil, err
278261
}
279262
}
280263

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package tracing
2+
3+
import (
4+
"path"
5+
6+
"github.com/cilium/tetragon/pkg/config"
7+
"github.com/cilium/tetragon/pkg/option"
8+
"github.com/cilium/tetragon/pkg/sensors/program"
9+
)
10+
11+
var fmodretMap map[string]*program.Program
12+
13+
func getFmodRetProg(attachFunc string) (*program.Program, *program.Map) {
14+
var fmodret *program.Program
15+
var ok bool
16+
17+
if fmodretMap == nil {
18+
fmodretMap = make(map[string]*program.Program)
19+
}
20+
21+
loadProgName, _ := config.GenericKprobeObjs(false)
22+
23+
if fmodret, ok = fmodretMap[attachFunc]; !ok {
24+
25+
fmodret = program.Builder(
26+
path.Join(option.Config.HubbleLib, loadProgName),
27+
attachFunc,
28+
"fmod_ret/security_task_prctl",
29+
"fmod_ret/"+attachFunc,
30+
"generic_fmod_ret")
31+
32+
fmodret.PinPath = "fmod_ret/" + attachFunc
33+
34+
fmodretmap := program.MapBuilder("override_tasks", fmodret)
35+
fmodretmap.PinPath = path.Join("fmod_ret/", attachFunc, "override_tasks")
36+
37+
fmodretMap[attachFunc] = fmodret
38+
}
39+
return fmodret, fmodret.PinMap["override_tasks"]
40+
}

pkg/sensors/tracing/generickprobe.go

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,23 @@ type observerKprobeSensor struct {
5353
name string
5454
}
5555

56+
type fmodRetProgram struct {
57+
name string
58+
}
59+
5660
func init() {
5761
kprobe := &observerKprobeSensor{
5862
name: "kprobe sensor",
5963
}
64+
65+
fmodRet := &fmodRetProgram{
66+
name: "fmod_ret program",
67+
}
68+
6069
sensors.RegisterProbeType("generic_kprobe", kprobe)
6170
observer.RegisterEventHandlerAtInit(ops.MSG_OP_GENERIC_KPROBE, handleGenericKprobe)
71+
72+
sensors.RegisterProbeType("generic_fmod_ret", fmodRet)
6273
}
6374

6475
type kprobeSelectors struct {
@@ -1073,11 +1084,25 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
10731084
maps = append(maps, program.MapUser(cgtracker.MapName, load))
10741085
}
10751086

1076-
overrideTasksMap := program.MapBuilderProgram("override_tasks", load)
1077-
if has.override {
1078-
overrideTasksMap.SetMaxEntries(overrideMapMaxEntries)
1087+
if load.Override && load.OverrideFmodRet {
1088+
// setup fmodret program and its input
1089+
fmodRetProg, fmodRetMap := getFmodRetProg(kprobeEntry.funcName)
1090+
progs = append(progs, fmodRetProg)
1091+
maps = append(maps, fmodRetMap)
1092+
1093+
// setup the output of kprobe
1094+
overrideTasksMap := program.MapBuilder("override_tasks", load)
1095+
overrideTasksMap.PinPath = path.Join("fmod_ret/", kprobeEntry.funcName, "override_tasks")
1096+
1097+
maps = append(maps, overrideTasksMap)
1098+
} else {
1099+
// kprobe override
1100+
overrideTasksMap := program.MapBuilderProgram("override_tasks", load)
1101+
if has.override {
1102+
overrideTasksMap.SetMaxEntries(overrideMapMaxEntries)
1103+
}
1104+
maps = append(maps, overrideTasksMap)
10791105
}
1080-
maps = append(maps, overrideTasksMap)
10811106

10821107
maps = append(maps, polInfo.policyConfMap(load), polInfo.policyStatsMap(load))
10831108

@@ -1234,6 +1259,17 @@ func loadMultiKprobeSensor(ids []idtable.EntryID, bpfDir string, load *program.P
12341259
return nil
12351260
}
12361261

1262+
func loadGenericFmodRetProgram(bpfDir string, load *program.Program, maps []*program.Map, verbose int) error {
1263+
if load.LoadState.IsLoaded() {
1264+
logger.GetLogger().Info(fmt.Sprintf("The generic fmodify return program on %s has been loaded", load.Attach))
1265+
return nil
1266+
}
1267+
1268+
logger.GetLogger().Info("loading generic fmod ret program", "prog", load)
1269+
1270+
return program.LoadFmodRetProgram(bpfDir, load, maps, "generic_fmodret_override", verbose)
1271+
}
1272+
12371273
func loadGenericKprobeSensor(bpfDir string, load *program.Program, maps []*program.Map, verbose int) error {
12381274
if id, ok := load.LoaderData.(idtable.EntryID); ok {
12391275
return loadSingleKprobeSensor(id, bpfDir, load, maps, verbose)
@@ -1461,3 +1497,7 @@ func retprobeMerge(prev pendingEvent, curr pendingEvent) *tracing.MsgGenericKpro
14611497
func (k *observerKprobeSensor) LoadProbe(args sensors.LoadProbeArgs) error {
14621498
return loadGenericKprobeSensor(args.BPFDir, args.Load, args.Maps, args.Verbose)
14631499
}
1500+
1501+
func (k *fmodRetProgram) LoadProbe(args sensors.LoadProbeArgs) error {
1502+
return loadGenericFmodRetProgram(args.BPFDir, args.Load, args.Maps, args.Verbose)
1503+
}

0 commit comments

Comments
 (0)