Skip to content

Commit 1f67247

Browse files
AsafEitanirafaeldtinoco
authored andcommitted
events: combine hooked_seq_ops event output to one event
Invokes only one event in each triggering instead of event for each struct checked.
1 parent 4105fe7 commit 1f67247

File tree

4 files changed

+61
-57
lines changed

4 files changed

+61
-57
lines changed

pkg/ebpf/c/tracee.bpf.c

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,7 @@ add_u64_elements_to_buf(event_data_t *data, const u64 __user *ptr, int len, u32
17541754
{
17551755
u8 elem_num = 0;
17561756
u8 current_elem_num;
1757-
#pragma unroll
1757+
#pragma unroll
17581758
for (int i = 0; i < len; i++) {
17591759
void *addr = &(data->submit_p->buf[data->buf_off]);
17601760
if (data->buf_off > MAX_PERCPU_BUFSIZE - sizeof(u64))
@@ -3180,55 +3180,52 @@ int uprobe_syscall_trigger(struct pt_regs *ctx)
31803180
return events_perf_submit(&data, PRINT_SYSCALL_TABLE, 0);
31813181
}
31823182

3183-
static __always_inline void invoke_fetch_network_seq_operations_event(struct pt_regs *ctx,
3184-
unsigned long struct_address)
3185-
{
3186-
event_data_t data = {};
3187-
if (!init_event_data(&data, ctx))
3188-
return;
3189-
3190-
struct seq_operations *seq_ops = (struct seq_operations *) struct_address;
3191-
u64 show_addr = (u64) READ_KERN(seq_ops->show);
3192-
if (show_addr == 0) {
3193-
return;
3194-
}
3195-
3196-
u64 start_addr = (u64) READ_KERN(seq_ops->start);
3197-
if (start_addr == 0) {
3198-
return;
3199-
}
3200-
3201-
u64 next_addr = (u64) READ_KERN(seq_ops->next);
3202-
if (next_addr == 0) {
3203-
return;
3204-
}
3205-
3206-
u64 stop_addr = (u64) READ_KERN(seq_ops->stop);
3207-
if (stop_addr == 0) {
3208-
return;
3209-
}
3210-
u64 seq_ops_addresses[NET_SEQ_OPS_SIZE + 1] = {
3211-
(u64) seq_ops, show_addr, start_addr, next_addr, stop_addr};
3212-
save_u64_arr_to_buf(&data, (const u64 *) seq_ops_addresses, 5, 0);
3213-
events_perf_submit(&data, PRINT_NET_SEQ_OPS, 0);
3214-
}
3215-
32163183
SEC("uprobe/trigger_seq_ops_event")
32173184
int uprobe_seq_ops_trigger(struct pt_regs *ctx)
32183185
{
32193186
#if defined(bpf_target_x86)
3220-
uint64_t *address_array = ((void *) ctx->sp);
3187+
uint64_t *address_array = ((void *) ctx->sp + 8);
32213188
#elif defined(bpf_target_arm64)
32223189
uint64_t *address_array = ((void *) ctx->sp) + 16;
32233190
#else
32243191
return 0;
32253192
#endif
32263193

32273194
uint64_t struct_address;
3195+
event_data_t data = {};
3196+
if (!init_event_data(&data, ctx))
3197+
return 0;
3198+
u32 count_off = data.buf_off + 1;
3199+
// Init u64 arr with size 0 before adding elements in loop
3200+
save_u64_arr_to_buf(&data, NULL, 0, 0);
3201+
#pragma unroll
32283202
for (int i = 0; i < NET_SEQ_OPS_TYPES; i++) {
32293203
bpf_probe_read(&struct_address, 8, (address_array + i));
3230-
invoke_fetch_network_seq_operations_event(ctx, struct_address);
3204+
struct seq_operations *seq_ops = (struct seq_operations *) struct_address;
3205+
u64 show_addr = (u64) READ_KERN(seq_ops->show);
3206+
if (show_addr == 0) {
3207+
return 0;
3208+
}
3209+
3210+
u64 start_addr = (u64) READ_KERN(seq_ops->start);
3211+
if (start_addr == 0) {
3212+
return 0;
3213+
}
3214+
3215+
u64 next_addr = (u64) READ_KERN(seq_ops->next);
3216+
if (next_addr == 0) {
3217+
return 0;
3218+
}
3219+
3220+
u64 stop_addr = (u64) READ_KERN(seq_ops->stop);
3221+
if (stop_addr == 0) {
3222+
return 0;
3223+
}
3224+
u64 seq_ops_addresses[NET_SEQ_OPS_SIZE + 1] = {show_addr, start_addr, next_addr, stop_addr};
3225+
3226+
add_u64_elements_to_buf(&data, (const u64 *) seq_ops_addresses, 4, count_off);
32313227
}
3228+
events_perf_submit(&data, PRINT_NET_SEQ_OPS, 0);
32323229
return 0;
32333230
}
32343231

pkg/ebpf/tracee.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
"errors"
1010
"fmt"
11+
"github.com/aquasecurity/tracee/pkg/events/derive"
1112
"io"
1213
"io/ioutil"
1314
"net"
@@ -1108,17 +1109,6 @@ func (t *Tracee) getCapturedIfaceIdx(ifaceName string) (int, bool) {
11081109
return t.config.Capture.NetIfaces.Find(ifaceName)
11091110
}
11101111

1111-
// Struct names for the interfaces HookedSeqOpsEventID checks for hooks
1112-
// The show,start,next and stop operation function pointers will be checked for each of those
1113-
var netSeqOps = [6]string{
1114-
"tcp4_seq_ops",
1115-
"tcp6_seq_ops",
1116-
"udp_seq_ops",
1117-
"udp6_seq_ops",
1118-
"raw_seq_ops",
1119-
"raw6_seq_ops",
1120-
}
1121-
11221112
func (t *Tracee) triggerSyscallsIntegrityCheck() {
11231113
_, ok := t.events[events.HookedSyscalls]
11241114
if !ok {
@@ -1137,9 +1127,9 @@ func (t *Tracee) triggerSeqOpsIntegrityCheck() {
11371127
if !ok {
11381128
return
11391129
}
1140-
var seqOpsPointers [len(netSeqOps)]uint64
1141-
for i, seq_name := range netSeqOps {
1142-
seqOpsStruct, err := t.kernelSymbols.GetSymbolByName("system", seq_name)
1130+
var seqOpsPointers [len(derive.NetSeqOps)]uint64
1131+
for i, seqName := range derive.NetSeqOps {
1132+
seqOpsStruct, err := t.kernelSymbols.GetSymbolByName("system", seqName)
11431133
if err != nil {
11441134
continue
11451135
}
@@ -1150,7 +1140,7 @@ func (t *Tracee) triggerSeqOpsIntegrityCheck() {
11501140

11511141
// triggerSeqOpsIntegrityCheck is used by a Uprobe to trigger an eBPF program that prints the seq ops pointers
11521142
//go:noinline
1153-
func (t *Tracee) triggerSeqOpsIntegrityCheckCall(seqOpsStruct [len(netSeqOps)]uint64) error {
1143+
func (t *Tracee) triggerSeqOpsIntegrityCheckCall(seqOpsStruct [len(derive.NetSeqOps)]uint64) error {
11541144
return nil
11551145
}
11561146

pkg/events/derive/hooked_seq_ops.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,24 @@ import (
88
"github.com/aquasecurity/tracee/types/trace"
99
)
1010

11+
// Struct names for the interfaces HookedSeqOpsEventID checks for hooks
12+
// The show,start,next and stop operation function pointers will be checked for each of those
13+
var NetSeqOps = [6]string{
14+
"tcp4_seq_ops",
15+
"tcp6_seq_ops",
16+
"udp_seq_ops",
17+
"udp6_seq_ops",
18+
"raw_seq_ops",
19+
"raw6_seq_ops",
20+
}
21+
22+
var NetSeqOpsFuncs = [4]string{
23+
"show",
24+
"start",
25+
"next",
26+
"stop",
27+
}
28+
1129
func HookedSeqOps(kernelSymbols *helpers.KernelSymbolTable) events.DeriveFunction {
1230
return singleEventDeriveFunc(events.HookedSeqOps, deriveHookedSeqOpsArgs(kernelSymbols))
1331

@@ -19,18 +37,18 @@ func deriveHookedSeqOpsArgs(kernelSymbols *helpers.KernelSymbolTable) deriveArgs
1937
if err != nil || len(seqOpsArr) < 1 {
2038
return nil, err
2139
}
22-
seqOpsName := utils.ParseSymbol(seqOpsArr[0], kernelSymbols).Name
23-
hookedSeqOps := make([]trace.HookedSymbolData, 0)
24-
for _, addr := range seqOpsArr[1:] {
40+
hookedSeqOps := make(map[string]trace.HookedSymbolData, 0)
41+
for i, addr := range seqOpsArr {
2542
inTextSegment, err := kernelSymbols.TextSegmentContains(addr)
2643
if err != nil {
2744
continue
2845
}
2946
if !inTextSegment {
3047
hookingFunction := utils.ParseSymbol(addr, kernelSymbols)
31-
hookedSeqOps = append(hookedSeqOps, trace.HookedSymbolData{SymbolName: hookingFunction.Name, ModuleOwner: hookingFunction.Owner})
48+
hookedSeqOps[NetSeqOps[i/4]+"_"+NetSeqOpsFuncs[i%4]] =
49+
trace.HookedSymbolData{SymbolName: hookingFunction.Name, ModuleOwner: hookingFunction.Owner}
3250
}
3351
}
34-
return []interface{}{seqOpsName, hookedSeqOps}, nil
52+
return []interface{}{hookedSeqOps}, nil
3553
}
3654
}

pkg/events/events.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5890,7 +5890,6 @@ var Definitions = eventDefinitions{
58905890
},
58915891
Sets: []string{},
58925892
Params: []trace.ArgMeta{
5893-
{Type: "string", Name: "struct_name"},
58945893
{Type: "[]helpers.KernelSymbol", Name: "hooked_seq_ops"},
58955894
},
58965895
},

0 commit comments

Comments
 (0)