Skip to content

Commit 1932044

Browse files
committed
chore: introduce eventFlags to policy manager
It replaces the inner eventState type being a holder for the flags of an event with a proper API. In next efforts, it will replace the event state map embedded in Tracee.
1 parent e01f933 commit 1932044

File tree

5 files changed

+287
-48
lines changed

5 files changed

+287
-48
lines changed

pkg/ebpf/tracee.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,10 @@ func New(cfg config.Config) (*Tracee, error) {
343343
utils.SetBit(&emit, uint(p.ID))
344344
t.selectEvent(e, events.EventState{Submit: submit, Emit: emit})
345345

346-
t.policyManager.EnableRule(p.ID, e)
346+
err := t.policyManager.EnableRule(p.ID, e)
347+
if err != nil {
348+
logger.Errorw("Failed to enable rule", "policy", p.ID, "event", e, "error", err)
349+
}
347350
}
348351
}
349352

@@ -2057,7 +2060,10 @@ func (t *Tracee) EnableRule(policyNames []string, ruleId string) error {
20572060
return err
20582061
}
20592062

2060-
t.policyManager.EnableRule(p.ID, eventID)
2063+
err = t.policyManager.EnableRule(p.ID, eventID)
2064+
if err != nil {
2065+
return err
2066+
}
20612067
}
20622068

20632069
return nil
@@ -2076,7 +2082,10 @@ func (t *Tracee) DisableRule(policyNames []string, ruleId string) error {
20762082
return err
20772083
}
20782084

2079-
t.policyManager.DisableRule(p.ID, eventID)
2085+
err = t.policyManager.DisableRule(p.ID, eventID)
2086+
if err != nil {
2087+
return err
2088+
}
20802089
}
20812090

20822091
return nil

pkg/policy/event_flags.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package policy
2+
3+
import "github.com/aquasecurity/tracee/pkg/utils"
4+
5+
// eventFlags is a struct that holds the flags of an event.
6+
type eventFlags struct {
7+
// policiesSubmit is a bitmask with the policies that require the event,
8+
// if matched, to be submitted to the userland from the ebpf program.
9+
// It is computed on policies updates.
10+
policiesSubmit uint64
11+
12+
// policiesEmit is a bitmask with the policies that require the event,
13+
// if matched, to be emitted in the pipeline sink stage.
14+
// It is computed on policies updates.
15+
policiesEmit uint64
16+
17+
// enabled indicates if the event is enabled.
18+
// It is *NOT* computed on policies updates, so its value remains the same
19+
// until changed via the API.
20+
enabled bool
21+
}
22+
23+
//
24+
// constructor
25+
//
26+
27+
type eventFlagsOption func(*eventFlags)
28+
29+
func eventFlagsWithSubmit(submit uint64) eventFlagsOption {
30+
return func(es *eventFlags) {
31+
es.policiesSubmit = submit
32+
}
33+
}
34+
35+
func eventFlagsWithEmit(emit uint64) eventFlagsOption {
36+
return func(es *eventFlags) {
37+
es.policiesEmit = emit
38+
}
39+
}
40+
41+
func eventFlagsWithEnabled(enabled bool) eventFlagsOption {
42+
return func(es *eventFlags) {
43+
es.enabled = enabled
44+
}
45+
}
46+
47+
func newEventFlags(options ...eventFlagsOption) *eventFlags {
48+
// default values
49+
ef := &eventFlags{
50+
policiesSubmit: 0,
51+
policiesEmit: 0,
52+
enabled: false,
53+
}
54+
55+
// apply options
56+
for _, option := range options {
57+
option(ef)
58+
}
59+
60+
return ef
61+
}
62+
63+
//
64+
// methods
65+
//
66+
67+
func (ef *eventFlags) enableSubmission(policyId int) error {
68+
if !isIDInRange(policyId) {
69+
return PoliciesOutOfRangeError(policyId)
70+
}
71+
72+
utils.SetBit(&ef.policiesSubmit, uint(policyId))
73+
74+
return nil
75+
}
76+
77+
func (ef *eventFlags) enableEmission(policyId int) error {
78+
if !isIDInRange(policyId) {
79+
return PoliciesOutOfRangeError(policyId)
80+
}
81+
82+
utils.SetBit(&ef.policiesEmit, uint(policyId))
83+
84+
return nil
85+
}
86+
87+
func (ef *eventFlags) disableSubmission(policyId int) error {
88+
if !isIDInRange(policyId) {
89+
return PoliciesOutOfRangeError(policyId)
90+
}
91+
92+
utils.ClearBit(&ef.policiesSubmit, uint(policyId))
93+
94+
return nil
95+
}
96+
97+
func (ef *eventFlags) disableEmission(policyId int) error {
98+
if !isIDInRange(policyId) {
99+
return PoliciesOutOfRangeError(policyId)
100+
}
101+
102+
utils.ClearBit(&ef.policiesEmit, uint(policyId))
103+
104+
return nil
105+
}
106+
107+
func (ef *eventFlags) enableEvent() {
108+
ef.enabled = true
109+
}
110+
111+
func (ef *eventFlags) disableEvent() {
112+
ef.enabled = false
113+
}

pkg/policy/event_flags_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package policy
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
8+
"github.com/aquasecurity/tracee/pkg/utils"
9+
)
10+
11+
// TestNewEventFlags tests the newEventFlags function.
12+
func TestNewEventFlags(t *testing.T) {
13+
t.Parallel()
14+
15+
ef := newEventFlags()
16+
emit := uint64(0)
17+
submit := uint64(0)
18+
19+
assert.Equal(t, emit, ef.policiesSubmit)
20+
assert.Equal(t, submit, ef.policiesEmit)
21+
assert.False(t, ef.enabled)
22+
23+
submit = uint64(1 << 0)
24+
emit = uint64(1<<1 | 1<<2)
25+
efWithOptions := newEventFlags(
26+
eventFlagsWithSubmit(submit),
27+
eventFlagsWithEmit(emit),
28+
eventFlagsWithEnabled(true),
29+
)
30+
assert.Equal(t, submit, efWithOptions.policiesSubmit)
31+
assert.Equal(t, emit, efWithOptions.policiesEmit)
32+
assert.True(t, efWithOptions.enabled)
33+
}
34+
35+
// TestEnableSubmission tests the enableSubmission function.
36+
func TestEnableSubmission(t *testing.T) {
37+
t.Parallel()
38+
39+
ef := newEventFlags()
40+
err := ef.enableSubmission(1)
41+
assert.NoError(t, err)
42+
assert.True(t, utils.HasBit(ef.policiesSubmit, 1))
43+
44+
err = ef.enableSubmission(-1)
45+
assert.Error(t, err)
46+
}
47+
48+
// TestEnableEmission tests the enableEmission function.
49+
func TestEnableEmission(t *testing.T) {
50+
t.Parallel()
51+
52+
ef := newEventFlags()
53+
err := ef.enableEmission(1)
54+
assert.NoError(t, err)
55+
assert.True(t, utils.HasBit(ef.policiesEmit, 1))
56+
57+
err = ef.enableEmission(-1)
58+
assert.Error(t, err)
59+
}
60+
61+
// TestDisableSubmission tests the disableSubmission function.
62+
func TestDisableSubmission(t *testing.T) {
63+
t.Parallel()
64+
65+
ef := newEventFlags()
66+
err := ef.enableSubmission(42)
67+
assert.NoError(t, err)
68+
err = ef.disableSubmission(42)
69+
assert.NoError(t, err)
70+
assert.False(t, utils.HasBit(ef.policiesSubmit, 42))
71+
72+
err = ef.disableSubmission(-1)
73+
assert.Error(t, err)
74+
}
75+
76+
// TestDisableEmission tests the disableEmission function.
77+
func TestDisableEmission(t *testing.T) {
78+
t.Parallel()
79+
80+
ef := newEventFlags()
81+
err := ef.enableEmission(42)
82+
assert.NoError(t, err)
83+
err = ef.disableEmission(42)
84+
assert.NoError(t, err)
85+
assert.False(t, utils.HasBit(ef.policiesEmit, 42))
86+
87+
err = ef.disableEmission(-1)
88+
assert.Error(t, err)
89+
}
90+
91+
// TestEnableEvent tests the enableEvent function.
92+
func TestEnableEvent(t *testing.T) {
93+
t.Parallel()
94+
95+
ef := newEventFlags(eventFlagsWithEnabled(false))
96+
ef.enableEvent()
97+
assert.True(t, ef.enabled)
98+
}
99+
100+
// TestDisableEvent tests the disableEvent function.
101+
func TestDisableEvent(t *testing.T) {
102+
t.Parallel()
103+
104+
ef := newEventFlags(eventFlagsWithEnabled(true))
105+
ef.disableEvent()
106+
assert.False(t, ef.enabled)
107+
}

0 commit comments

Comments
 (0)