Blame
Date:
Wed Oct 5 15:10:44 2022 UTC
Message:
make the various strings in the config fixed-length will help in future restructuring to have fixed-size objects.
001
2021-01-23
op
/*
002
2021-01-23
op
* Copyright (c) 2021 Omar Polo <op@omarpolo.com>
003
2021-01-23
op
*
004
2021-01-23
op
* Permission to use, copy, modify, and distribute this software for any
005
2021-01-23
op
* purpose with or without fee is hereby granted, provided that the above
006
2021-01-23
op
* copyright notice and this permission notice appear in all copies.
007
2021-01-23
op
*
008
2021-01-23
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2021-01-23
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2021-01-23
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2021-01-23
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2021-01-23
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2021-01-23
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2021-01-23
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2021-01-23
op
*/
016
2021-01-23
op
017
2021-01-15
op
#include "gmid.h"
018
2021-01-15
op
019
2021-07-02
op
#if DISABLE_SANDBOX
020
2021-01-15
op
021
2021-07-02
op
#warning "Sandbox disabled! Please report issues upstream instead of disabling the sandbox."
022
2021-07-02
op
023
2021-07-02
op
void
024
2022-09-06
op
sandbox_server_process(int can_open_sockets)
025
2021-07-02
op
{
026
2021-07-02
op
return;
027
2021-07-02
op
}
028
2021-07-02
op
029
2021-07-02
op
void
030
2021-07-02
op
sandbox_logger_process(void)
031
2021-07-02
op
{
032
2021-07-02
op
return;
033
2021-07-02
op
}
034
2021-07-02
op
035
2021-07-02
op
#elif defined(__FreeBSD__)
036
2021-07-02
op
037
2021-01-15
op
#include <sys/capsicum.h>
038
2021-01-15
op
039
2021-01-15
op
void
040
2022-09-06
op
sandbox_server_process(int can_open_sockets)
041
2021-01-15
op
{
042
2022-09-06
op
/* can't capsicum if fastcgi or proxying are used. */
043
2022-09-06
op
if (can_open_sockets)
044
2022-09-06
op
return;
045
2022-09-06
op
046
2021-01-15
op
if (cap_enter() == -1)
047
2021-02-11
op
fatal("cap_enter");
048
2021-01-15
op
}
049
2021-01-15
op
050
2021-03-20
op
void
051
2021-03-20
op
sandbox_logger_process(void)
052
2021-03-20
op
{
053
2021-03-20
op
if (cap_enter() == -1)
054
2021-03-20
op
fatal("cap_enter");
055
2021-03-20
op
}
056
2021-03-20
op
057
2021-01-15
op
#elif defined(__linux__)
058
2021-01-15
op
059
2021-09-26
op
#include <sys/ioctl.h>
060
2021-01-17
op
#include <sys/prctl.h>
061
2021-01-17
op
#include <sys/syscall.h>
062
2021-01-17
op
#include <sys/syscall.h>
063
2021-01-17
op
#include <sys/types.h>
064
2021-01-17
op
065
2021-01-17
op
#include <linux/audit.h>
066
2021-01-17
op
#include <linux/filter.h>
067
2021-01-17
op
#include <linux/seccomp.h>
068
2021-01-17
op
069
2021-01-17
op
#include <errno.h>
070
2021-01-20
op
#include <fcntl.h>
071
2021-01-17
op
#include <stddef.h>
072
2021-01-17
op
#include <stdio.h>
073
2021-01-17
op
#include <string.h>
074
2021-09-19
op
075
2021-09-19
op
#if HAVE_LANDLOCK
076
2021-09-19
op
# include "landlock_shim.h"
077
2021-09-19
op
#endif
078
2021-01-17
op
079
2021-07-02
op
/* uncomment to enable debugging. ONLY FOR DEVELOPMENT */
080
2021-07-02
op
/* #define SC_DEBUG */
081
2021-07-02
op
082
2021-07-02
op
#ifdef SC_DEBUG
083
2021-07-02
op
# define SC_FAIL SECCOMP_RET_TRAP
084
2021-07-02
op
#else
085
2021-07-02
op
# define SC_FAIL SECCOMP_RET_KILL
086
2021-07-02
op
#endif
087
2021-07-02
op
088
2021-07-02
op
#if (BYTE_ORDER == LITTLE_ENDIAN)
089
2021-07-02
op
# define SC_ARG_LO 0
090
2021-07-02
op
# define SC_ARG_HI sizeof(uint32_t)
091
2021-07-02
op
#elif (BYTE_ORDER == BIG_ENDIAN)
092
2021-07-02
op
# define SC_ARG_LO sizeof(uint32_t)
093
2021-07-02
op
# define SC_ARG_HI 0
094
2021-07-02
op
#else
095
2021-07-02
op
# error "Uknown endian"
096
2021-07-02
op
#endif
097
2021-07-02
op
098
2021-07-02
op
/* make the filter more readable */
099
2021-07-02
op
#define SC_ALLOW(nr) \
100
2021-07-02
op
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_##nr, 0, 1), \
101
2021-07-02
op
BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW)
102
2021-07-02
op
103
2021-07-02
op
/*
104
2021-07-02
op
* SC_ALLOW_ARG and the SECCOMP_AUDIT_ARCH below are courtesy of
105
2021-07-02
op
* https://roy.marples.name/git/dhcpcd/blob/HEAD:/src/privsep-linux.c
106
2021-07-02
op
*/
107
2021-07-02
op
#define SC_ALLOW_ARG(_nr, _arg, _val) \
108
2021-07-02
op
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, (_nr), 0, 6), \
109
2021-07-02
op
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, \
110
2021-07-02
op
offsetof(struct seccomp_data, args[(_arg)]) + SC_ARG_LO), \
111
2021-07-02
op
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, \
112
2021-07-02
op
((_val) & 0xffffffff), 0, 3), \
113
2021-07-02
op
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, \
114
2021-07-02
op
offsetof(struct seccomp_data, args[(_arg)]) + SC_ARG_HI), \
115
2021-07-02
op
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, \
116
2021-07-02
op
(((uint32_t)((uint64_t)(_val) >> 32)) & 0xffffffff), 0, 1), \
117
2021-07-02
op
BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), \
118
2021-07-02
op
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, \
119
2021-07-02
op
offsetof(struct seccomp_data, nr))
120
2021-07-02
op
121
2021-07-02
op
/*
122
2021-07-02
op
* I personally find this quite nutty. Why can a system header not
123
2021-07-02
op
* define a default for this?
124
2021-07-02
op
*/
125
2021-01-17
op
#if defined(__i386__)
126
2021-01-17
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_I386
127
2021-01-17
op
#elif defined(__x86_64__)
128
2021-01-17
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_X86_64
129
2021-07-02
op
#elif defined(__arc__)
130
2021-07-02
op
# if defined(__A7__)
131
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
132
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARCOMPACT
133
2021-07-02
op
# else
134
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARCOMPACTBE
135
2021-07-02
op
# endif
136
2021-07-02
op
# elif defined(__HS__)
137
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
138
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARCV2
139
2021-07-02
op
# else
140
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARCV2BE
141
2021-07-02
op
# endif
142
2021-07-02
op
# else
143
2021-07-02
op
# error "Platform does not support seccomp filter yet"
144
2021-07-02
op
# endif
145
2021-01-17
op
#elif defined(__arm__)
146
2021-07-02
op
# ifndef EM_ARM
147
2021-07-02
op
# define EM_ARM 40
148
2021-07-02
op
# endif
149
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
150
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARM
151
2021-07-02
op
# else
152
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARMEB
153
2021-07-02
op
# endif
154
2021-01-17
op
#elif defined(__aarch64__)
155
2021-01-17
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_AARCH64
156
2021-07-02
op
#elif defined(__alpha__)
157
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ALPHA
158
2021-07-02
op
#elif defined(__hppa__)
159
2021-07-02
op
# if defined(__LP64__)
160
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PARISC64
161
2021-07-02
op
# else
162
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PARISC
163
2021-07-02
op
# endif
164
2021-07-02
op
#elif defined(__ia64__)
165
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_IA64
166
2021-07-02
op
#elif defined(__microblaze__)
167
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MICROBLAZE
168
2021-07-02
op
#elif defined(__m68k__)
169
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_M68K
170
2021-01-17
op
#elif defined(__mips__)
171
2021-07-02
op
# if defined(__MIPSEL__)
172
2021-07-02
op
# if defined(__LP64__)
173
2021-01-17
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPSEL64
174
2021-07-02
op
# else
175
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPSEL
176
2021-01-17
op
# endif
177
2021-07-02
op
# elif defined(__LP64__)
178
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPS64
179
2021-01-17
op
# else
180
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPS
181
2021-07-02
op
# endif
182
2021-07-02
op
#elif defined(__nds32__)
183
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
184
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_NDS32
185
2021-07-02
op
#else
186
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_NDS32BE
187
2021-07-02
op
#endif
188
2021-07-02
op
#elif defined(__nios2__)
189
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_NIOS2
190
2021-07-02
op
#elif defined(__or1k__)
191
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_OPENRISC
192
2021-07-02
op
#elif defined(__powerpc64__)
193
2021-07-03
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
194
2021-07-03
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64LE
195
2021-07-03
op
# else
196
2021-07-03
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64
197
2021-07-03
op
# endif
198
2021-07-02
op
#elif defined(__powerpc__)
199
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC
200
2021-07-02
op
#elif defined(__riscv)
201
2021-07-02
op
# if defined(__LP64__)
202
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_RISCV64
203
2021-07-02
op
# else
204
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_RISCV32
205
2021-07-02
op
# endif
206
2021-07-02
op
#elif defined(__s390x__)
207
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390X
208
2021-07-02
op
#elif defined(__s390__)
209
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390
210
2021-07-02
op
#elif defined(__sh__)
211
2021-07-02
op
# if defined(__LP64__)
212
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
213
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SHEL64
214
2021-01-17
op
# else
215
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SH64
216
2021-01-17
op
# endif
217
2021-07-02
op
# else
218
2021-07-02
op
# if (BYTE_ORDER == LITTLE_ENDIAN)
219
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SHEL
220
2021-07-02
op
# else
221
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SH
222
2021-07-02
op
# endif
223
2021-01-17
op
# endif
224
2021-07-02
op
#elif defined(__sparc__)
225
2021-07-02
op
# if defined(__arch64__)
226
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SPARC64
227
2021-07-02
op
# else
228
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_SPARC
229
2021-07-02
op
# endif
230
2021-07-02
op
#elif defined(__xtensa__)
231
2021-07-02
op
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_XTENSA
232
2021-01-17
op
#else
233
2021-01-17
op
# error "Platform does not support seccomp filter yet"
234
2021-01-17
op
#endif
235
2021-01-17
op
236
2022-03-19
op
static const struct sock_filter filter[] = {
237
2021-07-02
op
/* load the *current* architecture */
238
2021-07-02
op
BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
239
2021-07-02
op
(offsetof(struct seccomp_data, arch))),
240
2021-07-02
op
/* ensure it's the same that we've been compiled on */
241
2021-07-02
op
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K,
242
2021-07-02
op
SECCOMP_AUDIT_ARCH, 1, 0),
243
2021-07-02
op
/* if not, kill the program */
244
2021-07-02
op
BPF_STMT(BPF_RET | BPF_K, SC_FAIL),
245
2021-01-17
op
246
2021-07-02
op
/* load the syscall number */
247
2021-07-02
op
BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
248
2021-07-02
op
(offsetof(struct seccomp_data, nr))),
249
2021-07-02
op
250
2021-07-02
op
#ifdef __NR_accept
251
2021-07-02
op
SC_ALLOW(accept),
252
2021-07-02
op
#endif
253
2021-07-02
op
#ifdef __NR_accept4
254
2021-07-02
op
SC_ALLOW(accept4),
255
2021-07-02
op
#endif
256
2021-07-02
op
#ifdef __NR_brk
257
2021-07-02
op
SC_ALLOW(brk),
258
2021-07-02
op
#endif
259
2021-07-02
op
#ifdef __NR_clock_gettime
260
2021-07-02
op
SC_ALLOW(clock_gettime),
261
2021-07-02
op
#endif
262
2021-07-02
op
#if defined(__x86_64__) && defined(__ILP32__) && defined(__X32_SYSCALL_BIT)
263
2021-07-02
op
SECCOMP_ALLOW(__NR_clock_gettime & ~__X32_SYSCALL_BIT),
264
2021-07-02
op
#endif
265
2021-07-02
op
#ifdef __NR_clock_gettime64
266
2021-07-02
op
SC_ALLOW(clock_gettime64),
267
2021-07-02
op
#endif
268
2021-07-02
op
#ifdef __NR_close
269
2021-07-02
op
SC_ALLOW(close),
270
2021-07-02
op
#endif
271
2021-07-02
op
#ifdef __NR_epoll_ctl
272
2021-07-02
op
SC_ALLOW(epoll_ctl),
273
2021-07-02
op
#endif
274
2021-07-02
op
#ifdef __NR_epoll_pwait
275
2021-07-02
op
SC_ALLOW(epoll_pwait),
276
2021-07-02
op
#endif
277
2021-07-02
op
#ifdef __NR_epoll_wait
278
2021-07-02
op
SC_ALLOW(epoll_wait),
279
2021-01-17
op
#endif
280
2021-07-02
op
#ifdef __NR_exit
281
2021-07-02
op
SC_ALLOW(exit),
282
2021-07-02
op
#endif
283
2021-07-02
op
#ifdef __NR_exit_group
284
2021-07-02
op
SC_ALLOW(exit_group),
285
2021-07-02
op
#endif
286
2021-07-02
op
#ifdef __NR_fcntl
287
2021-07-02
op
SC_ALLOW(fcntl),
288
2021-07-02
op
#endif
289
2021-07-02
op
#ifdef __NR_fcntl64
290
2021-07-02
op
SC_ALLOW(fcntl64),
291
2021-07-02
op
#endif
292
2021-07-02
op
#ifdef __NR_fstat
293
2021-07-02
op
SC_ALLOW(fstat),
294
2021-07-02
op
#endif
295
2021-07-23
op
#ifdef __NR_fstat64
296
2021-07-23
op
SC_ALLOW(fstat64),
297
2022-02-13
op
#endif
298
2022-02-13
op
#ifdef __NR_fstatat64
299
2022-02-13
op
SC_ALLOW(fstatat64),
300
2021-07-23
op
#endif
301
2021-07-02
op
#ifdef __NR_getdents64
302
2021-07-02
op
SC_ALLOW(getdents64),
303
2021-07-02
op
#endif
304
2021-07-02
op
#ifdef __NR_getpid
305
2021-07-02
op
SC_ALLOW(getpid),
306
2021-07-02
op
#endif
307
2021-07-02
op
#ifdef __NR_getrandom
308
2021-07-02
op
SC_ALLOW(getrandom),
309
2021-07-02
op
#endif
310
2021-07-02
op
#ifdef __NR_gettimeofday
311
2021-07-02
op
SC_ALLOW(gettimeofday),
312
2021-07-02
op
#endif
313
2021-07-02
op
#ifdef __NR_ioctl
314
2021-09-26
op
/* allow ioctl on fd 1, glibc doing stuff? */
315
2021-10-18
op
SC_ALLOW_ARG(__NR_ioctl, 0, 1),
316
2021-09-26
op
/* allow FIONREAD needed by libevent */
317
2021-09-26
op
SC_ALLOW_ARG(__NR_ioctl, 1, FIONREAD),
318
2021-07-02
op
#endif
319
2022-02-13
op
#ifdef __NR__llseek
320
2022-02-13
op
SC_ALLOW(_llseek),
321
2022-02-13
op
#endif
322
2021-07-02
op
#ifdef __NR_lseek
323
2021-07-02
op
SC_ALLOW(lseek),
324
2021-07-02
op
#endif
325
2021-07-02
op
#ifdef __NR_madvise
326
2021-07-02
op
SC_ALLOW(madvise),
327
2021-07-02
op
#endif
328
2021-07-02
op
#ifdef __NR_mmap
329
2021-07-02
op
SC_ALLOW(mmap),
330
2021-07-02
op
#endif
331
2021-07-02
op
#ifdef __NR_mmap2
332
2021-07-02
op
SC_ALLOW(mmap2),
333
2021-07-02
op
#endif
334
2021-07-02
op
#ifdef __NR_munmap
335
2021-07-02
op
SC_ALLOW(munmap),
336
2021-07-02
op
#endif
337
2021-07-02
op
#ifdef __NR_newfstatat
338
2021-07-02
op
SC_ALLOW(newfstatat),
339
2021-07-02
op
#endif
340
2021-07-02
op
#ifdef __NR_oldfstat
341
2021-07-02
op
SC_ALLOW(oldfstat),
342
2021-07-02
op
#endif
343
2021-07-02
op
#ifdef __NR_openat
344
2022-02-13
op
SC_ALLOW_ARG(__NR_openat, 3, O_RDONLY),
345
2021-07-02
op
#endif
346
2021-07-02
op
#ifdef __NR_prlimit64
347
2021-07-02
op
SC_ALLOW(prlimit64),
348
2021-07-02
op
#endif
349
2021-07-02
op
#ifdef __NR_read
350
2021-07-02
op
SC_ALLOW(read),
351
2021-07-02
op
#endif
352
2021-07-02
op
#ifdef __NR_recvmsg
353
2021-07-02
op
SC_ALLOW(recvmsg),
354
2021-07-02
op
#endif
355
2021-07-23
op
#ifdef __NR_readv
356
2021-07-23
op
SC_ALLOW(readv),
357
2021-07-02
op
#endif
358
2021-07-02
op
#ifdef __NR_rt_sigaction
359
2021-07-02
op
SC_ALLOW(rt_sigaction),
360
2021-07-02
op
#endif
361
2021-07-02
op
#ifdef __NR_rt_sigreturn
362
2021-07-02
op
SC_ALLOW(rt_sigreturn),
363
2021-07-02
op
#endif
364
2021-07-02
op
#ifdef __NR_sendmsg
365
2021-07-02
op
SC_ALLOW(sendmsg),
366
2021-07-02
op
#endif
367
2022-02-13
op
#ifdef __NR_sigreturn
368
2022-02-13
op
SC_ALLOW(sigreturn),
369
2022-02-13
op
#endif
370
2021-07-02
op
#ifdef __NR_statx
371
2021-07-02
op
SC_ALLOW(statx),
372
2021-07-02
op
#endif
373
2021-12-11
vdrummer
#ifdef __NR_ugetrlimit
374
2021-12-11
vdrummer
SC_ALLOW(ugetrlimit),
375
2021-12-11
vdrummer
#endif
376
2021-07-02
op
#ifdef __NR_write
377
2021-07-02
op
SC_ALLOW(write),
378
2021-07-02
op
#endif
379
2021-07-02
op
#ifdef __NR_writev
380
2021-07-02
op
SC_ALLOW(writev),
381
2021-07-02
op
#endif
382
2021-01-17
op
383
2021-07-03
op
/* disallow everything else */
384
2021-07-02
op
BPF_STMT(BPF_RET | BPF_K, SC_FAIL),
385
2021-07-02
op
};
386
2021-01-17
op
387
2021-01-17
op
#ifdef SC_DEBUG
388
2021-01-17
op
389
2021-01-17
op
#include <signal.h>
390
2021-01-17
op
#include <unistd.h>
391
2021-01-17
op
392
2021-01-17
op
static void
393
2021-01-17
op
sandbox_seccomp_violation(int signum, siginfo_t *info, void *ctx)
394
2021-01-17
op
{
395
2021-01-17
op
fprintf(stderr, "%s: unexpected system call (arch:0x%x,syscall:%d @ %p)\n",
396
2021-01-17
op
__func__, info->si_arch, info->si_syscall, info->si_call_addr);
397
2021-01-17
op
_exit(1);
398
2021-01-17
op
}
399
2021-01-17
op
400
2021-01-17
op
static void
401
2021-01-17
op
sandbox_seccomp_catch_sigsys(void)
402
2021-01-17
op
{
403
2021-01-17
op
struct sigaction act;
404
2021-01-17
op
sigset_t mask;
405
2021-01-17
op
406
2021-01-17
op
memset(&act, 0, sizeof(act));
407
2021-01-17
op
sigemptyset(&mask);
408
2021-01-17
op
sigaddset(&mask, SIGSYS);
409
2021-01-17
op
410
2021-01-17
op
act.sa_sigaction = &sandbox_seccomp_violation;
411
2021-01-17
op
act.sa_flags = SA_SIGINFO;
412
2021-02-11
op
if (sigaction(SIGSYS, &act, NULL) == -1)
413
2021-02-11
op
fatal("%s: sigaction(SIGSYS): %s",
414
2021-01-17
op
__func__, strerror(errno));
415
2021-02-11
op
416
2021-02-11
op
if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
417
2021-02-11
op
fatal("%s: sigprocmask(SIGSYS): %s\n",
418
2021-01-17
op
__func__, strerror(errno));
419
2021-01-17
op
}
420
2021-01-17
op
#endif /* SC_DEBUG */
421
2021-09-19
op
422
2021-09-19
op
#if HAVE_LANDLOCK
423
2021-09-19
op
static inline int
424
2021-09-25
op
open_landlock(void)
425
2021-09-19
op
{
426
2021-09-19
op
int fd;
427
2021-09-19
op
428
2022-03-19
op
const struct landlock_ruleset_attr attr = {
429
2022-02-10
op
.handled_access_fs = LANDLOCK_ACCESS_FS_EXECUTE |
430
2022-02-10
op
LANDLOCK_ACCESS_FS_READ_FILE |
431
2022-02-10
op
LANDLOCK_ACCESS_FS_READ_DIR |
432
2022-02-10
op
LANDLOCK_ACCESS_FS_WRITE_FILE |
433
2022-02-10
op
LANDLOCK_ACCESS_FS_REMOVE_DIR |
434
2022-02-10
op
LANDLOCK_ACCESS_FS_REMOVE_FILE |
435
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_CHAR |
436
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_DIR |
437
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_REG |
438
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_SOCK |
439
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_FIFO |
440
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_BLOCK |
441
2022-02-10
op
LANDLOCK_ACCESS_FS_MAKE_SYM,
442
2021-09-25
op
};
443
2021-09-25
op
444
2021-09-25
op
fd = landlock_create_ruleset(&attr, sizeof(attr), 0);
445
2021-09-19
op
if (fd == -1) {
446
2021-09-19
op
switch (errno) {
447
2021-09-19
op
case ENOSYS:
448
2021-09-19
op
fatal("%s: failed to create ruleset. "
449
2021-09-19
op
"Landlock doesn't seem to be supported by the "
450
2021-09-19
op
"current kernel.", __func__);
451
2021-09-19
op
case EOPNOTSUPP:
452
2021-09-19
op
log_warn(NULL, "%s: failed to create ruleset. "
453
2021-09-19
op
"Landlock seems to be currently disabled; "
454
2021-09-19
op
"continuing without it.", __func__);
455
2021-09-19
op
break;
456
2021-09-19
op
default:
457
2021-09-19
op
fatal("%s: failed to create ruleset: %s",
458
2021-09-19
op
__func__, strerror(errno));
459
2021-09-19
op
}
460
2021-09-19
op
}
461
2021-09-19
op
462
2021-09-19
op
return fd;
463
2021-09-25
op
}
464
2021-09-25
op
465
2021-09-25
op
static int
466
2021-09-25
op
landlock_unveil_path(int landlock_fd, const char *path, int perms)
467
2021-09-25
op
{
468
2021-09-25
op
struct landlock_path_beneath_attr pb;
469
2021-09-25
op
int err, saved_errno;
470
2021-09-25
op
471
2021-09-25
op
pb.allowed_access = perms;
472
2021-09-25
op
473
2021-09-25
op
if ((pb.parent_fd = open(path, O_PATH)) == -1)
474
2021-09-25
op
return -1;
475
2021-09-25
op
476
2021-09-25
op
err = landlock_add_rule(landlock_fd, LANDLOCK_RULE_PATH_BENEATH,
477
2021-09-25
op
&pb, 0);
478
2021-09-25
op
saved_errno = errno;
479
2021-09-25
op
close(pb.parent_fd);
480
2021-09-25
op
errno = saved_errno;
481
2021-09-25
op
return err ? -1 : 0;
482
2021-09-25
op
}
483
2021-09-25
op
484
2021-09-25
op
static int
485
2021-09-25
op
landlock_apply(int fd)
486
2021-09-25
op
{
487
2021-09-25
op
int r, saved_errno;
488
2021-09-25
op
489
2021-09-25
op
if (fd == -1)
490
2021-09-25
op
return 0;
491
2021-09-25
op
492
2021-09-25
op
r = landlock_restrict_self(fd, 0);
493
2021-09-25
op
saved_errno = errno;
494
2021-09-25
op
close(fd);
495
2021-09-25
op
errno = saved_errno;
496
2021-09-25
op
return r ? -1 : 0;
497
2021-09-19
op
}
498
2021-09-19
op
499
2021-09-19
op
static int
500
2021-09-19
op
server_landlock(void)
501
2021-09-19
op
{
502
2021-09-25
op
int fd, perms;
503
2021-09-19
op
struct vhost *h;
504
2021-09-19
op
struct location *l;
505
2021-01-17
op
506
2021-09-19
op
/*
507
2021-09-19
op
* These are all the actions allowed for the root directories
508
2021-09-25
op
* of the vhosts.
509
2021-09-19
op
*/
510
2021-09-25
op
perms = LANDLOCK_ACCESS_FS_READ_FILE | LANDLOCK_ACCESS_FS_READ_DIR;
511
2021-09-19
op
512
2021-09-25
op
if ((fd = open_landlock()) == -1)
513
2021-09-25
op
return 0;
514
2021-09-19
op
515
2021-09-19
op
TAILQ_FOREACH(h, &hosts, vhosts) {
516
2021-09-19
op
TAILQ_FOREACH(l, &h->locations, locations) {
517
2022-10-05
op
if (*l->dir == '\0')
518
2021-09-19
op
continue;
519
2021-09-19
op
520
2021-09-25
op
if (landlock_unveil_path(fd, l->dir, perms) == -1)
521
2021-09-25
op
fatal("%s: landlock_unveil_path(%s): %s",
522
2021-09-19
op
__func__, l->dir, strerror(errno));
523
2021-09-19
op
}
524
2021-09-19
op
}
525
2021-09-19
op
526
2021-09-25
op
return landlock_apply(fd);
527
2021-09-19
op
}
528
2021-09-19
op
529
2021-09-19
op
static int
530
2021-09-19
op
logger_landlock(void)
531
2021-09-19
op
{
532
2021-09-25
op
int fd;
533
2021-09-19
op
534
2021-09-25
op
if ((fd = open_landlock()) == -1)
535
2021-09-25
op
return 0;
536
2021-09-19
op
537
2021-09-25
op
/* no rules. the logger doesn't need fs access at all. */
538
2021-09-19
op
539
2021-09-25
op
return landlock_apply(fd);
540
2021-09-19
op
}
541
2021-09-19
op
#endif
542
2021-09-19
op
543
2021-01-15
op
void
544
2022-09-06
op
sandbox_server_process(int can_open_sockets)
545
2021-01-15
op
{
546
2022-03-19
op
const struct sock_fprog prog = {
547
2021-01-17
op
.len = (unsigned short) (sizeof(filter) / sizeof(filter[0])),
548
2021-01-17
op
.filter = filter,
549
2021-01-17
op
};
550
2021-01-17
op
551
2022-09-06
op
/* can't seccomp/landlock if fastcgi or proxying are used. */
552
2022-09-06
op
if (can_open_sockets)
553
2022-09-06
op
return;
554
2022-09-06
op
555
2022-09-06
op
556
2021-01-17
op
#ifdef SC_DEBUG
557
2021-01-17
op
sandbox_seccomp_catch_sigsys();
558
2021-01-17
op
#endif
559
2021-01-17
op
560
2021-02-11
op
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1)
561
2021-02-11
op
fatal("%s: prctl(PR_SET_NO_NEW_PRIVS): %s",
562
2021-01-17
op
__func__, strerror(errno));
563
2021-01-17
op
564
2021-09-19
op
#if HAVE_LANDLOCK
565
2021-09-25
op
if (server_landlock() == -1)
566
2021-09-25
op
fatal("%s: server_landlock: %s",
567
2021-09-25
op
__func__, strerror(errno));
568
2021-09-19
op
#endif
569
2021-09-19
op
570
2021-02-11
op
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) == -1)
571
2021-02-11
op
fatal("%s: prctl(PR_SET_SECCOMP): %s\n",
572
2021-01-17
op
__func__, strerror(errno));
573
2021-03-20
op
}
574
2021-03-20
op
575
2021-03-20
op
void
576
2021-03-20
op
sandbox_logger_process(void)
577
2021-03-20
op
{
578
2021-07-07
op
/*
579
2021-09-19
op
* Here we could use a seccomp filter to allow only recvfd,
580
2021-09-19
op
* write/writev and memory allocations, but syslog is a beast
581
2021-09-19
op
* and I don't know what syscalls it could end up doing.
582
2021-09-19
op
* Landlock is a simpler beast, use it to disallow any file
583
2021-09-19
op
* sytsem access.
584
2021-07-07
op
*/
585
2021-10-02
op
586
2021-10-02
op
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1)
587
2021-10-02
op
fatal("%s: prctl(PR_SET_NO_NEW_PRIVS): %s",
588
2021-10-02
op
__func__, strerror(errno));
589
2021-09-19
op
590
2021-09-19
op
#if HAVE_LANDLOCK
591
2021-09-25
op
if (logger_landlock() == -1)
592
2021-09-25
op
fatal("%s: logger_landlock: %s",
593
2021-09-19
op
__func__, strerror(errno));
594
2021-09-19
op
#endif
595
2021-09-19
op
596
2021-03-20
op
return;
597
2021-03-20
op
}
598
2021-03-20
op
599
2021-01-15
op
#elif defined(__OpenBSD__)
600
2021-01-15
op
601
2021-01-15
op
#include <unistd.h>
602
2021-01-15
op
603
2021-01-15
op
void
604
2022-09-06
op
sandbox_server_process(int can_open_sockets)
605
2021-01-15
op
{
606
2021-04-30
op
struct vhost *h;
607
2021-04-30
op
struct location *l;
608
2021-01-15
op
609
2021-03-31
op
TAILQ_FOREACH(h, &hosts, vhosts) {
610
2021-04-30
op
TAILQ_FOREACH(l, &h->locations, locations) {
611
2022-10-05
op
if (*l->dir == '\0')
612
2021-04-30
op
continue;
613
2021-04-30
op
614
2021-04-30
op
if (unveil(l->dir, "r") == -1)
615
2021-04-30
op
fatal("unveil %s for domain %s",
616
2021-04-30
op
l->dir,
617
2021-04-30
op
h->domain);
618
2021-04-30
op
}
619
2021-01-15
op
}
620
2021-01-15
op
621
2022-09-06
op
if (pledge("stdio recvfd rpath inet dns", NULL) == -1)
622
2021-02-11
op
fatal("pledge");
623
2021-01-15
op
}
624
2021-01-15
op
625
2021-01-15
op
void
626
2021-03-20
op
sandbox_logger_process(void)
627
2021-03-20
op
{
628
2021-06-15
op
if (pledge("stdio recvfd", NULL) == -1)
629
2021-03-20
op
err(1, "pledge");
630
2021-03-20
op
}
631
2021-03-20
op
632
2021-03-20
op
#else
633
2021-03-20
op
634
2021-03-20
op
#warning "No sandbox method known for this OS"
635
2021-03-20
op
636
2021-03-20
op
void
637
2022-09-06
op
sandbox_server_process(int can_open_sockets)
638
2021-03-20
op
{
639
2021-03-20
op
return;
640
2021-03-20
op
}
641
2021-03-20
op
642
2021-03-20
op
void
643
2021-03-20
op
sandbox_logger_process(void)
644
2021-03-20
op
{
645
2021-03-20
op
return;
646
2021-03-20
op
}
647
2021-03-20
op
648
2021-01-15
op
#endif
Omar Polo