diff options
| -rw-r--r-- | internal/c/generated_tracepoints.c | 30 | ||||
| -rw-r--r-- | internal/c/generated_tracepoints_result.txt | 12 | ||||
| -rw-r--r-- | internal/generate/classify.go | 18 | ||||
| -rw-r--r-- | internal/generate/classify_test.go | 32 | ||||
| -rw-r--r-- | internal/generate/codegen_test.go | 6 | ||||
| -rw-r--r-- | internal/generate/kindregistry.go | 2 | ||||
| -rw-r--r-- | internal/tracepoints/dimension_selector_test.go | 15 | ||||
| -rw-r--r-- | internal/tracepoints/generated_tracepoints.go | 6 |
8 files changed, 93 insertions, 28 deletions
diff --git a/internal/c/generated_tracepoints.c b/internal/c/generated_tracepoints.c index 9f2f283..78f29c7 100644 --- a/internal/c/generated_tracepoints.c +++ b/internal/c/generated_tracepoints.c @@ -13339,7 +13339,7 @@ int handle_sys_exit_bpf(struct syscall_trace_exit *ctx) { return 0; } -/// sys_enter_seccomp is a struct null_event (kind=null) +/// sys_enter_seccomp is a struct null_event (kind=seccomp) SEC("tracepoint/syscalls/sys_enter_seccomp") int handle_sys_enter_seccomp(struct syscall_trace_enter *ctx) { __u32 pid, tid; @@ -13363,7 +13363,7 @@ int handle_sys_enter_seccomp(struct syscall_trace_enter *ctx) { return 0; } -/// sys_exit_seccomp is a struct ret_event (UNCLASSIFIED) (kind=ret) +/// sys_exit_seccomp is a struct null_event (kind=seccomp) SEC("tracepoint/syscalls/sys_exit_seccomp") int handle_sys_exit_seccomp(struct syscall_trace_exit *ctx) { __u32 pid, tid; @@ -13373,17 +13373,15 @@ int handle_sys_exit_seccomp(struct syscall_trace_exit *ctx) { if (!ior_on_syscall_exit(tid, SYS_EXIT_SECCOMP, ctx->ret)) return 0; - struct ret_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct ret_event), 0); + struct null_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct null_event), 0); if (!ev) return 0; - ev->event_type = EXIT_RET_EVENT; + ev->event_type = EXIT_NULL_EVENT; ev->trace_id = SYS_EXIT_SECCOMP; ev->pid = pid; ev->tid = tid; ev->time = bpf_ktime_get_boot_ns(); - ev->ret = ctx->ret; - ev->ret_type = UNCLASSIFIED; bpf_ringbuf_submit(ev, 0); return 0; @@ -14863,7 +14861,7 @@ int handle_sys_exit_kcmp(struct syscall_trace_exit *ctx) { return 0; } -/// sys_enter_delete_module is a struct null_event (kind=null) +/// sys_enter_delete_module is a struct null_event (kind=module) SEC("tracepoint/syscalls/sys_enter_delete_module") int handle_sys_enter_delete_module(struct syscall_trace_enter *ctx) { __u32 pid, tid; @@ -14887,7 +14885,7 @@ int handle_sys_enter_delete_module(struct syscall_trace_enter *ctx) { return 0; } -/// sys_exit_delete_module is a struct ret_event (UNCLASSIFIED) (kind=ret) +/// sys_exit_delete_module is a struct null_event (kind=module) SEC("tracepoint/syscalls/sys_exit_delete_module") int handle_sys_exit_delete_module(struct syscall_trace_exit *ctx) { __u32 pid, tid; @@ -14897,23 +14895,21 @@ int handle_sys_exit_delete_module(struct syscall_trace_exit *ctx) { if (!ior_on_syscall_exit(tid, SYS_EXIT_DELETE_MODULE, ctx->ret)) return 0; - struct ret_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct ret_event), 0); + struct null_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct null_event), 0); if (!ev) return 0; - ev->event_type = EXIT_RET_EVENT; + ev->event_type = EXIT_NULL_EVENT; ev->trace_id = SYS_EXIT_DELETE_MODULE; ev->pid = pid; ev->tid = tid; ev->time = bpf_ktime_get_boot_ns(); - ev->ret = ctx->ret; - ev->ret_type = UNCLASSIFIED; bpf_ringbuf_submit(ev, 0); return 0; } -/// sys_enter_init_module is a struct null_event (kind=null) +/// sys_enter_init_module is a struct null_event (kind=module) SEC("tracepoint/syscalls/sys_enter_init_module") int handle_sys_enter_init_module(struct syscall_trace_enter *ctx) { __u32 pid, tid; @@ -14937,7 +14933,7 @@ int handle_sys_enter_init_module(struct syscall_trace_enter *ctx) { return 0; } -/// sys_exit_init_module is a struct ret_event (UNCLASSIFIED) (kind=ret) +/// sys_exit_init_module is a struct null_event (kind=module) SEC("tracepoint/syscalls/sys_exit_init_module") int handle_sys_exit_init_module(struct syscall_trace_exit *ctx) { __u32 pid, tid; @@ -14947,17 +14943,15 @@ int handle_sys_exit_init_module(struct syscall_trace_exit *ctx) { if (!ior_on_syscall_exit(tid, SYS_EXIT_INIT_MODULE, ctx->ret)) return 0; - struct ret_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct ret_event), 0); + struct null_event *ev = bpf_ringbuf_reserve(&event_map, sizeof(struct null_event), 0); if (!ev) return 0; - ev->event_type = EXIT_RET_EVENT; + ev->event_type = EXIT_NULL_EVENT; ev->trace_id = SYS_EXIT_INIT_MODULE; ev->pid = pid; ev->tid = tid; ev->time = bpf_ktime_get_boot_ns(); - ev->ret = ctx->ret; - ev->ret_type = UNCLASSIFIED; bpf_ringbuf_submit(ev, 0); return 0; diff --git a/internal/c/generated_tracepoints_result.txt b/internal/c/generated_tracepoints_result.txt index ed07ec6..43b33d5 100644 --- a/internal/c/generated_tracepoints_result.txt +++ b/internal/c/generated_tracepoints_result.txt @@ -28,7 +28,7 @@ sys_enter_close_range is a struct fd_event (kind=fd) sys_enter_connect is a struct fd_event (kind=fd) sys_enter_copy_file_range is a struct fd_event (kind=fd) sys_enter_creat is a struct path_event (kind=pathname) -sys_enter_delete_module is a struct null_event (kind=null) +sys_enter_delete_module is a struct null_event (kind=module) sys_enter_dup is a struct fd_event (kind=fd) sys_enter_dup2 is a struct fd_event (kind=fd) sys_enter_dup3 is a struct dup3_event (kind=dup3) @@ -110,7 +110,7 @@ sys_enter_gettimeofday is a struct null_event (kind=null) sys_enter_getuid is a struct null_event (kind=null) sys_enter_getxattr is a struct path_event (kind=pathname) sys_enter_getxattrat is a struct path_event (kind=pathname) -sys_enter_init_module is a struct null_event (kind=null) +sys_enter_init_module is a struct null_event (kind=module) sys_enter_inotify_add_watch is a struct fd_event (kind=fd) sys_enter_inotify_init is a struct eventfd_event (kind=eventfd) sys_enter_inotify_init1 is a struct eventfd_event (kind=eventfd) @@ -273,7 +273,7 @@ sys_enter_sched_setattr is a struct null_event (kind=null) sys_enter_sched_setparam is a struct null_event (kind=null) sys_enter_sched_setscheduler is a struct null_event (kind=null) sys_enter_sched_yield is a struct null_event (kind=null) -sys_enter_seccomp is a struct null_event (kind=null) +sys_enter_seccomp is a struct null_event (kind=seccomp) sys_enter_select is a struct poll_event (kind=poll) sys_enter_semctl is a struct null_event (kind=null) sys_enter_semget is a struct null_event (kind=null) @@ -395,7 +395,7 @@ sys_exit_close_range is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_connect is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_copy_file_range is a struct ret_event (TRANSFER_CLASSIFIED) (kind=ret) sys_exit_creat is a struct ret_event (UNCLASSIFIED) (kind=ret) -sys_exit_delete_module is a struct ret_event (UNCLASSIFIED) (kind=ret) +sys_exit_delete_module is a struct null_event (kind=module) sys_exit_dup is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_dup2 is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_dup3 is a struct ret_event (UNCLASSIFIED) (kind=ret) @@ -477,7 +477,7 @@ sys_exit_gettimeofday is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_getuid is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_getxattr is a struct ret_event (READ_CLASSIFIED) (kind=ret) sys_exit_getxattrat is a struct ret_event (UNCLASSIFIED) (kind=ret) -sys_exit_init_module is a struct ret_event (UNCLASSIFIED) (kind=ret) +sys_exit_init_module is a struct null_event (kind=module) sys_exit_inotify_add_watch is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_inotify_init is a struct eventfd_event (kind=eventfd) sys_exit_inotify_init1 is a struct eventfd_event (kind=eventfd) @@ -640,7 +640,7 @@ sys_exit_sched_setattr is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_sched_setparam is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_sched_setscheduler is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_sched_yield is a struct ret_event (UNCLASSIFIED) (kind=ret) -sys_exit_seccomp is a struct ret_event (UNCLASSIFIED) (kind=ret) +sys_exit_seccomp is a struct null_event (kind=seccomp) sys_exit_select is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_semctl is a struct ret_event (UNCLASSIFIED) (kind=ret) sys_exit_semget is a struct ret_event (UNCLASSIFIED) (kind=ret) diff --git a/internal/generate/classify.go b/internal/generate/classify.go index 0bfac0c..fdffdeb 100644 --- a/internal/generate/classify.go +++ b/internal/generate/classify.go @@ -31,6 +31,8 @@ const ( KindKeyctl KindPtrace KindPerfOpen + KindSeccomp + KindModule ) func (k TracepointKind) MetadataName() string { @@ -85,6 +87,10 @@ func (k TracepointKind) MetadataName() string { return "ptrace" case KindPerfOpen: return "perf-open" + case KindSeccomp: + return "seccomp" + case KindModule: + return "module" default: return "none" } @@ -314,6 +320,18 @@ func classifyNameOnly(name string) (ClassificationResult, bool) { return ClassificationResult{Kind: KindPtrace}, true case "sys_enter_perf_event_open": return ClassificationResult{Kind: KindPerfOpen}, true + case "sys_enter_seccomp": + return ClassificationResult{Kind: KindSeccomp}, true + case "sys_exit_seccomp": + return ClassificationResult{Kind: KindSeccomp}, true + case "sys_enter_init_module": + return ClassificationResult{Kind: KindModule}, true + case "sys_exit_init_module": + return ClassificationResult{Kind: KindModule}, true + case "sys_enter_delete_module": + return ClassificationResult{Kind: KindModule}, true + case "sys_exit_delete_module": + return ClassificationResult{Kind: KindModule}, true case "sys_enter_pidfd_send_signal": return ClassificationResult{Kind: KindFd}, true case "sys_enter_kexec_file_load": diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index 590b0bb..85a7863 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -721,6 +721,35 @@ func TestClassifyI7NameOnlyKinds(t *testing.T) { } } +func TestClassify67NameOnlyKinds(t *testing.T) { + tests := []struct { + name string + want TracepointKind + }{ + {"sys_enter_seccomp", KindSeccomp}, + {"sys_exit_seccomp", KindSeccomp}, + {"sys_enter_init_module", KindModule}, + {"sys_exit_init_module", KindModule}, + {"sys_enter_delete_module", KindModule}, + {"sys_exit_delete_module", KindModule}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := ClassifyFormat(&Format{ + Name: tt.name, + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "long", Name: "arg0"}, + }, + }) + if r.Kind != tt.want { + t.Fatalf("%s: got kind %d, want %d", tt.name, r.Kind, tt.want) + } + }) + } +} + func TestClassifyMount(t *testing.T) { r := classifyFromData(t, FormatMount) if r.Kind != KindPathname { @@ -919,6 +948,9 @@ func TestClassifySyscallPairAccepted(t *testing.T) { {"request_key", syntheticEnter("request_key", 9204), syntheticExit("request_key", 9203), KindKeyctl}, {"ptrace", syntheticEnter("ptrace", 9206), syntheticExit("ptrace", 9205), KindPtrace}, {"perf_event_open", syntheticEnter("perf_event_open", 9208), syntheticExit("perf_event_open", 9207), KindPerfOpen}, + {"seccomp", syntheticEnter("seccomp", 9368), syntheticExit("seccomp", 9367), KindSeccomp}, + {"init_module", syntheticEnter("init_module", 9370), syntheticExit("init_module", 9369), KindModule}, + {"delete_module", syntheticEnter("delete_module", 9372), syntheticExit("delete_module", 9371), KindModule}, {"mount", FormatMount, FormatExitMount, KindPathname}, {"umount", FormatUmount, FormatExitUmount, KindPathname}, {"move_mount", FormatMoveMount, FormatExitMoveMount, KindTwoFd}, diff --git a/internal/generate/codegen_test.go b/internal/generate/codegen_test.go index 4faed24..2b9f9e2 100644 --- a/internal/generate/codegen_test.go +++ b/internal/generate/codegen_test.go @@ -582,6 +582,8 @@ func TestGenerateAllEventTypes(t *testing.T) { {KindKeyctl, "ENTER_KEYCTL_EVENT", "EXIT_KEYCTL_EVENT"}, {KindPtrace, "ENTER_PTRACE_EVENT", "EXIT_PTRACE_EVENT"}, {KindPerfOpen, "ENTER_PERF_OPEN_EVENT", "EXIT_PERF_OPEN_EVENT"}, + {KindSeccomp, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, + {KindModule, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"}, } for _, tt := range tests { @@ -624,6 +626,8 @@ func TestEventStructNames(t *testing.T) { {KindKeyctl, "keyctl_event"}, {KindPtrace, "ptrace_event"}, {KindPerfOpen, "perf_open_event"}, + {KindSeccomp, "null_event"}, + {KindModule, "null_event"}, } for _, tt := range tests { @@ -642,7 +646,7 @@ func TestEnterReject(t *testing.T) { t.Error("KindNone should be enter-rejected") } - accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen} + accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen, KindSeccomp, KindModule} for _, k := range accepted { if isEnterRejected(k) { t.Errorf("kind %d should NOT be enter-rejected", k) diff --git a/internal/generate/kindregistry.go b/internal/generate/kindregistry.go index 9387e19..0ce4d2b 100644 --- a/internal/generate/kindregistry.go +++ b/internal/generate/kindregistry.go @@ -41,6 +41,8 @@ var kindRegistry = map[TracepointKind]kindMeta{ KindKeyctl: {structName: "keyctl_event", enterAccepted: true}, KindPtrace: {structName: "ptrace_event", enterAccepted: true}, KindPerfOpen: {structName: "perf_open_event", enterAccepted: true}, + KindSeccomp: {structName: "null_event", enterAccepted: true}, + KindModule: {structName: "null_event", enterAccepted: true}, // KindNone is intentionally absent: it represents "unclassified" and is // never enter-accepted. lookupKind returns the zero kindMeta (enterAccepted=false) // for any unregistered kind, so KindNone is implicitly rejected. diff --git a/internal/tracepoints/dimension_selector_test.go b/internal/tracepoints/dimension_selector_test.go index 388ec12..2ca65c6 100644 --- a/internal/tracepoints/dimension_selector_test.go +++ b/internal/tracepoints/dimension_selector_test.go @@ -93,6 +93,21 @@ func TestParseSelectorWithDimensionsMemKindIncludesMlock(t *testing.T) { } } +func TestParseSelectorWithDimensionsSeccompKindOnly(t *testing.T) { + sel, err := ParseSelectorWithDimensions("", "", DimensionSelectorConfig{ + TraceKinds: "seccomp", + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !sel.ShouldAttach("sys_enter_seccomp") { + t.Fatal("expected seccomp to be attached for seccomp kind") + } + if sel.ShouldAttach("sys_enter_openat") { + t.Fatal("expected openat to be excluded when only seccomp kind is enabled") + } +} + func TestParseSelectorWithDimensionsSyscallOnly(t *testing.T) { sel, err := ParseSelectorWithDimensions("", "", DimensionSelectorConfig{ TraceSyscalls: "openat", diff --git a/internal/tracepoints/generated_tracepoints.go b/internal/tracepoints/generated_tracepoints.go index b4fb1b0..a144a08 100644 --- a/internal/tracepoints/generated_tracepoints.go +++ b/internal/tracepoints/generated_tracepoints.go @@ -1139,7 +1139,7 @@ var syscallKinds = map[string]string{ "connect": "fd", "copy_file_range": "fd", "creat": "pathname", - "delete_module": "null", + "delete_module": "module", "dup": "fd", "dup2": "fd", "dup3": "dup3", @@ -1221,7 +1221,7 @@ var syscallKinds = map[string]string{ "getuid": "null", "getxattr": "pathname", "getxattrat": "pathname", - "init_module": "null", + "init_module": "module", "inotify_add_watch": "fd", "inotify_init": "eventfd", "inotify_init1": "eventfd", @@ -1384,7 +1384,7 @@ var syscallKinds = map[string]string{ "sched_setparam": "null", "sched_setscheduler": "null", "sched_yield": "null", - "seccomp": "null", + "seccomp": "seccomp", "select": "poll", "semctl": "null", "semget": "null", |
