Skip to content

Commit 6697e68

Browse files
filters: split into bpf filters
1 parent 98666e1 commit 6697e68

File tree

7 files changed

+75
-64
lines changed

7 files changed

+75
-64
lines changed

cmd/tracee-ebpf/flags/filter.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,19 @@ To 'escape' those operators, please use single quotes, e.g.: 'uid>0'
8282

8383
func PrepareFilter(filtersArr []string) (tracee.Filter, error) {
8484
filter := tracee.Filter{
85-
UIDFilter: filters.NewUInt32Filter(),
86-
PIDFilter: filters.NewUInt32Filter(),
85+
UIDFilter: filters.NewBPFUInt32Filter(tracee.UIDFilterMap),
86+
PIDFilter: filters.NewBPFUInt32Filter(tracee.PIDFilterMap),
8787
NewPidFilter: filters.NewBoolFilter(),
88-
MntNSFilter: filters.NewUIntFilter(),
89-
PidNSFilter: filters.NewUIntFilter(),
90-
UTSFilter: filters.NewStringFilter(),
91-
CommFilter: filters.NewStringFilter(),
88+
MntNSFilter: filters.NewBPFUIntFilter(tracee.MntNSFilterMap),
89+
PidNSFilter: filters.NewBPFUIntFilter(tracee.PidNSFilterMap),
90+
UTSFilter: filters.NewBPFStringFilter(tracee.UTSFilterMap),
91+
CommFilter: filters.NewBPFStringFilter(tracee.CommFilterMap),
9292
ContFilter: filters.NewBoolFilter(),
9393
NewContFilter: filters.NewBoolFilter(),
94-
ContIDFilter: filters.NewContainerFilter("cgroup_id_filter"),
94+
ContIDFilter: filters.NewContainerFilter(tracee.CgroupIdFilterMap),
9595
RetFilter: filters.NewRetFilter(),
9696
ArgFilter: filters.NewArgFilter(),
97-
ProcessTreeFilter: filters.NewProcessTreeFilter(),
97+
ProcessTreeFilter: filters.NewProcessTreeFilter(tracee.ProcessTreeFilterMap),
9898
EventsToTrace: []events.ID{},
9999
NetFilter: &tracee.NetIfaces{
100100
Ifaces: []string{},

pkg/ebpf/filters.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,27 @@ import (
99
"github.com/aquasecurity/tracee/pkg/filters"
1010
)
1111

12+
const (
13+
UIDFilterMap = "uid_filter"
14+
PIDFilterMap = "pid_filter"
15+
MntNSFilterMap = "mnt_ns_filter"
16+
PidNSFilterMap = "pid_ns_filter"
17+
UTSFilterMap = "uts_ns_filter"
18+
CommFilterMap = "comm_filter"
19+
ProcessTreeFilterMap = "process_tree_map"
20+
CgroupIdFilterMap = "cgroup_id_filter"
21+
ContIdFilter = "cont_id_filter"
22+
)
23+
1224
type Filter struct {
1325
EventsToTrace []events.ID
14-
UIDFilter *filters.UIntFilter
15-
PIDFilter *filters.UIntFilter
26+
UIDFilter *filters.BPFUIntFilter
27+
PIDFilter *filters.BPFUIntFilter
1628
NewPidFilter *filters.BoolFilter
17-
MntNSFilter *filters.UIntFilter
18-
PidNSFilter *filters.UIntFilter
19-
UTSFilter *filters.StringFilter
20-
CommFilter *filters.StringFilter
29+
MntNSFilter *filters.BPFUIntFilter
30+
PidNSFilter *filters.BPFUIntFilter
31+
UTSFilter *filters.BPFStringFilter
32+
CommFilter *filters.BPFStringFilter
2133
ContFilter *filters.BoolFilter
2234
NewContFilter *filters.BoolFilter
2335
ContIDFilter *filters.ContainerFilter

pkg/ebpf/tracee.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -819,13 +819,13 @@ func (t *Tracee) populateBPFMaps() error {
819819
}
820820

821821
errmap := make(map[string]error, 0)
822-
errmap["uid_filter"] = t.config.Filter.UIDFilter.InitBPF(t.bpfModule, "uid_filter")
823-
errmap["pid_filter"] = t.config.Filter.PIDFilter.InitBPF(t.bpfModule, "pid_filter")
824-
errmap["mnt_ns_filter"] = t.config.Filter.MntNSFilter.InitBPF(t.bpfModule, "mnt_ns_filter")
825-
errmap["pid_ns_filter"] = t.config.Filter.PidNSFilter.InitBPF(t.bpfModule, "pid_ns_filter")
826-
errmap["uts_ns_filter"] = t.config.Filter.UTSFilter.InitBPF(t.bpfModule, "uts_ns_filter")
827-
errmap["comm_filter"] = t.config.Filter.CommFilter.InitBPF(t.bpfModule, "comm_filter")
828-
errmap["cont_id_filter"] = t.config.Filter.ContIDFilter.InitBPF(t.bpfModule, t.containers)
822+
errmap[UIDFilterMap] = t.config.Filter.UIDFilter.InitBPF(t.bpfModule)
823+
errmap[PIDFilterMap] = t.config.Filter.PIDFilter.InitBPF(t.bpfModule)
824+
errmap[MntNSFilterMap] = t.config.Filter.MntNSFilter.InitBPF(t.bpfModule)
825+
errmap[PidNSFilterMap] = t.config.Filter.PidNSFilter.InitBPF(t.bpfModule)
826+
errmap[UTSFilterMap] = t.config.Filter.UTSFilter.InitBPF(t.bpfModule)
827+
errmap[CommFilterMap] = t.config.Filter.CommFilter.InitBPF(t.bpfModule)
828+
errmap[ContIdFilter] = t.config.Filter.ContIDFilter.InitBPF(t.bpfModule, t.containers)
829829

830830
for k, v := range errmap {
831831
if v != nil {

pkg/filters/containers.go

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,15 @@ import (
99
)
1010

1111
type ContainerFilter struct {
12-
Equal []string
13-
NotEqual []string
14-
Enabled bool
15-
bpfMapName string
12+
*BPFStringFilter
1613
}
1714

1815
func NewContainerFilter(mapName string) *ContainerFilter {
1916
return &ContainerFilter{
20-
Equal: []string{},
21-
NotEqual: []string{},
22-
Enabled: false,
23-
bpfMapName: mapName,
17+
BPFStringFilter: NewBPFStringFilter(mapName),
2418
}
2519
}
2620

27-
func (filter *ContainerFilter) Parse(operatorAndValues string) error {
28-
filter.Enabled = true
29-
30-
strFilter := &StringFilter{
31-
Equal: []string{},
32-
NotEqual: []string{},
33-
}
34-
35-
// Treat operatorAndValues as a string filter to avoid code duplication
36-
err := strFilter.Parse(operatorAndValues)
37-
if err != nil {
38-
return err
39-
}
40-
41-
filter.Equal = strFilter.Equal
42-
filter.NotEqual = strFilter.NotEqual
43-
44-
return nil
45-
}
46-
4721
func (filter *ContainerFilter) InitBPF(bpfModule *bpf.Module, conts *containers.Containers) error {
4822
if !filter.Enabled {
4923
return nil
@@ -52,7 +26,7 @@ func (filter *ContainerFilter) InitBPF(bpfModule *bpf.Module, conts *containers.
5226
filterEqualU32 := uint32(filterEqual) // const need local var for bpfMap.Update()
5327
filterNotEqualU32 := uint32(filterNotEqual)
5428

55-
filterMap, err := bpfModule.GetMap(filter.bpfMapName)
29+
filterMap, err := bpfModule.GetMap(filter.mapName)
5630
if err != nil {
5731
return err
5832
}
@@ -84,11 +58,3 @@ func (filter *ContainerFilter) InitBPF(bpfModule *bpf.Module, conts *containers.
8458

8559
return nil
8660
}
87-
88-
func (filter *ContainerFilter) FilterOut() bool {
89-
if len(filter.Equal) > 0 && len(filter.NotEqual) == 0 {
90-
return false
91-
} else {
92-
return true
93-
}
94-
}

pkg/filters/processtree.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ import (
1515
type ProcessTreeFilter struct {
1616
PIDs map[uint32]bool // PIDs is a map where k=pid and v represents whether it and its descendents should be traced or not
1717
Enabled bool
18+
mapName string
1819
}
1920

20-
func NewProcessTreeFilter() *ProcessTreeFilter {
21+
func NewProcessTreeFilter(mapName string) *ProcessTreeFilter {
2122
return &ProcessTreeFilter{
2223
PIDs: map[uint32]bool{},
2324
Enabled: false,
25+
mapName: mapName,
2426
}
2527
}
2628

@@ -66,7 +68,7 @@ func (filter *ProcessTreeFilter) Set(bpfModule *bpf.Module) error {
6668
return nil
6769
}
6870

69-
processTreeBPFMap, err := bpfModule.GetMap("process_tree_map")
71+
processTreeBPFMap, err := bpfModule.GetMap(filter.mapName)
7072
if err != nil {
7173
return fmt.Errorf("could not find bpf process_tree_map: %v", err)
7274
}

pkg/filters/string.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,19 @@ func (filter *StringFilter) Parse(operatorAndValues string) error {
5454
return nil
5555
}
5656

57-
func (filter *StringFilter) InitBPF(bpfModule *bpf.Module, filterMapName string) error {
57+
type BPFStringFilter struct {
58+
StringFilter
59+
mapName string
60+
}
61+
62+
func NewBPFStringFilter(mapName string) *BPFStringFilter {
63+
return &BPFStringFilter{
64+
StringFilter: *NewStringFilter(),
65+
mapName: mapName,
66+
}
67+
}
68+
69+
func (filter *BPFStringFilter) InitBPF(bpfModule *bpf.Module) error {
5870
// MaxBpfStrFilterSize value should match MAX_STR_FILTER_SIZE defined in BPF code
5971
const maxBpfStrFilterSize = 16
6072

@@ -67,7 +79,7 @@ func (filter *StringFilter) InitBPF(bpfModule *bpf.Module, filterMapName string)
6779

6880
// 1. uts_ns_filter string[MAX_STR_FILTER_SIZE], u32 // filter events by uts namespace name
6981
// 2. comm_filter string[MAX_STR_FILTER_SIZE], u32 // filter events by command name
70-
filterMap, err := bpfModule.GetMap(filterMapName)
82+
filterMap, err := bpfModule.GetMap(filter.mapName)
7183
if err != nil {
7284
return err
7385
}

pkg/filters/uint.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,26 @@ func (filter *UIntFilter) Parse(operatorAndValues string) error {
8585
return nil
8686
}
8787

88-
func (filter *UIntFilter) InitBPF(bpfModule *bpf.Module, filterMapName string) error {
88+
type BPFUIntFilter struct {
89+
UIntFilter
90+
mapName string
91+
}
92+
93+
func NewBPFUIntFilter(mapName string) *BPFUIntFilter {
94+
return &BPFUIntFilter{
95+
UIntFilter: *NewUIntFilter(),
96+
mapName: mapName,
97+
}
98+
}
99+
100+
func NewBPFUInt32Filter(mapName string) *BPFUIntFilter {
101+
return &BPFUIntFilter{
102+
UIntFilter: *NewUInt32Filter(),
103+
mapName: mapName,
104+
}
105+
}
106+
107+
func (filter *BPFUIntFilter) InitBPF(bpfModule *bpf.Module) error {
89108
if !filter.Enabled {
90109
return nil
91110
}
@@ -98,7 +117,7 @@ func (filter *UIntFilter) InitBPF(bpfModule *bpf.Module, filterMapName string) e
98117
// 2. pid_filter u32, u32
99118
// 3. mnt_ns_filter u64, u32
100119
// 4. pid_ns_filter u64, u32
101-
equalityFilter, err := bpfModule.GetMap(filterMapName)
120+
equalityFilter, err := bpfModule.GetMap(filter.mapName)
102121
if err != nil {
103122
return err
104123
}

0 commit comments

Comments
 (0)