forked from aquasecurity/tracee
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pkg/events: fix socket option parse args edge cases (aquasecurity#2157)
libbpf go currently parse the socket option argument in some cases to include "or" in the middle between to consts names. The reason is that the kernel has 2 consts with the same name. According to the context we know which constant is relevant. This PR fix the parsed option name to be the one we expect it to be.
- Loading branch information
1 parent
719295b
commit 4b94f4b
Showing
2 changed files
with
237 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
package events | ||
|
||
import ( | ||
"github.com/aquasecurity/libbpfgo/helpers" | ||
"github.com/aquasecurity/tracee/types/trace" | ||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
"testing" | ||
) | ||
|
||
func TestParseArgs(t *testing.T) { | ||
t.Run("Parse setsockopt value", func(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
args []trace.Argument | ||
expectedArgs []trace.Argument | ||
}{ | ||
{ | ||
name: "normal flow", | ||
args: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SO_LOCK_FILTER.Value()), | ||
}, | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "level", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SOL_IP.Value()), | ||
}, | ||
}, | ||
expectedArgs: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "string", | ||
}, | ||
Value: helpers.SO_LOCK_FILTER.String(), | ||
}, | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "level", | ||
Type: "string", | ||
}, | ||
Value: helpers.SOL_IP.String(), | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "SO_ATTACH_FILTER optname", | ||
args: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SO_ATTACH_OR_GET_FILTER.Value()), | ||
}, | ||
}, | ||
expectedArgs: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "string", | ||
}, | ||
Value: "SO_ATTACH_FILTER", | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "normal optname", | ||
args: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SO_LOCK_FILTER.Value()), | ||
}, | ||
}, | ||
expectedArgs: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "string", | ||
}, | ||
Value: helpers.SO_LOCK_FILTER.String(), | ||
}, | ||
}, | ||
}, | ||
} | ||
|
||
for _, testCase := range testCases { | ||
event := trace.Event{ | ||
EventID: int(Setsockopt), | ||
Args: testCase.args, | ||
} | ||
err := ParseArgs(&event) | ||
require.NoError(t, err) | ||
for _, expArg := range testCase.expectedArgs { | ||
arg := GetArg(&event, expArg.Name) | ||
assert.Equal(t, expArg, *arg) | ||
} | ||
} | ||
}) | ||
|
||
t.Run("Parse getsockopt value", func(t *testing.T) { | ||
testCases := []struct { | ||
name string | ||
args []trace.Argument | ||
expectedArgs []trace.Argument | ||
}{ | ||
{ | ||
name: "normal optname", | ||
args: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SO_LOCK_FILTER.Value()), | ||
}, | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "level", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SOL_IP.Value()), | ||
}, | ||
}, | ||
expectedArgs: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "string", | ||
}, | ||
Value: helpers.SO_LOCK_FILTER.String(), | ||
}, | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "level", | ||
Type: "string", | ||
}, | ||
Value: helpers.SOL_IP.String(), | ||
}, | ||
}, | ||
}, | ||
{ | ||
name: "SO_GET_FILTER optname", | ||
args: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "int", | ||
}, | ||
Value: int32(helpers.SO_ATTACH_OR_GET_FILTER.Value()), | ||
}, | ||
}, | ||
expectedArgs: []trace.Argument{ | ||
{ | ||
ArgMeta: trace.ArgMeta{ | ||
Name: "optname", | ||
Type: "string", | ||
}, | ||
Value: "SO_GET_FILTER", | ||
}, | ||
}, | ||
}, | ||
} | ||
|
||
for _, testCase := range testCases { | ||
event := &trace.Event{ | ||
EventID: int(Getsockopt), | ||
Args: testCase.args, | ||
} | ||
err := ParseArgs(event) | ||
require.NoError(t, err) | ||
for _, expArg := range testCase.expectedArgs { | ||
arg := GetArg(event, expArg.Name) | ||
assert.Equal(t, expArg, *arg) | ||
} | ||
} | ||
}) | ||
} |