File: socketcall_to_syscall.h

package info (click to toggle)
falcosecurity-libs 0.20.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 23,732 kB
  • sloc: ansic: 532,812; cpp: 100,792; python: 1,490; sh: 532; makefile: 195
file content (258 lines) | stat: -rw-r--r-- 4,673 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
// SPDX-License-Identifier: GPL-2.0-only OR MIT
/*

Copyright (C) 2023 The Falco Authors.

This file is dual licensed under either the MIT or GPL 2. See MIT.txt
or GPL2.txt for full copies of the license.

*/

#ifndef SOCKETCALL_TO_SYSCALL_H
#define SOCKETCALL_TO_SYSCALL_H

#include "ppm_events_public.h"

/* Right now we don't support architectures that have
 * socket-calls both on 64 and 32-bit
 */
#include <linux/net.h>

static inline int socketcall_code_to_syscall_code(int socketcall_code, bool* is_syscall_return) {
	/* First we check if we can convert a valid syscall code */
	*is_syscall_return = true;

	switch(socketcall_code) {
#ifdef __NR_socket
	case SYS_SOCKET:
		return __NR_socket;
#endif

#ifdef __NR_socketpair
	case SYS_SOCKETPAIR:
		return __NR_socketpair;
#endif

#ifdef __NR_accept
	case SYS_ACCEPT:
		return __NR_accept;
#endif

#ifdef __NR_accept4
	case SYS_ACCEPT4:
		return __NR_accept4;
#endif

#ifdef __NR_bind
	case SYS_BIND:
		return __NR_bind;
#endif

#ifdef __NR_listen
	case SYS_LISTEN:
		return __NR_listen;
#endif

#ifdef __NR_connect
	case SYS_CONNECT:
		return __NR_connect;
#endif

#ifdef __NR_getsockname
	case SYS_GETSOCKNAME:
		return __NR_getsockname;
#endif

#ifdef __NR_getpeername
	case SYS_GETPEERNAME:
		return __NR_getpeername;
#endif

#ifdef __NR_getsockopt
	case SYS_GETSOCKOPT:
		return __NR_getsockopt;
#endif

#ifdef __NR_setsockopt
	case SYS_SETSOCKOPT:
		return __NR_setsockopt;
#endif

#ifdef __NR_recv
	case SYS_RECV:
		return __NR_recv;
#endif

#ifdef __NR_recvfrom
	case SYS_RECVFROM:
		return __NR_recvfrom;
#endif

#ifdef __NR_recvmsg
	case SYS_RECVMSG:
		return __NR_recvmsg;
#endif

#ifdef __NR_recvmmsg
	case SYS_RECVMMSG:
		return __NR_recvmmsg;
#endif

#ifdef __NR_send
	case SYS_SEND:
		return __NR_send;
#endif

#ifdef __NR_sendto
	case SYS_SENDTO:
		return __NR_sendto;
#endif

#ifdef __NR_sendmsg
	case SYS_SENDMSG:
		return __NR_sendmsg;
#endif

#ifdef __NR_sendmmsg
	case SYS_SENDMMSG:
		return __NR_sendmmsg;
#endif

#ifdef __NR_shutdown
	case SYS_SHUTDOWN:
		return __NR_shutdown;
#endif
	default:
		break;
	}

	/* If we cannot convert to a valid syscall id, there are 2 possibilities:
	 * 1. the user provided the wrong socket call code.
	 *	  In this case we will send a generic event at the end of this method
	 * 2. The socket call code is defined but the corresponding
	 *    syscall call is not defined. For example on s390x machines
	 *    `SYS_ACCEPT` is defined but `__NR_accept` is not.
	 * 	  In this way we will send the corresponding event.
	 *
	 * Known cases in which the socket call code is defined but
	 * the corresponding syscall code is not:
	 *
	 * ----- s390x
	 * - `SYS_ACCEPT` is defined but `__NR_accept` is not defined
	 *
	 * ----- x86 with CONFIG_IA32_EMULATION
	 * - `SYS_ACCEPT` is defined but `__NR_accept` is not defined
	 * - `SYS_SEND` is defined but `__NR_send` is not defined
	 * - `SYS_RECV` is defined but `__NR_recv` is not defined
	 */
	*is_syscall_return = false;

	switch(socketcall_code) {
#ifdef SYS_SOCKET
	case SYS_SOCKET:
		return PPME_SOCKET_SOCKET_E;
#endif

#ifdef SYS_SOCKETPAIR
	case SYS_SOCKETPAIR:
		return PPME_SOCKET_SOCKETPAIR_E;
#endif

#ifdef SYS_ACCEPT
	case SYS_ACCEPT:
		return PPME_SOCKET_ACCEPT_5_E;
#endif

#ifdef SYS_ACCEPT4
	case SYS_ACCEPT4:
		return PPME_SOCKET_ACCEPT4_6_E;
#endif

#ifdef SYS_BIND
	case SYS_BIND:
		return PPME_SOCKET_BIND_E;
#endif

#ifdef SYS_LISTEN
	case SYS_LISTEN:
		return PPME_SOCKET_LISTEN_E;
#endif

#ifdef SYS_CONNECT
	case SYS_CONNECT:
		return PPME_SOCKET_CONNECT_E;
#endif

#ifdef SYS_GETSOCKNAME
	case SYS_GETSOCKNAME:
		return PPME_SOCKET_GETSOCKNAME_E;
#endif

#ifdef SYS_GETPEERNAME
	case SYS_GETPEERNAME:
		return PPME_SOCKET_GETPEERNAME_E;
#endif

#ifdef SYS_GETSOCKOPT
	case SYS_GETSOCKOPT:
		return PPME_SOCKET_GETSOCKOPT_E;
#endif

#ifdef SYS_SETSOCKOPT
	case SYS_SETSOCKOPT:
		return PPME_SOCKET_SETSOCKOPT_E;
#endif

#ifdef SYS_RECV
	case SYS_RECV:
		return PPME_SOCKET_RECV_E;
#endif

#ifdef SYS_RECVFROM
	case SYS_RECVFROM:
		return PPME_SOCKET_RECVFROM_E;
#endif

#ifdef SYS_RECVMSG
	case SYS_RECVMSG:
		return PPME_SOCKET_RECVMSG_E;
#endif

#ifdef SYS_RECVMMSG
	case SYS_RECVMMSG:
		return PPME_SOCKET_RECVMMSG_E;
#endif

#ifdef SYS_SEND
	case SYS_SEND:
		return PPME_SOCKET_SEND_E;
#endif

#ifdef SYS_SENDTO
	case SYS_SENDTO:
		return PPME_SOCKET_SENDTO_E;
#endif

#ifdef SYS_SENDMSG
	case SYS_SENDMSG:
		return PPME_SOCKET_SENDMSG_E;
#endif

#ifdef SYS_SENDMMSG
	case SYS_SENDMMSG:
		return PPME_SOCKET_SENDMMSG_E;
#endif

#ifdef SYS_SHUTDOWN
	case SYS_SHUTDOWN:
		return PPME_SOCKET_SHUTDOWN_E;
#endif

	default:
		break;
	}

	return -1;
}

#endif /* SOCKETCALL_TO_SYSCALL_H */