8000 sets: default set can't have network events v419 by rafaeldtinoco · Pull Request #2771 · aquasecurity/tracee · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

sets: default set can't have network events v419 #2771

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 43 additions & 5 deletions pkg/cmd/flags/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"strconv"
"strings"

"github.com/aquasecurity/libbpfgo/helpers"
"github.com/aquasecurity/tracee/pkg/events"
"github.com/aquasecurity/tracee/pkg/filters"
"github.com/aquasecurity/tracee/pkg/filterscope"
Expand Down Expand Up @@ -456,22 +457,54 @@ func PrepareFilterScopes(filtersArr []string) (*filterscope.FilterScopes, error)
return filterScopes, nil
}

func prepareEventsToTrace(eventFilter cliFilter, setFilter cliFilter, eventsNameToID map[string]events.ID) (map[events.ID]string, error) {
func prepareEventsToTrace(
eventFilter cliFilter, setFilter cliFilter, eventsNameToID map[string]events.ID,
) (
map[events.ID]string, error,
) {
eventsToTrace := eventFilter.Equal
excludeEvents := eventFilter.NotEqual
setsToTrace := setFilter.Equal

var res map[events.ID]string
setsToEvents := make(map[string][]events.ID)
isExcluded := make(map[events.ID]bool)

// build a map: k:set, v:eventID
for id, event := range events.Definitions.Events() {
for _, set := range event.Sets {
setsToEvents[set] = append(setsToEvents[set], id)
}
}

// Exclude network events from the default set if kernel v4.19.
// Issue: https://github.com/aquasecurity/tracee/issues/1602
// TODO: workaround until we have the feature probing mechanism
if osInfo, err := helpers.GetOSInfo(); err == nil {
kernel51ComparedToRunningKernel, err := osInfo.CompareOSBaseKernelRelease("5.1.0")
if err != nil {
logger.Error("failed to compare kernel version", "error", err)
} else {
if kernel51ComparedToRunningKernel == helpers.KernelVersionNewer {
id_like := osInfo.GetOSReleaseFieldValue(helpers.OS_ID_LIKE)
if !strings.Contains(id_like, "rhel") {
// disable network events for v4.19 kernels other than RHEL based ones
logger.Debug("kernel <= v5.1, disabling network events from default set")
for _, id := range setsToEvents["default"] {
if id >= events.NetPacketIPv4 && id <= events.MaxUserNetID {
isExcluded[id] = true
}
}
}
}
}
} else {
logger.Error("failed to get OS info", "error", err)
}

// mark excluded events (isExcluded) by their id
for _, name := range excludeEvents {
// Handle event prefixes with wildcards
if strings.HasSuffix(name, "*") {
if strings.HasSuffix(name, "*") { // handle event prefixes with wildcards
found := false
prefix := name[:len(name)-1]
for event, id := range eventsNameToID {
Expand All @@ -491,14 +524,16 @@ func prepareEventsToTrace(eventFilter cliFilter, setFilter cliFilter, eventsName
isExcluded[id] = true
}
}

// if no events were specified, add all events from the default set
if len(eventsToTrace) == 0 && len(setsToTrace) == 0 {
setsToTrace = append(setsToTrace, "default")
}

// build a map: k:eventID, v:eventName with all events to trace
res = make(map[events.ID]string, events.Definitions.Length())
for _, name := range eventsToTrace {
// Handle event prefixes with wildcards
if strings.HasSuffix(name, "*") {
if strings.HasSuffix(name, "*") { // handle event prefixes with wildcards
found := false
prefix := name[:len(name)-1]
for event, id := range eventsNameToID {
Expand All @@ -518,6 +553,8 @@ func prepareEventsToTrace(eventFilter cliFilter, setFilter cliFilter, eventsName
res[id] = name
}
}

// add events from sets to the map containing events to trace
for _, set := range setsToTrace {
setEvents, ok := setsToEvents[set]
if !ok {
Expand All @@ -529,6 +566,7 @@ func prepareEventsToTrace(eventFilter cliFilter, setFilter cliFilter, eventsName
}
}
}

return res, nil
}

Expand Down
21 changes: 19 additions & 2 deletions pkg/cmd/initialize/callbacks.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,19 @@ var (
// 1. %s = cgroup_skb_ingress or cgroup_skb_egress
// 2. %s = cgroup
// 3. %s = Invalid argument
libbpfgoAttachCgroupregexp = regexp.MustCompile(`libbpf:.*prog 'cgroup_skb_ingress|cgroup_skb_egress'.*failed to attach to cgroup.*Invalid argument`)
libbpfgoAttachCgroupRegexp = regexp.MustCompile(`libbpf:.*prog 'cgroup_skb_ingress|cgroup_skb_egress'.*failed to attach to cgroup.*Invalid argument`)

// triggered by: libbpf/src/libbpf.c->bpf_object__create_map()
// "libbpf: Error in bpf_create_map_xattr(%s)\n"
// 1. %s = sys_enter_init_tail
// 2. %s = sys_enter_submit_tail
// 3. %s = sys_enter_tails
// 4. %s = sys_exit_init_tail
// 5. %s = sys_exit_submit_tail
// 6. %s = sys_exit_tails
// 7. %s = prog_array_tp
// 8. %s = prog_array
libbpfgoBpfCreateMapXattrRegexp = regexp.MustCompile(`libbpf:.*bpf_create_map_xattr\((sys_enter_init_tail|sys_enter_submit_tail|sys_enter_tails|sys_exit_init_tail|sys_exit_submit_tail|sys_exit_tails|prog_array_tp|prog_array)\)`)
)

// SetLibbpfgoCallbacks sets libbpfgo logger callbacks
Expand Down Expand Up @@ -68,7 +80,12 @@ func SetLibbpfgoCallbacks() {
// AttachCgroupLegacy() will first try AttachCgroup() and it might fail. This
// is not an error and is the best way of probing for eBPF cgroup attachment
// link existence.
8000 if libbpfgoAttachCgroupregexp.MatchString(msg) {
if libbpfgoAttachCgroupRegexp.MatchString(msg) {
return true
}

// BUG: https://github.com/aquasecurity/tracee/issues/1602
if libbpfgoBpfCreateMapXattrRegexp.MatchString(msg) {
return true
}

Expand Down
215 changes: 108 additions & 107 deletions pkg/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -6141,8 +6141,114 @@ var Definitions = eventDefinitions{
{Type: "void*", Name: "symbol_address"},
},
},
PrintMemDump: {
ID32Bit: sys32undefined,
Name: "print_mem_dump",
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "bytes", Name: "bytes"},
{Type: "void*", Name: "address"},
{Type: "u64", Name: "length"},
{Type: "u64", Name: "caller_context_id"},
{Type: "char*", Name: "arch"},
{Type: "char*", Name: "symbol_name"},
{Type: "char*", Name: "symbol_owner"},
},
Probes: []probeDependency{
{Handle: probes.PrintMemDump, Required: true},
},
Dependencies: dependencies{
Events: []eventDependency{
{EventID: DoInitModule},
},
KSymbols: &[]kSymbolDependency{},
},
},
VfsRead: {
ID32Bit: sys32undefined,
Name: "vfs_read",
Probes: []probeDependency{
{Handle: probes.VfsRead, Required: true},
{Handle: probes.VfsReadRet, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "size_t", Name: "count"},
{Type: "off_t", Name: "pos"},
},
},
VfsReadv: {
ID32Bit: sys32undefined,
Name: "vfs_readv",
Probes: []probeDependency{
{Handle: probes.VfsReadV, Required: true},
{Handle: probes.VfsReadVRet, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "unsigned long", Name: "vlen"},
{Type: "off_t", Name: "pos"},
},
},
VfsUtimes: {
ID32Bit: sys32undefined,
Name: "vfs_utimes",
Probes: []probeDependency{
{Handle: probes.VfsUtimes, Required: false}, // this probe exits in kernels >= 5.9
{Handle: probes.UtimesCommon, Required: false}, // this probe exits in kernels < 5.9
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "u64", Name: "atime"},
{Type: "u64", Name: "mtime"},
},
},
DoTruncate: {
ID32Bit: sys32undefined,
Name: "do_truncate",
Probes: []probeDependency{
{Handle: probes.DoTruncate, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "unsigned long", Name: "inode"},
{Type: "dev_t", Name: "dev"},
{Type: "u64", Name: "length"},
},
},
FileModification: {
ID32Bit: sys32undefined,
Name: "file_modification",
DocPath: "kprobes/file_modification.md",
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "file_path"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "unsigned long", Name: "old_ctime"},
{Type: "unsigned long", Name: "new_ctime"},
},
Probes: []probeDependency{
{Handle: probes.FdInstall, Required: true},
{Handle: probes.FilpClose, Required: true},
{Handle: probes.FileUpdateTime, Required: true},
{Handle: probes.FileUpdateTimeRet, Required: true},
{Handle: probes.FileModified, Required: false}, // not required because doesn't ...
{Handle: probes.FileModifiedRet, Required: false}, // ... exist in kernels < 5.3
},
},
//
// Network Protocol Event Types
// Network Protocol Event Types (add new events above here)
//
NetPacketBase: {
ID32Bit: sys32undefined,
Expand Down Expand Up @@ -6468,111 +6574,6 @@ var Definitions = eventDefinitions{
},
},
},
PrintMemDump: {
ID32Bit: sys32undefined,
Name: "print_mem_dump",
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "bytes", Name: "bytes"},
{Type: "void*", Name: "address"},
{Type: "u64", Name: "length"},
{Type: "u64", Name: "caller_context_id"},
{Type: "char*", Name: "arch"},
{Type: "char*", Name: "symbol_name"},
{Type: "char*", Name: "symbol_owner"},
},
Probes: []probeDependency{
{Handle: probes.PrintMemDump, Required: true},
},
Dependencies: dependencies{
Events: []eventDependency{
{EventID: DoInitModule},
},
KSymbols: &[]kSymbolDependency{},
},
},
VfsRead: {
ID32Bit: sys32undefined,
Name: "vfs_read",
Probes: []probeDependency{
{Handle: probes.VfsRead, Required: true},
{Handle: probes.VfsReadRet, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "size_t", Name: "count"},
{Type: "off_t", Name: "pos"},
},
},
VfsReadv: {
ID32Bit: sys32undefined,
Name: "vfs_readv",
Probes: []probeDependency{
{Handle: probes.VfsReadV, Required: true},
{Handle: probes.VfsReadVRet, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "unsigned long", Name: "vlen"},
{Type: "off_t", Name: "pos"},
},
},
VfsUtimes: {
ID32Bit: sys32undefined,
Name: "vfs_utimes",
Probes: []probeDependency{
{Handle: probes.VfsUtimes, Required: false}, // this probe exits in kernels >= 5.9
{Handle: probes.UtimesCommon, Required: false}, // this probe exits in kernels < 5.9
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "u64", Name: "atime"},
{Type: "u64", Name: "mtime"},
},
},
DoTruncate: {
ID32Bit: sys32undefined,
Name: "do_truncate",
Probes: []probeDependency{
{Handle: probes.DoTruncate, Required: true},
},
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "pathname"},
{Type: "unsigned long", Name: "inode"},
{Type: "dev_t", Name: "dev"},
{Type: "u64", Name: "length"},
},
},
FileModification: {
ID32Bit: sys32undefined,
Name: "file_modification",
DocPath: "kprobes/file_modification.md",
Sets: []string{},
Params: []trace.ArgMeta{
{Type: "const char*", Name: "file_path"},
{Type: "dev_t", Name: "dev"},
{Type: "unsigned long", Name: "inode"},
{Type: "unsigned long", Name: "old_ctime"},
{Type: "unsigned long", Name: "new_ctime"},
},
Probes: []probeDependency{
{Handle: probes.FdInstall, Required: true},
{Handle: probes.FilpClose, Required: true},
{Handle: probes.FileUpdateTime, Required: true},
{Handle: probes.FileUpdateTimeRet, Required: true},
{Handle: probes.FileModified, Required: false}, // not required because doesn't ...
{Handle: probes.FileModifiedRet, Required: false}, // ... exist in kernels < 5.3
},
},
// NOTE: add new events before the network events (keep them at the end)
},
}
0