Skip to content

Commit f51d1c3

Browse files
committed
Add event filter handling to Tracee init
This mechanism allows specific events to perform eBPF related operations based on their argument filters. Currently there is no user for this mechanism, but stack traces which will be implemented soon will use it.
1 parent df0c42a commit f51d1c3

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

pkg/ebpf/event_filters.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package ebpf
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/aquasecurity/tracee/pkg/events"
7+
"github.com/aquasecurity/tracee/pkg/filters"
8+
"github.com/aquasecurity/tracee/pkg/logger"
9+
)
10+
11+
type eventFilterHandler func(t *Tracee, eventFilters []map[string]filters.Filter[*filters.StringFilter]) error
12+
13+
var eventFilterHandlers = map[events.ID]eventFilterHandler{}
14+
15+
// handleEventFilters performs eBPF related actions according to event filters.
16+
// For example, an event can use one of its filters to populate eBPF maps, or perhaps
17+
// attach eBPF programs according to the filters.
18+
func (t *Tracee) handleEventFilters() error {
19+
// Iterate through registerd event filter handlers
20+
for eventID, handler := range eventFilterHandlers {
21+
// Make sure this event is selected
22+
if _, err := t.eventsDependencies.GetEvent(eventID); err != nil {
23+
continue
24+
}
25+
26+
// Construct filters for this event
27+
eventFilters := make([]map[string]filters.Filter[*filters.StringFilter], 0)
28+
for iterator := t.policyManager.CreateAllIterator(); iterator.HasNext(); {
29+
policy := iterator.Next()
30+
policyFilters := policy.DataFilter.GetEventFilters(eventID)
31+
if len(policyFilters) == 0 {
32+
continue
33+
}
34+
eventFilters = append(eventFilters, policyFilters)
35+
}
36+
if len(eventFilters) == 0 {
37+
// No filters for this event
38+
continue
39+
}
40+
41+
// Call handler
42+
if err := handler(t, eventFilters); err != nil {
43+
if err := t.eventsDependencies.RemoveEvent(eventID); err != nil {
44+
logger.Warnw("Failed to remove event from dependencies manager", "remove reason", "failed handling event filters", "error", err)
45+
}
46+
return fmt.Errorf("failed to handle filters for event %s: %v", events.Core.GetDefinitionByID(eventID).GetName(), err)
47+
}
48+
}
49+
50+
return nil
51+
}

pkg/ebpf/tracee.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,16 @@ func (t *Tracee) Init(ctx gocontext.Context) error {
508508
},
509509
}
510510

511+
// Perform extra initializtion steps required by specific events according to their arguments
512+
err = capabilities.GetInstance().EBPF(
513+
func() error {
514+
return t.handleEventFilters()
515+
},
516+
)
517+
if err != nil {
518+
return errfmt.WrapError(err)
519+
}
520+
511521
return nil
512522
}
513523

0 commit comments

Comments
 (0)