Skip to content

Commit f4c4710

Browse files
committed
feat: add PPME_SYSCALL_SEMOP_E params to PPME_SYSCALL_SEMOP_X
Add `PPME_SYSCALL_SEMOP_E` parameters to `PPME_SYSCALL_SEMOP_X` event definition and aligns all 3 kernel drivers to it. Add new rules to scap file converter table to convert events in old scap files to the new layout. Add/update semop-related drivers, scap converter and sinsp parser tests to account the new layout. Signed-off-by: Leonardo Di Giovanna <[email protected]>
1 parent da77c77 commit f4c4710

File tree

13 files changed

+229
-15
lines changed

13 files changed

+229
-15
lines changed

driver/SCHEMA_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.38.0
1+
3.39.0

driver/bpf/fillers.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5498,7 +5498,12 @@ FILLER(sys_semop_x, true) {
54985498
CHECK_RES(res);
54995499

55005500
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
5501-
return bpf_push_u16_to_ring(data, semop_flags_to_scap(sops[1].sem_flg));
5501+
res = bpf_push_u16_to_ring(data, semop_flags_to_scap(sops[1].sem_flg));
5502+
CHECK_RES(res);
5503+
5504+
/* Parameter 9: semid (type: PT_INT32) */
5505+
int32_t initval = (int32_t)bpf_syscall_get_argument(data, 0);
5506+
return bpf_push_s32_to_ring(data, initval);
55025507
}
55035508

55045509
FILLER(sys_socket_x, true) {

driver/event_table.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,20 +1588,24 @@ const struct ppm_event_info g_event_info[] = {
15881588
{"queuepct", PT_UINT8, PF_DEC},
15891589
{"queuelen", PT_UINT32, PF_DEC},
15901590
{"queuemax", PT_UINT32, PF_DEC}}},
1591-
[PPME_SYSCALL_SEMOP_E] =
1592-
{"semop", EC_PROCESS | EC_SYSCALL, EF_NONE, 1, {{"semid", PT_INT32, PF_DEC}}},
1591+
[PPME_SYSCALL_SEMOP_E] = {"semop",
1592+
EC_PROCESS | EC_SYSCALL,
1593+
EF_TMP_CONVERTER_MANAGED,
1594+
1,
1595+
{{"semid", PT_INT32, PF_DEC}}},
15931596
[PPME_SYSCALL_SEMOP_X] = {"semop",
15941597
EC_PROCESS | EC_SYSCALL,
1595-
EF_NONE,
1596-
8,
1598+
EF_TMP_CONVERTER_MANAGED,
1599+
9,
15971600
{{"res", PT_ERRNO, PF_DEC},
15981601
{"nsops", PT_UINT32, PF_DEC},
15991602
{"sem_num_0", PT_UINT16, PF_DEC},
16001603
{"sem_op_0", PT_INT16, PF_DEC},
16011604
{"sem_flg_0", PT_FLAGS16, PF_HEX, semop_flags},
16021605
{"sem_num_1", PT_UINT16, PF_DEC},
16031606
{"sem_op_1", PT_INT16, PF_DEC},
1604-
{"sem_flg_1", PT_FLAGS16, PF_HEX, semop_flags}}},
1607+
{"sem_flg_1", PT_FLAGS16, PF_HEX, semop_flags},
1608+
{"semid", PT_INT32, PF_DEC}}},
16051609
[PPME_SYSCALL_SEMCTL_E] = {"semctl",
16061610
EC_PROCESS | EC_SYSCALL,
16071611
EF_NONE,

driver/modern_bpf/definitions/events_dimensions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@
164164
#define CPU_HOTPLUG_E_SIZE HEADER_LEN + sizeof(uint32_t) * 2 + PARAM_LEN * 2
165165
#define ACCEPT_E_SIZE HEADER_LEN
166166
#define SEMOP_E_SIZE HEADER_LEN + sizeof(int32_t) + PARAM_LEN
167-
#define SEMOP_X_SIZE HEADER_LEN + sizeof(int16_t) * 2 + sizeof(int64_t) + sizeof(uint16_t) * 4 + sizeof(uint32_t) + PARAM_LEN * 8
167+
#define SEMOP_X_SIZE HEADER_LEN + sizeof(int16_t) * 2 + sizeof(int32_t) + sizeof(int64_t) + sizeof(uint16_t) * 4 + sizeof(uint32_t) + PARAM_LEN * 9
168168
#define SEMCTL_E_SIZE HEADER_LEN + sizeof(int32_t) * 3 + sizeof(uint16_t) + PARAM_LEN * 4
169169
#define SEMCTL_X_SIZE HEADER_LEN + sizeof(int64_t) + PARAM_LEN
170170
#define MOUNT_E_SIZE HEADER_LEN + sizeof(uint32_t) + PARAM_LEN

driver/modern_bpf/programs/tail_called/events/syscall_dispatched_events/semop.bpf.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ int BPF_PROG(semop_e, struct pt_regs *regs, long id) {
2121

2222
/*=============================== COLLECT PARAMETERS ===========================*/
2323

24-
/* Parameter 1: semid (type: PT_INT32)*/
24+
/* Parameter 1: semid (type: PT_INT32) */
2525
int32_t semid = (int32_t)extract__syscall_argument(regs, 0);
2626
ringbuf__store_s32(&ringbuf, semid);
2727

@@ -92,6 +92,10 @@ int BPF_PROG(semop_x, struct pt_regs *regs, long ret) {
9292
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
9393
ringbuf__store_u16(&ringbuf, semop_flags_to_scap(sops[1].sem_flg));
9494

95+
/* Parameter 9: semid (type: PT_INT32) */
96+
int32_t semid = (int32_t)extract__syscall_argument(regs, 0);
97+
ringbuf__store_s32(&ringbuf, semid);
98+
9599
/*=============================== COLLECT PARAMETERS ===========================*/
96100

97101
ringbuf__submit_event(&ringbuf);

driver/ppm_fillers.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7726,6 +7726,7 @@ int f_sys_semop_x(struct event_filler_arguments *args) {
77267726
long retval = 0;
77277727
struct sembuf *sops_pointer = NULL;
77287728
struct sembuf sops[2] = {0};
7729+
unsigned long val;
77297730

77307731
/* Parameter 1: res (type: PT_ERRNO) */
77317732
retval = (int64_t)syscall_get_return_value(current, args->regs);
@@ -7782,6 +7783,11 @@ int f_sys_semop_x(struct event_filler_arguments *args) {
77827783
res = val_to_ring(args, semop_flags_to_scap(sops[1].sem_flg), 0, true, 0);
77837784
CHECK_RES(res);
77847785

7786+
/* Parameter 9: semid (type: PT_INT32) */
7787+
syscall_get_arguments_deprecated(args, 0, 1, &val);
7788+
res = val_to_ring(args, (int32_t)val, 0, true, 0);
7789+
CHECK_RES(res);
7790+
77857791
return add_sentinel(args);
77867792
}
77877793

test/drivers/test_suites/syscall_enter_suite/semop_e.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ TEST(SyscallEnter, semopE) {
3232

3333
/*=============================== ASSERT PARAMETERS ===========================*/
3434

35-
/* Parameter 1: semid (type: PT_INT32)*/
35+
/* Parameter 1: semid (type: PT_INT32) */
3636
evt_test->assert_numeric_param(1, (int32_t)semid);
3737

3838
/*=============================== ASSERT PARAMETERS ===========================*/

test/drivers/test_suites/syscall_exit_suite/semop_x.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ TEST(SyscallExit, semopX_null_pointer) {
5757
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
5858
evt_test->assert_numeric_param(8, (uint16_t)0);
5959

60+
/* Parameter 9: semid (type: PT_INT32) */
61+
evt_test->assert_numeric_param(9, (int32_t)semid);
62+
6063
/*=============================== ASSERT PARAMETERS ===========================*/
6164

62-
evt_test->assert_num_params_pushed(8);
65+
evt_test->assert_num_params_pushed(9);
6366
}
6467

6568
#if defined(__NR_semget) && defined(__NR_semctl)
@@ -133,9 +136,12 @@ TEST(SyscallExit, semopX_wrong_nops) {
133136
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
134137
evt_test->assert_numeric_param(8, (uint16_t)0);
135138

139+
/* Parameter 9: semid (type: PT_INT32) */
140+
evt_test->assert_numeric_param(9, (int32_t)semid);
141+
136142
/*=============================== ASSERT PARAMETERS ===========================*/
137143

138-
evt_test->assert_num_params_pushed(8);
144+
evt_test->assert_num_params_pushed(9);
139145
}
140146

141147
TEST(SyscallExit, semopX_1_operation) {
@@ -206,9 +212,12 @@ TEST(SyscallExit, semopX_1_operation) {
206212
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
207213
evt_test->assert_numeric_param(8, (uint16_t)0);
208214

215+
/* Parameter 9: semid (type: PT_INT32) */
216+
evt_test->assert_numeric_param(9, (int32_t)semid);
217+
209218
/*=============================== ASSERT PARAMETERS ===========================*/
210219

211-
evt_test->assert_num_params_pushed(8);
220+
evt_test->assert_num_params_pushed(9);
212221
}
213222

214223
TEST(SyscallExit, semopX_2_operation) {
@@ -280,9 +289,12 @@ TEST(SyscallExit, semopX_2_operation) {
280289
/* Parameter 8: sem_flg_1 (type: PT_FLAGS16) */
281290
evt_test->assert_numeric_param(8, (uint16_t)PPM_IPC_NOWAIT);
282291

292+
/* Parameter 9: semid (type: PT_INT32) */
293+
evt_test->assert_numeric_param(9, (int32_t)semid);
294+
283295
/*=============================== ASSERT PARAMETERS ===========================*/
284296

285-
evt_test->assert_num_params_pushed(8);
297+
evt_test->assert_num_params_pushed(9);
286298
}
287299

288300
#endif

test/libscap/test_suites/engines/savefile/converter.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2689,6 +2689,114 @@ TEST_F(convert_event_test, PPME_SYSCALL_FLOCK_1_X_to_3_params_with_enter) {
26892689
create_safe_scap_event(ts, tid, PPME_SYSCALL_FLOCK_X, 3, res, fd, operation));
26902690
}
26912691

2692+
////////////////////////////
2693+
// SEMOP
2694+
////////////////////////////
2695+
2696+
TEST_F(convert_event_test, PPME_SYSCALL_SEMOP_E_store) {
2697+
constexpr uint64_t ts = 12;
2698+
constexpr int64_t tid = 25;
2699+
2700+
constexpr int32_t semid = 25;
2701+
2702+
const auto evt = create_safe_scap_event(ts, tid, PPME_SYSCALL_SEMOP_E, 1, semid);
2703+
assert_single_conversion_skip(evt);
2704+
assert_event_storage_presence(evt);
2705+
}
2706+
2707+
TEST_F(convert_event_test, PPME_SYSCALL_SEMOP_8_X_to_9_params_no_enter) {
2708+
constexpr uint64_t ts = 12;
2709+
constexpr int64_t tid = 25;
2710+
2711+
constexpr int64_t res = 89;
2712+
constexpr uint32_t nsops = 20;
2713+
constexpr uint16_t sem_num_0 = 21;
2714+
constexpr int16_t sem_op_0 = 22;
2715+
constexpr uint16_t sem_flg_0 = 23;
2716+
constexpr uint16_t sem_num_1 = 24;
2717+
constexpr int16_t sem_op_1 = 25;
2718+
constexpr uint16_t sem_flg_1 = 26;
2719+
2720+
// Defaulted to 0
2721+
constexpr int32_t semid = 0;
2722+
2723+
assert_single_conversion_success(conversion_result::CONVERSION_COMPLETED,
2724+
create_safe_scap_event(ts,
2725+
tid,
2726+
PPME_SYSCALL_SEMOP_X,
2727+
8,
2728+
res,
2729+
nsops,
2730+
sem_num_0,
2731+
sem_op_0,
2732+
sem_flg_0,
2733+
sem_num_1,
2734+
sem_op_1,
2735+
sem_flg_1),
2736+
create_safe_scap_event(ts,
2737+
tid,
2738+
PPME_SYSCALL_SEMOP_X,
2739+
9,
2740+
res,
2741+
nsops,
2742+
sem_num_0,
2743+
sem_op_0,
2744+
sem_flg_0,
2745+
sem_num_1,
2746+
sem_op_1,
2747+
sem_flg_1,
2748+
semid));
2749+
}
2750+
2751+
TEST_F(convert_event_test, PPME_SYSCALL_SEMOP_1_X_to_3_params_with_enter) {
2752+
constexpr uint64_t ts = 12;
2753+
constexpr int64_t tid = 25;
2754+
2755+
constexpr int32_t semid = 27;
2756+
constexpr int64_t res = 89;
2757+
constexpr uint32_t nsops = 20;
2758+
constexpr uint16_t sem_num_0 = 21;
2759+
constexpr int16_t sem_op_0 = 22;
2760+
constexpr uint16_t sem_flg_0 = 23;
2761+
constexpr uint16_t sem_num_1 = 24;
2762+
constexpr int16_t sem_op_1 = 25;
2763+
constexpr uint16_t sem_flg_1 = 26;
2764+
2765+
// Defaulted to 0
2766+
2767+
// After the first conversion we should have the storage
2768+
const auto evt = create_safe_scap_event(ts, tid, PPME_SYSCALL_FLOCK_E, 1, semid);
2769+
assert_single_conversion_skip(evt);
2770+
assert_event_storage_presence(evt);
2771+
2772+
assert_single_conversion_success(conversion_result::CONVERSION_COMPLETED,
2773+
create_safe_scap_event(ts,
2774+
tid,
2775+
PPME_SYSCALL_SEMOP_X,
2776+
8,
2777+
res,
2778+
nsops,
2779+
sem_num_0,
2780+
sem_op_0,
2781+
sem_flg_0,
2782+
sem_num_1,
2783+
sem_op_1,
2784+
sem_flg_1),
2785+
create_safe_scap_event(ts,
2786+
tid,
2787+
PPME_SYSCALL_SEMOP_X,
2788+
9,
2789+
res,
2790+
nsops,
2791+
sem_num_0,
2792+
sem_op_0,
2793+
sem_flg_0,
2794+
sem_num_1,
2795+
sem_op_1,
2796+
sem_flg_1,
2797+
semid));
2798+
}
2799+
26922800
////////////////////////////
26932801
// FCHDIR
26942802
////////////////////////////

userspace/libscap/engine/savefile/converter/table.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ const std::unordered_map<conversion_key, conversion_info> g_conversion_table = {
280280
conversion_info()
281281
.action(C_ACTION_ADD_PARAMS)
282282
.instrs({{C_INSTR_FROM_ENTER, 0}, {C_INSTR_FROM_ENTER, 1}})},
283+
/*====================== SEMOP ======================*/
284+
{conversion_key{PPME_SYSCALL_SEMOP_E, 1}, conversion_info().action(C_ACTION_STORE)},
285+
{conversion_key{PPME_SYSCALL_SEMOP_X, 8},
286+
conversion_info().action(C_ACTION_ADD_PARAMS).instrs({{C_INSTR_FROM_ENTER, 0}})},
283287
/*====================== SETGID ======================*/
284288
{conversion_key{PPME_SYSCALL_SETGID_E, 1}, conversion_info().action(C_ACTION_STORE)},
285289
{conversion_key{PPME_SYSCALL_SETGID_X, 1},

0 commit comments

Comments
 (0)