1e7ed5190SHan-Wen Nienhuys /*
2e7ed5190SHan-Wen Nienhuys * Copyright (c) 2017, Google, Inc.
3e7ed5190SHan-Wen Nienhuys *
4e7ed5190SHan-Wen Nienhuys * Author: Han-Wen Nienhuys <hanwen@google.com>
5e7ed5190SHan-Wen Nienhuys *
6e7ed5190SHan-Wen Nienhuys * This source code is released for free distribution under the terms of the
7e7ed5190SHan-Wen Nienhuys * GNU General Public License version 2 or (at your option) any later version.
8e7ed5190SHan-Wen Nienhuys *
9e7ed5190SHan-Wen Nienhuys */
10e7ed5190SHan-Wen Nienhuys
11286a4ccdSMasatake YAMATO #include "general.h"
123c130a08SMasatake YAMATO #include "debug.h"
1321996d92SMasatake YAMATO #include "interactive_p.h"
1429e40fb6SMasatake YAMATO #include "routines.h"
15e7ed5190SHan-Wen Nienhuys
161026e7b8SColomban Wendling #ifdef HAVE_SECCOMP
17e7ed5190SHan-Wen Nienhuys #include <seccomp.h>
184cbb68c8SMasatake YAMATO
19e7ed5190SHan-Wen Nienhuys
installSyscallFilter(void)20e7ed5190SHan-Wen Nienhuys int installSyscallFilter (void)
21e7ed5190SHan-Wen Nienhuys {
22e7ed5190SHan-Wen Nienhuys // Use SCMP_ACT_TRAP to get a core dump.
23e7ed5190SHan-Wen Nienhuys scmp_filter_ctx ctx = seccomp_init (SCMP_ACT_KILL);
24e7ed5190SHan-Wen Nienhuys if (ctx == NULL)
25e7ed5190SHan-Wen Nienhuys {
26e7ed5190SHan-Wen Nienhuys return 1;
27e7ed5190SHan-Wen Nienhuys }
28e7ed5190SHan-Wen Nienhuys
29e7ed5190SHan-Wen Nienhuys // Memory allocation.
30e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (mmap), 0);
313a6c6ff6SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (munmap), 0);
3270c51900SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (mremap), 0);
33e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (brk), 0);
34e7ed5190SHan-Wen Nienhuys
35e7ed5190SHan-Wen Nienhuys // I/O
36e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (read), 0);
37e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (write), 0);
38e7ed5190SHan-Wen Nienhuys
39e7ed5190SHan-Wen Nienhuys // Clean exit
40e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (exit), 0);
41e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (exit_group), 0);
42e7ed5190SHan-Wen Nienhuys
43e7ed5190SHan-Wen Nienhuys // The bowels of stdio want to know the size of a file, even for stdout.
44e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (fstat), 0);
45fb0c1973SAndreas Baumann seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (fstat64), 0);
46f827e85fSMasatake YAMATO #ifdef __SNR_newfstatat
47f827e85fSMasatake YAMATO seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (newfstatat), 0);
48f827e85fSMasatake YAMATO #endif
49*142a1d78SAthos Ribeiro #ifdef __SNR_statx
50*142a1d78SAthos Ribeiro // armhf fallback
51*142a1d78SAthos Ribeiro seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (statx), 0);
52*142a1d78SAthos Ribeiro #endif
53e7ed5190SHan-Wen Nienhuys
54e7ed5190SHan-Wen Nienhuys // seems unnecessary, but this comes from
55e7ed5190SHan-Wen Nienhuys // main/parse.c:2764 : tagFilePosition (&tagfpos);
56e7ed5190SHan-Wen Nienhuys seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (lseek), 0);
57fb0c1973SAndreas Baumann seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (_llseek), 0);
58e7ed5190SHan-Wen Nienhuys
59f384fdecSTobias Gruetzmacher // libxml2 uses pthread_once, which in turn uses a futex
60f384fdecSTobias Gruetzmacher seccomp_rule_add (ctx, SCMP_ACT_ALLOW, SCMP_SYS (futex), 0);
61f384fdecSTobias Gruetzmacher
624cbb68c8SMasatake YAMATO verbose ("Entering sandbox\n");
63e7ed5190SHan-Wen Nienhuys int err = seccomp_load (ctx);
64e7ed5190SHan-Wen Nienhuys if (err < 0)
65e7ed5190SHan-Wen Nienhuys {
664cbb68c8SMasatake YAMATO error (WARNING, "Failed to install syscall filter");
674cbb68c8SMasatake YAMATO /* Error handling is done in upper layer. */
68e7ed5190SHan-Wen Nienhuys }
69e7ed5190SHan-Wen Nienhuys
70e7ed5190SHan-Wen Nienhuys seccomp_release (ctx);
71e7ed5190SHan-Wen Nienhuys
72e7ed5190SHan-Wen Nienhuys return err;
73e7ed5190SHan-Wen Nienhuys }
74e7ed5190SHan-Wen Nienhuys
75e7ed5190SHan-Wen Nienhuys /*
76e7ed5190SHan-Wen Nienhuys TODO: on OSX, Seatbelt
77e7ed5190SHan-Wen Nienhuys (https://dev.chromium.org/developers/design-documents/sandbox/osx-sandboxing-design)
78e7ed5190SHan-Wen Nienhuys should be used for equivalent functionality.
79e7ed5190SHan-Wen Nienhuys */
803c130a08SMasatake YAMATO
813c130a08SMasatake YAMATO #else
installSyscallFilter(void)823c130a08SMasatake YAMATO int installSyscallFilter (void)
833c130a08SMasatake YAMATO {
843c130a08SMasatake YAMATO AssertNotReached ();
853c130a08SMasatake YAMATO return -1;
863c130a08SMasatake YAMATO }
87e7ed5190SHan-Wen Nienhuys #endif
88