Blame


1 dafb57b8 2021-01-15 op #include "gmid.h"
2 dafb57b8 2021-01-15 op
3 dafb57b8 2021-01-15 op #if defined(__FreeBSD__)
4 dafb57b8 2021-01-15 op
5 dafb57b8 2021-01-15 op #include <sys/capsicum.h>
6 dafb57b8 2021-01-15 op #include <err.h>
7 dafb57b8 2021-01-15 op
8 dafb57b8 2021-01-15 op void
9 dafb57b8 2021-01-15 op sandbox()
10 dafb57b8 2021-01-15 op {
11 dafb57b8 2021-01-15 op struct vhost *h;
12 dafb57b8 2021-01-15 op int has_cgi = 0;
13 dafb57b8 2021-01-15 op
14 dafb57b8 2021-01-15 op for (h = hosts; h->domain != NULL; ++h)
15 dafb57b8 2021-01-15 op if (h->cgi != NULL)
16 dafb57b8 2021-01-15 op has_cgi = 1;
17 dafb57b8 2021-01-15 op
18 dafb57b8 2021-01-15 op if (cap_enter() == -1)
19 dafb57b8 2021-01-15 op err(1, "cap_enter");
20 dafb57b8 2021-01-15 op }
21 dafb57b8 2021-01-15 op
22 dafb57b8 2021-01-15 op #elif defined(__linux__)
23 dafb57b8 2021-01-15 op
24 71b7eb2f 2021-01-17 op #include <sys/prctl.h>
25 71b7eb2f 2021-01-17 op #include <sys/syscall.h>
26 71b7eb2f 2021-01-17 op #include <sys/syscall.h>
27 71b7eb2f 2021-01-17 op #include <sys/types.h>
28 71b7eb2f 2021-01-17 op
29 71b7eb2f 2021-01-17 op #include <linux/audit.h>
30 71b7eb2f 2021-01-17 op #include <linux/filter.h>
31 71b7eb2f 2021-01-17 op #include <linux/seccomp.h>
32 71b7eb2f 2021-01-17 op
33 71b7eb2f 2021-01-17 op #include <errno.h>
34 71b7eb2f 2021-01-17 op #include <stddef.h>
35 71b7eb2f 2021-01-17 op #include <stdio.h>
36 71b7eb2f 2021-01-17 op #include <seccomp.h>
37 71b7eb2f 2021-01-17 op #include <string.h>
38 71b7eb2f 2021-01-17 op
39 71b7eb2f 2021-01-17 op /* thanks chromium' src/seccomp.c */
40 71b7eb2f 2021-01-17 op #if defined(__i386__)
41 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_I386
42 71b7eb2f 2021-01-17 op #elif defined(__x86_64__)
43 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_X86_64
44 71b7eb2f 2021-01-17 op #elif defined(__arm__)
45 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARM
46 71b7eb2f 2021-01-17 op #elif defined(__aarch64__)
47 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_AARCH64
48 71b7eb2f 2021-01-17 op #elif defined(__mips__)
49 71b7eb2f 2021-01-17 op # if defined(__mips64)
50 71b7eb2f 2021-01-17 op # if defined(__MIPSEB__)
51 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPS64
52 71b7eb2f 2021-01-17 op # else
53 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPSEL64
54 71b7eb2f 2021-01-17 op # endif
55 71b7eb2f 2021-01-17 op # else
56 71b7eb2f 2021-01-17 op # if defined(__MIPSEB__)
57 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPS
58 71b7eb2f 2021-01-17 op # else
59 71b7eb2f 2021-01-17 op # define SECCOMP_AUDIT_ARCH AUDIT_ARCH_MIPSEL
60 71b7eb2f 2021-01-17 op # endif
61 71b7eb2f 2021-01-17 op # endif
62 71b7eb2f 2021-01-17 op #else
63 71b7eb2f 2021-01-17 op # error "Platform does not support seccomp filter yet"
64 71b7eb2f 2021-01-17 op #endif
65 71b7eb2f 2021-01-17 op
66 71b7eb2f 2021-01-17 op /* uncomment to enable debugging. ONLY FOR DEVELOPMENT */
67 71b7eb2f 2021-01-17 op /* #define SC_DEBUG */
68 71b7eb2f 2021-01-17 op
69 71b7eb2f 2021-01-17 op #ifdef SC_DEBUG
70 71b7eb2f 2021-01-17 op # define SC_FAIL SECCOMP_RET_TRAP
71 71b7eb2f 2021-01-17 op #else
72 71b7eb2f 2021-01-17 op # define SC_FAIL SECCOMP_RET_KILL
73 71b7eb2f 2021-01-17 op #endif
74 71b7eb2f 2021-01-17 op
75 71b7eb2f 2021-01-17 op /* make the filter more readable */
76 71b7eb2f 2021-01-17 op #define SC_ALLOW(nr) \
77 71b7eb2f 2021-01-17 op BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_##nr, 0, 1), \
78 71b7eb2f 2021-01-17 op BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW)
79 71b7eb2f 2021-01-17 op
80 71b7eb2f 2021-01-17 op #ifdef SC_DEBUG
81 71b7eb2f 2021-01-17 op
82 71b7eb2f 2021-01-17 op #include <signal.h>
83 71b7eb2f 2021-01-17 op #include <unistd.h>
84 71b7eb2f 2021-01-17 op
85 71b7eb2f 2021-01-17 op static void
86 71b7eb2f 2021-01-17 op sandbox_seccomp_violation(int signum, siginfo_t *info, void *ctx)
87 71b7eb2f 2021-01-17 op {
88 71b7eb2f 2021-01-17 op (void)signum;
89 71b7eb2f 2021-01-17 op (void)ctx;
90 71b7eb2f 2021-01-17 op
91 71b7eb2f 2021-01-17 op fprintf(stderr, "%s: unexpected system call (arch:0x%x,syscall:%d @ %p)\n",
92 71b7eb2f 2021-01-17 op __func__, info->si_arch, info->si_syscall, info->si_call_addr);
93 71b7eb2f 2021-01-17 op _exit(1);
94 71b7eb2f 2021-01-17 op }
95 71b7eb2f 2021-01-17 op
96 71b7eb2f 2021-01-17 op static void
97 71b7eb2f 2021-01-17 op sandbox_seccomp_catch_sigsys(void)
98 71b7eb2f 2021-01-17 op {
99 71b7eb2f 2021-01-17 op struct sigaction act;
100 71b7eb2f 2021-01-17 op sigset_t mask;
101 71b7eb2f 2021-01-17 op
102 71b7eb2f 2021-01-17 op memset(&act, 0, sizeof(act));
103 71b7eb2f 2021-01-17 op sigemptyset(&mask);
104 71b7eb2f 2021-01-17 op sigaddset(&mask, SIGSYS);
105 71b7eb2f 2021-01-17 op
106 71b7eb2f 2021-01-17 op act.sa_sigaction = &sandbox_seccomp_violation;
107 71b7eb2f 2021-01-17 op act.sa_flags = SA_SIGINFO;
108 71b7eb2f 2021-01-17 op if (sigaction(SIGSYS, &act, NULL) == -1) {
109 71b7eb2f 2021-01-17 op fprintf(stderr, "%s: sigaction(SIGSYS): %s\n",
110 71b7eb2f 2021-01-17 op __func__, strerror(errno));
111 71b7eb2f 2021-01-17 op exit(1);
112 71b7eb2f 2021-01-17 op }
113 71b7eb2f 2021-01-17 op if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1) {
114 71b7eb2f 2021-01-17 op fprintf(stderr, "%s: sigprocmask(SIGSYS): %s\n",
115 71b7eb2f 2021-01-17 op __func__, strerror(errno));
116 71b7eb2f 2021-01-17 op exit(1);
117 71b7eb2f 2021-01-17 op }
118 71b7eb2f 2021-01-17 op }
119 71b7eb2f 2021-01-17 op #endif /* SC_DEBUG */
120 71b7eb2f 2021-01-17 op
121 dafb57b8 2021-01-15 op void
122 dafb57b8 2021-01-15 op sandbox()
123 dafb57b8 2021-01-15 op {
124 71b7eb2f 2021-01-17 op struct sock_filter filter[] = {
125 71b7eb2f 2021-01-17 op /* load the *current* architecture */
126 71b7eb2f 2021-01-17 op BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
127 71b7eb2f 2021-01-17 op (offsetof(struct seccomp_data, arch))),
128 71b7eb2f 2021-01-17 op /* ensure it's the same that we've been compiled on */
129 71b7eb2f 2021-01-17 op BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K,
130 71b7eb2f 2021-01-17 op SECCOMP_AUDIT_ARCH, 1, 0),
131 71b7eb2f 2021-01-17 op /* if not, kill the program */
132 71b7eb2f 2021-01-17 op BPF_STMT(BPF_RET | BPF_K, SC_FAIL),
133 71b7eb2f 2021-01-17 op
134 71b7eb2f 2021-01-17 op /* load the syscall number */
135 71b7eb2f 2021-01-17 op BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
136 71b7eb2f 2021-01-17 op (offsetof(struct seccomp_data, nr))),
137 71b7eb2f 2021-01-17 op
138 71b7eb2f 2021-01-17 op /* allow logging on stdout */
139 71b7eb2f 2021-01-17 op SC_ALLOW(write),
140 71b7eb2f 2021-01-17 op SC_ALLOW(writev),
141 71b7eb2f 2021-01-17 op SC_ALLOW(readv),
142 71b7eb2f 2021-01-17 op
143 71b7eb2f 2021-01-17 op /* these are used to serve the files. note how we
144 71b7eb2f 2021-01-17 op * allow openat but not open. */
145 71b7eb2f 2021-01-17 op SC_ALLOW(ppoll),
146 71b7eb2f 2021-01-17 op SC_ALLOW(accept),
147 71b7eb2f 2021-01-17 op SC_ALLOW(fcntl),
148 71b7eb2f 2021-01-17 op SC_ALLOW(read),
149 71b7eb2f 2021-01-17 op SC_ALLOW(openat),
150 71b7eb2f 2021-01-17 op SC_ALLOW(fstat),
151 71b7eb2f 2021-01-17 op SC_ALLOW(close),
152 71b7eb2f 2021-01-17 op SC_ALLOW(lseek),
153 71b7eb2f 2021-01-17 op SC_ALLOW(brk),
154 71b7eb2f 2021-01-17 op SC_ALLOW(mmap),
155 71b7eb2f 2021-01-17 op SC_ALLOW(munmap),
156 71b7eb2f 2021-01-17 op
157 71b7eb2f 2021-01-17 op /* we need recvmsg to receive fd */
158 71b7eb2f 2021-01-17 op SC_ALLOW(recvmsg),
159 71b7eb2f 2021-01-17 op
160 71b7eb2f 2021-01-17 op /* XXX: ??? */
161 71b7eb2f 2021-01-17 op SC_ALLOW(getpid),
162 71b7eb2f 2021-01-17 op
163 71b7eb2f 2021-01-17 op SC_ALLOW(exit),
164 71b7eb2f 2021-01-17 op SC_ALLOW(exit_group),
165 71b7eb2f 2021-01-17 op
166 71b7eb2f 2021-01-17 op /* allow ioctl but only on fd 1, glibc doing stuff? */
167 71b7eb2f 2021-01-17 op BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_ioctl, 0, 3),
168 71b7eb2f 2021-01-17 op BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
169 71b7eb2f 2021-01-17 op (offsetof(struct seccomp_data, args[0]))),
170 71b7eb2f 2021-01-17 op BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 0, 1),
171 71b7eb2f 2021-01-17 op BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),
172 71b7eb2f 2021-01-17 op
173 71b7eb2f 2021-01-17 op /* disallow enything else */
174 71b7eb2f 2021-01-17 op BPF_STMT(BPF_RET | BPF_K, SC_FAIL),
175 71b7eb2f 2021-01-17 op };
176 71b7eb2f 2021-01-17 op
177 71b7eb2f 2021-01-17 op struct sock_fprog prog = {
178 71b7eb2f 2021-01-17 op .len = (unsigned short) (sizeof(filter) / sizeof(filter[0])),
179 71b7eb2f 2021-01-17 op .filter = filter,
180 71b7eb2f 2021-01-17 op };
181 71b7eb2f 2021-01-17 op
182 71b7eb2f 2021-01-17 op #ifdef SC_DEBUG
183 71b7eb2f 2021-01-17 op sandbox_seccomp_catch_sigsys();
184 71b7eb2f 2021-01-17 op #endif
185 71b7eb2f 2021-01-17 op
186 71b7eb2f 2021-01-17 op if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
187 71b7eb2f 2021-01-17 op fprintf(stderr, "%s: prctl(PR_SET_NO_NEW_PRIVS): %s\n",
188 71b7eb2f 2021-01-17 op __func__, strerror(errno));
189 71b7eb2f 2021-01-17 op exit(1);
190 71b7eb2f 2021-01-17 op }
191 71b7eb2f 2021-01-17 op
192 71b7eb2f 2021-01-17 op if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) == -1) {
193 71b7eb2f 2021-01-17 op fprintf(stderr, "%s: prctl(PR_SET_SECCOMP): %s\n",
194 71b7eb2f 2021-01-17 op __func__, strerror(errno));
195 71b7eb2f 2021-01-17 op exit(1);
196 71b7eb2f 2021-01-17 op }
197 dafb57b8 2021-01-15 op }
198 dafb57b8 2021-01-15 op
199 dafb57b8 2021-01-15 op #elif defined(__OpenBSD__)
200 dafb57b8 2021-01-15 op
201 dafb57b8 2021-01-15 op #include <err.h>
202 dafb57b8 2021-01-15 op #include <unistd.h>
203 dafb57b8 2021-01-15 op
204 dafb57b8 2021-01-15 op void
205 dafb57b8 2021-01-15 op sandbox()
206 dafb57b8 2021-01-15 op {
207 dafb57b8 2021-01-15 op struct vhost *h;
208 dafb57b8 2021-01-15 op
209 dafb57b8 2021-01-15 op for (h = hosts; h->domain != NULL; ++h) {
210 dafb57b8 2021-01-15 op if (unveil(h->dir, "rx") == -1)
211 dafb57b8 2021-01-15 op err(1, "unveil %s for domain %s", h->dir, h->domain);
212 dafb57b8 2021-01-15 op }
213 dafb57b8 2021-01-15 op
214 881a9dd9 2021-01-16 op if (pledge("stdio recvfd rpath inet", NULL) == -1)
215 dafb57b8 2021-01-15 op err(1, "pledge");
216 dafb57b8 2021-01-15 op }
217 dafb57b8 2021-01-15 op
218 dafb57b8 2021-01-15 op #else
219 dafb57b8 2021-01-15 op
220 dafb57b8 2021-01-15 op void
221 dafb57b8 2021-01-15 op sandbox()
222 dafb57b8 2021-01-15 op {
223 dafb57b8 2021-01-15 op LOGN(NULL, "%s", "no sandbox method known for this OS");
224 dafb57b8 2021-01-15 op }
225 dafb57b8 2021-01-15 op
226 dafb57b8 2021-01-15 op #endif