| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/sandbox-seccomp-filter.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||
|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||
| 2 | * Copyright (c) 2012 Will Drewry <wad@dataspill.org> | - | ||||||
| 3 | * | - | ||||||
| 4 | * Permission to use, copy, modify, and distribute this software for any | - | ||||||
| 5 | * purpose with or without fee is hereby granted, provided that the above | - | ||||||
| 6 | * copyright notice and this permission notice appear in all copies. | - | ||||||
| 7 | * | - | ||||||
| 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | - | ||||||
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | - | ||||||
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | - | ||||||
| 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | - | ||||||
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | - | ||||||
| 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | - | ||||||
| 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | - | ||||||
| 15 | */ | - | ||||||
| 16 | - | |||||||
| 17 | /* | - | ||||||
| 18 | * Uncomment the SANDBOX_SECCOMP_FILTER_DEBUG macro below to help diagnose | - | ||||||
| 19 | * filter breakage during development. *Do not* use this in production, | - | ||||||
| 20 | * as it relies on making library calls that are unsafe in signal context. | - | ||||||
| 21 | * | - | ||||||
| 22 | * Instead, live systems the auditctl(8) may be used to monitor failures. | - | ||||||
| 23 | * E.g. | - | ||||||
| 24 | * auditctl -a task,always -F uid=<privsep uid> | - | ||||||
| 25 | */ | - | ||||||
| 26 | /* #define SANDBOX_SECCOMP_FILTER_DEBUG 1 */ | - | ||||||
| 27 | - | |||||||
| 28 | /* XXX it should be possible to do logging via the log socket safely */ | - | ||||||
| 29 | - | |||||||
| 30 | #ifdef SANDBOX_SECCOMP_FILTER_DEBUG | - | ||||||
| 31 | /* Use the kernel headers in case of an older toolchain. */ | - | ||||||
| 32 | # include <asm/siginfo.h> | - | ||||||
| 33 | # define __have_siginfo_t 1 | - | ||||||
| 34 | # define __have_sigval_t 1 | - | ||||||
| 35 | # define __have_sigevent_t 1 | - | ||||||
| 36 | #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ | - | ||||||
| 37 | - | |||||||
| 38 | #include "includes.h" | - | ||||||
| 39 | - | |||||||
| 40 | #ifdef SANDBOX_SECCOMP_FILTER | - | ||||||
| 41 | - | |||||||
| 42 | #include <sys/types.h> | - | ||||||
| 43 | #include <sys/resource.h> | - | ||||||
| 44 | #include <sys/prctl.h> | - | ||||||
| 45 | - | |||||||
| 46 | #include <linux/net.h> | - | ||||||
| 47 | #include <linux/audit.h> | - | ||||||
| 48 | #include <linux/filter.h> | - | ||||||
| 49 | #include <linux/seccomp.h> | - | ||||||
| 50 | #include <elf.h> | - | ||||||
| 51 | - | |||||||
| 52 | #include <asm/unistd.h> | - | ||||||
| 53 | #ifdef __s390__ | - | ||||||
| 54 | #include <asm/zcrypt.h> | - | ||||||
| 55 | #endif | - | ||||||
| 56 | - | |||||||
| 57 | #include <errno.h> | - | ||||||
| 58 | #include <signal.h> | - | ||||||
| 59 | #include <stdarg.h> | - | ||||||
| 60 | #include <stddef.h> /* for offsetof */ | - | ||||||
| 61 | #include <stdio.h> | - | ||||||
| 62 | #include <stdlib.h> | - | ||||||
| 63 | #include <string.h> | - | ||||||
| 64 | #include <unistd.h> | - | ||||||
| 65 | - | |||||||
| 66 | #include "log.h" | - | ||||||
| 67 | #include "ssh-sandbox.h" | - | ||||||
| 68 | #include "xmalloc.h" | - | ||||||
| 69 | - | |||||||
| 70 | /* Linux seccomp_filter sandbox */ | - | ||||||
| 71 | #define SECCOMP_FILTER_FAIL SECCOMP_RET_KILL | - | ||||||
| 72 | - | |||||||
| 73 | /* Use a signal handler to emit violations when debugging */ | - | ||||||
| 74 | #ifdef SANDBOX_SECCOMP_FILTER_DEBUG | - | ||||||
| 75 | # undef SECCOMP_FILTER_FAIL | - | ||||||
| 76 | # define SECCOMP_FILTER_FAIL SECCOMP_RET_TRAP | - | ||||||
| 77 | #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ | - | ||||||
| 78 | - | |||||||
| 79 | #if __BYTE_ORDER == __LITTLE_ENDIAN | - | ||||||
| 80 | # define ARG_LO_OFFSET 0 | - | ||||||
| 81 | # define ARG_HI_OFFSET sizeof(uint32_t) | - | ||||||
| 82 | #elif __BYTE_ORDER == __BIG_ENDIAN | - | ||||||
| 83 | # define ARG_LO_OFFSET sizeof(uint32_t) | - | ||||||
| 84 | # define ARG_HI_OFFSET 0 | - | ||||||
| 85 | #else | - | ||||||
| 86 | #error "Unknown endianness" | - | ||||||
| 87 | #endif | - | ||||||
| 88 | - | |||||||
| 89 | /* Simple helpers to avoid manual errors (but larger BPF programs). */ | - | ||||||
| 90 | #define SC_DENY(_nr, _errno) \ | - | ||||||
| 91 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 1), \ | - | ||||||
| 92 | BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ERRNO|(_errno)) | - | ||||||
| 93 | #define SC_ALLOW(_nr) \ | - | ||||||
| 94 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 1), \ | - | ||||||
| 95 | BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) | - | ||||||
| 96 | #define SC_ALLOW_ARG(_nr, _arg_nr, _arg_val) \ | - | ||||||
| 97 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (_nr), 0, 6), \ | - | ||||||
| 98 | /* load and test first syscall argument, low word */ \ | - | ||||||
| 99 | BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \ | - | ||||||
| 100 | offsetof(struct seccomp_data, args[(_arg_nr)]) + ARG_LO_OFFSET), \ | - | ||||||
| 101 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, \ | - | ||||||
| 102 | ((_arg_val) & 0xFFFFFFFF), 0, 3), \ | - | ||||||
| 103 | /* load and test first syscall argument, high word */ \ | - | ||||||
| 104 | BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \ | - | ||||||
| 105 | offsetof(struct seccomp_data, args[(_arg_nr)]) + ARG_HI_OFFSET), \ | - | ||||||
| 106 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, \ | - | ||||||
| 107 | (((uint32_t)((uint64_t)(_arg_val) >> 32)) & 0xFFFFFFFF), 0, 1), \ | - | ||||||
| 108 | BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW), \ | - | ||||||
| 109 | /* reload syscall number; all rules expect it in accumulator */ \ | - | ||||||
| 110 | BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \ | - | ||||||
| 111 | offsetof(struct seccomp_data, nr)) | - | ||||||
| 112 | - | |||||||
| 113 | /* Syscall filtering set for preauth. */ | - | ||||||
| 114 | static const struct sock_filter preauth_insns[] = { | - | ||||||
| 115 | /* Ensure the syscall arch convention is as expected. */ | - | ||||||
| 116 | BPF_STMT(BPF_LD+BPF_W+BPF_ABS, | - | ||||||
| 117 | offsetof(struct seccomp_data, arch)), | - | ||||||
| 118 | BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SECCOMP_AUDIT_ARCH, 1, 0), | - | ||||||
| 119 | BPF_STMT(BPF_RET+BPF_K, SECCOMP_FILTER_FAIL), | - | ||||||
| 120 | /* Load the syscall number for checking. */ | - | ||||||
| 121 | BPF_STMT(BPF_LD+BPF_W+BPF_ABS, | - | ||||||
| 122 | offsetof(struct seccomp_data, nr)), | - | ||||||
| 123 | - | |||||||
| 124 | /* Syscalls to non-fatally deny */ | - | ||||||
| 125 | #ifdef __NR_lstat | - | ||||||
| 126 | SC_DENY(__NR_lstat, EACCES), | - | ||||||
| 127 | #endif | - | ||||||
| 128 | #ifdef __NR_lstat64 | - | ||||||
| 129 | SC_DENY(__NR_lstat64, EACCES), | - | ||||||
| 130 | #endif | - | ||||||
| 131 | #ifdef __NR_fstat | - | ||||||
| 132 | SC_DENY(__NR_fstat, EACCES), | - | ||||||
| 133 | #endif | - | ||||||
| 134 | #ifdef __NR_fstat64 | - | ||||||
| 135 | SC_DENY(__NR_fstat64, EACCES), | - | ||||||
| 136 | #endif | - | ||||||
| 137 | #ifdef __NR_open | - | ||||||
| 138 | SC_DENY(__NR_open, EACCES), | - | ||||||
| 139 | #endif | - | ||||||
| 140 | #ifdef __NR_openat | - | ||||||
| 141 | SC_DENY(__NR_openat, EACCES), | - | ||||||
| 142 | #endif | - | ||||||
| 143 | #ifdef __NR_newfstatat | - | ||||||
| 144 | SC_DENY(__NR_newfstatat, EACCES), | - | ||||||
| 145 | #endif | - | ||||||
| 146 | #ifdef __NR_stat | - | ||||||
| 147 | SC_DENY(__NR_stat, EACCES), | - | ||||||
| 148 | #endif | - | ||||||
| 149 | #ifdef __NR_stat64 | - | ||||||
| 150 | SC_DENY(__NR_stat64, EACCES), | - | ||||||
| 151 | #endif | - | ||||||
| 152 | - | |||||||
| 153 | /* Syscalls to permit */ | - | ||||||
| 154 | #ifdef __NR_brk | - | ||||||
| 155 | SC_ALLOW(__NR_brk), | - | ||||||
| 156 | #endif | - | ||||||
| 157 | #ifdef __NR_clock_gettime | - | ||||||
| 158 | SC_ALLOW(__NR_clock_gettime), | - | ||||||
| 159 | #endif | - | ||||||
| 160 | #ifdef __NR_close | - | ||||||
| 161 | SC_ALLOW(__NR_close), | - | ||||||
| 162 | #endif | - | ||||||
| 163 | #ifdef __NR_exit | - | ||||||
| 164 | SC_ALLOW(__NR_exit), | - | ||||||
| 165 | #endif | - | ||||||
| 166 | #ifdef __NR_exit_group | - | ||||||
| 167 | SC_ALLOW(__NR_exit_group), | - | ||||||
| 168 | #endif | - | ||||||
| 169 | #ifdef __NR_futex | - | ||||||
| 170 | SC_ALLOW(__NR_futex), | - | ||||||
| 171 | #endif | - | ||||||
| 172 | #ifdef __NR_geteuid | - | ||||||
| 173 | SC_ALLOW(__NR_geteuid), | - | ||||||
| 174 | #endif | - | ||||||
| 175 | #ifdef __NR_geteuid32 | - | ||||||
| 176 | SC_ALLOW(__NR_geteuid32), | - | ||||||
| 177 | #endif | - | ||||||
| 178 | #ifdef __NR_getpgid | - | ||||||
| 179 | SC_ALLOW(__NR_getpgid), | - | ||||||
| 180 | #endif | - | ||||||
| 181 | #ifdef __NR_getpid | - | ||||||
| 182 | SC_ALLOW(__NR_getpid), | - | ||||||
| 183 | #endif | - | ||||||
| 184 | #ifdef __NR_getrandom | - | ||||||
| 185 | SC_ALLOW(__NR_getrandom), | - | ||||||
| 186 | #endif | - | ||||||
| 187 | #ifdef __NR_gettimeofday | - | ||||||
| 188 | SC_ALLOW(__NR_gettimeofday), | - | ||||||
| 189 | #endif | - | ||||||
| 190 | #ifdef __NR_getuid | - | ||||||
| 191 | SC_ALLOW(__NR_getuid), | - | ||||||
| 192 | #endif | - | ||||||
| 193 | #ifdef __NR_getuid32 | - | ||||||
| 194 | SC_ALLOW(__NR_getuid32), | - | ||||||
| 195 | #endif | - | ||||||
| 196 | #ifdef __NR_madvise | - | ||||||
| 197 | SC_ALLOW(__NR_madvise), | - | ||||||
| 198 | #endif | - | ||||||
| 199 | #ifdef __NR_mmap | - | ||||||
| 200 | SC_ALLOW(__NR_mmap), | - | ||||||
| 201 | #endif | - | ||||||
| 202 | #ifdef __NR_mmap2 | - | ||||||
| 203 | SC_ALLOW(__NR_mmap2), | - | ||||||
| 204 | #endif | - | ||||||
| 205 | #ifdef __NR_mremap | - | ||||||
| 206 | SC_ALLOW(__NR_mremap), | - | ||||||
| 207 | #endif | - | ||||||
| 208 | #ifdef __NR_munmap | - | ||||||
| 209 | SC_ALLOW(__NR_munmap), | - | ||||||
| 210 | #endif | - | ||||||
| 211 | #ifdef __NR_nanosleep | - | ||||||
| 212 | SC_ALLOW(__NR_nanosleep), | - | ||||||
| 213 | #endif | - | ||||||
| 214 | #ifdef __NR__newselect | - | ||||||
| 215 | SC_ALLOW(__NR__newselect), | - | ||||||
| 216 | #endif | - | ||||||
| 217 | #ifdef __NR_poll | - | ||||||
| 218 | SC_ALLOW(__NR_poll), | - | ||||||
| 219 | #endif | - | ||||||
| 220 | #ifdef __NR_pselect6 | - | ||||||
| 221 | SC_ALLOW(__NR_pselect6), | - | ||||||
| 222 | #endif | - | ||||||
| 223 | #ifdef __NR_read | - | ||||||
| 224 | SC_ALLOW(__NR_read), | - | ||||||
| 225 | #endif | - | ||||||
| 226 | #ifdef __NR_rt_sigprocmask | - | ||||||
| 227 | SC_ALLOW(__NR_rt_sigprocmask), | - | ||||||
| 228 | #endif | - | ||||||
| 229 | #ifdef __NR_select | - | ||||||
| 230 | SC_ALLOW(__NR_select), | - | ||||||
| 231 | #endif | - | ||||||
| 232 | #ifdef __NR_shutdown | - | ||||||
| 233 | SC_ALLOW(__NR_shutdown), | - | ||||||
| 234 | #endif | - | ||||||
| 235 | #ifdef __NR_sigprocmask | - | ||||||
| 236 | SC_ALLOW(__NR_sigprocmask), | - | ||||||
| 237 | #endif | - | ||||||
| 238 | #ifdef __NR_time | - | ||||||
| 239 | SC_ALLOW(__NR_time), | - | ||||||
| 240 | #endif | - | ||||||
| 241 | #ifdef __NR_write | - | ||||||
| 242 | SC_ALLOW(__NR_write), | - | ||||||
| 243 | #endif | - | ||||||
| 244 | #ifdef __NR_socketcall | - | ||||||
| 245 | SC_ALLOW_ARG(__NR_socketcall, 0, SYS_SHUTDOWN), | - | ||||||
| 246 | SC_DENY(__NR_socketcall, EACCES), | - | ||||||
| 247 | #endif | - | ||||||
| 248 | #if defined(__NR_ioctl) && defined(__s390__) | - | ||||||
| 249 | /* Allow ioctls for ICA crypto card on s390 */ | - | ||||||
| 250 | SC_ALLOW_ARG(__NR_ioctl, 1, Z90STAT_STATUS_MASK), | - | ||||||
| 251 | SC_ALLOW_ARG(__NR_ioctl, 1, ICARSAMODEXPO), | - | ||||||
| 252 | SC_ALLOW_ARG(__NR_ioctl, 1, ICARSACRT), | - | ||||||
| 253 | #endif | - | ||||||
| 254 | #if defined(__x86_64__) && defined(__ILP32__) && defined(__X32_SYSCALL_BIT) | - | ||||||
| 255 | /* | - | ||||||
| 256 | * On Linux x32, the clock_gettime VDSO falls back to the | - | ||||||
| 257 | * x86-64 syscall under some circumstances, e.g. | - | ||||||
| 258 | * https://bugs.debian.org/849923 | - | ||||||
| 259 | */ | - | ||||||
| 260 | SC_ALLOW(__NR_clock_gettime & ~__X32_SYSCALL_BIT), | - | ||||||
| 261 | #endif | - | ||||||
| 262 | - | |||||||
| 263 | /* Default deny */ | - | ||||||
| 264 | BPF_STMT(BPF_RET+BPF_K, SECCOMP_FILTER_FAIL), | - | ||||||
| 265 | }; | - | ||||||
| 266 | - | |||||||
| 267 | static const struct sock_fprog preauth_program = { | - | ||||||
| 268 | .len = (unsigned short)(sizeof(preauth_insns)/sizeof(preauth_insns[0])), | - | ||||||
| 269 | .filter = (struct sock_filter *)preauth_insns, | - | ||||||
| 270 | }; | - | ||||||
| 271 | - | |||||||
| 272 | struct ssh_sandbox { | - | ||||||
| 273 | pid_t child_pid; | - | ||||||
| 274 | }; | - | ||||||
| 275 | - | |||||||
| 276 | struct ssh_sandbox * | - | ||||||
| 277 | ssh_sandbox_init(struct monitor *monitor) | - | ||||||
| 278 | { | - | ||||||
| 279 | struct ssh_sandbox *box; | - | ||||||
| 280 | - | |||||||
| 281 | /* | - | ||||||
| 282 | * Strictly, we don't need to maintain any state here but we need | - | ||||||
| 283 | * to return non-NULL to satisfy the API. | - | ||||||
| 284 | */ | - | ||||||
| 285 | debug3("%s: preparing seccomp filter sandbox", __func__); | - | ||||||
| 286 | box = xcalloc(1, sizeof(*box)); | - | ||||||
| 287 | box->child_pid = 0; | - | ||||||
| 288 | - | |||||||
| 289 | return box; never executed: return box; | 0 | ||||||
| 290 | } | - | ||||||
| 291 | - | |||||||
| 292 | #ifdef SANDBOX_SECCOMP_FILTER_DEBUG | - | ||||||
| 293 | extern struct monitor *pmonitor; | - | ||||||
| 294 | void mm_log_handler(LogLevel level, const char *msg, void *ctx); | - | ||||||
| 295 | - | |||||||
| 296 | static void | - | ||||||
| 297 | ssh_sandbox_violation(int signum, siginfo_t *info, void *void_context) | - | ||||||
| 298 | { | - | ||||||
| 299 | char msg[256]; | - | ||||||
| 300 | - | |||||||
| 301 | snprintf(msg, sizeof(msg), | - | ||||||
| 302 | "%s: unexpected system call (arch:0x%x,syscall:%d @ %p)", | - | ||||||
| 303 | __func__, info->si_arch, info->si_syscall, info->si_call_addr); | - | ||||||
| 304 | mm_log_handler(SYSLOG_LEVEL_FATAL, msg, pmonitor); | - | ||||||
| 305 | _exit(1); | - | ||||||
| 306 | } | - | ||||||
| 307 | - | |||||||
| 308 | static void | - | ||||||
| 309 | ssh_sandbox_child_debugging(void) | - | ||||||
| 310 | { | - | ||||||
| 311 | struct sigaction act; | - | ||||||
| 312 | sigset_t mask; | - | ||||||
| 313 | - | |||||||
| 314 | debug3("%s: installing SIGSYS handler", __func__); | - | ||||||
| 315 | memset(&act, 0, sizeof(act)); | - | ||||||
| 316 | sigemptyset(&mask); | - | ||||||
| 317 | sigaddset(&mask, SIGSYS); | - | ||||||
| 318 | - | |||||||
| 319 | act.sa_sigaction = &ssh_sandbox_violation; | - | ||||||
| 320 | act.sa_flags = SA_SIGINFO; | - | ||||||
| 321 | if (sigaction(SIGSYS, &act, NULL) == -1) | - | ||||||
| 322 | fatal("%s: sigaction(SIGSYS): %s", __func__, strerror(errno)); | - | ||||||
| 323 | if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1) | - | ||||||
| 324 | fatal("%s: sigprocmask(SIGSYS): %s", | - | ||||||
| 325 | __func__, strerror(errno)); | - | ||||||
| 326 | } | - | ||||||
| 327 | #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ | - | ||||||
| 328 | - | |||||||
| 329 | void | - | ||||||
| 330 | ssh_sandbox_child(struct ssh_sandbox *box) | - | ||||||
| 331 | { | - | ||||||
| 332 | struct rlimit rl_zero; | - | ||||||
| 333 | int nnp_failed = 0; | - | ||||||
| 334 | - | |||||||
| 335 | /* Set rlimits for completeness if possible. */ | - | ||||||
| 336 | rl_zero.rlim_cur = rl_zero.rlim_max = 0; | - | ||||||
| 337 | if (setrlimit(RLIMIT_FSIZE, &rl_zero) == -1)
| 0 | ||||||
| 338 | fatal("%s: setrlimit(RLIMIT_FSIZE, { 0, 0 }): %s", never executed: fatal("%s: setrlimit(RLIMIT_FSIZE, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 339 | __func__, strerror(errno)); never executed: fatal("%s: setrlimit(RLIMIT_FSIZE, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 340 | if (setrlimit(RLIMIT_NOFILE, &rl_zero) == -1)
| 0 | ||||||
| 341 | fatal("%s: setrlimit(RLIMIT_NOFILE, { 0, 0 }): %s", never executed: fatal("%s: setrlimit(RLIMIT_NOFILE, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 342 | __func__, strerror(errno)); never executed: fatal("%s: setrlimit(RLIMIT_NOFILE, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 343 | if (setrlimit(RLIMIT_NPROC, &rl_zero) == -1)
| 0 | ||||||
| 344 | fatal("%s: setrlimit(RLIMIT_NPROC, { 0, 0 }): %s", never executed: fatal("%s: setrlimit(RLIMIT_NPROC, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 345 | __func__, strerror(errno)); never executed: fatal("%s: setrlimit(RLIMIT_NPROC, { 0, 0 }): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 346 | - | |||||||
| 347 | #ifdef SANDBOX_SECCOMP_FILTER_DEBUG | - | ||||||
| 348 | ssh_sandbox_child_debugging(); | - | ||||||
| 349 | #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ | - | ||||||
| 350 | - | |||||||
| 351 | debug3("%s: setting PR_SET_NO_NEW_PRIVS", __func__); | - | ||||||
| 352 | if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
| 0 | ||||||
| 353 | debug("%s: prctl(PR_SET_NO_NEW_PRIVS): %s", | - | ||||||
| 354 | __func__, strerror(errno)); | - | ||||||
| 355 | nnp_failed = 1; | - | ||||||
| 356 | } never executed: end of block | 0 | ||||||
| 357 | debug3("%s: attaching seccomp filter program", __func__); | - | ||||||
| 358 | if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &preauth_program) == -1)
| 0 | ||||||
| 359 | debug("%s: prctl(PR_SET_SECCOMP): %s", never executed: debug("%s: prctl(PR_SET_SECCOMP): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 360 | __func__, strerror(errno)); never executed: debug("%s: prctl(PR_SET_SECCOMP): %s", __func__, strerror( (*__errno_location ()) )); | 0 | ||||||
| 361 | else if (nnp_failed)
| 0 | ||||||
| 362 | fatal("%s: SECCOMP_MODE_FILTER activated but " never executed: fatal("%s: SECCOMP_MODE_FILTER activated but " "PR_SET_NO_NEW_PRIVS failed", __func__); | 0 | ||||||
| 363 | "PR_SET_NO_NEW_PRIVS failed", __func__); never executed: fatal("%s: SECCOMP_MODE_FILTER activated but " "PR_SET_NO_NEW_PRIVS failed", __func__); | 0 | ||||||
| 364 | } never executed: end of block | 0 | ||||||
| 365 | - | |||||||
| 366 | void | - | ||||||
| 367 | ssh_sandbox_parent_finish(struct ssh_sandbox *box) | - | ||||||
| 368 | { | - | ||||||
| 369 | free(box); | - | ||||||
| 370 | debug3("%s: finished", __func__); | - | ||||||
| 371 | } never executed: end of block | 0 | ||||||
| 372 | - | |||||||
| 373 | void | - | ||||||
| 374 | ssh_sandbox_parent_preauth(struct ssh_sandbox *box, pid_t child_pid) | - | ||||||
| 375 | { | - | ||||||
| 376 | box->child_pid = child_pid; | - | ||||||
| 377 | } never executed: end of block | 0 | ||||||
| 378 | - | |||||||
| 379 | #endif /* SANDBOX_SECCOMP_FILTER */ | - | ||||||
| Source code | Switch to Preprocessed file |