1 /* seccomp_bpf_tests.c 2 * Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 3 * Use of this source code is governed by a BSD-style license that can be 4 * found in the LICENSE file. 5 * 6 * Test code for seccomp bpf. 7 */ 8 9 #include <asm/siginfo.h> 10 #define __have_siginfo_t 1 11 #define __have_sigval_t 1 12 #define __have_sigevent_t 1 13 14 #include <errno.h> 15 #include <linux/filter.h> 16 #include <sys/prctl.h> 17 #include <sys/ptrace.h> 18 #include <sys/user.h> 19 #include <linux/prctl.h> 20 #include <linux/ptrace.h> 21 #include <linux/seccomp.h> 22 #include <pthread.h> 23 #include <semaphore.h> 24 #include <signal.h> 25 #include <stddef.h> 26 #include <stdbool.h> 27 #include <string.h> 28 #include <linux/elf.h> 29 #include <sys/uio.h> 30 #include <sys/utsname.h> 31 #include <fcntl.h> // ANDROID 32 #include <sys/mman.h> 33 #include <sys/times.h> 34 35 #define _GNU_SOURCE 36 #include <unistd.h> 37 #include <sys/syscall.h> 38 39 #include "test_harness.h" 40 41 #ifndef PR_SET_PTRACER 42 # define PR_SET_PTRACER 0x59616d61 43 #endif 44 45 #ifndef PR_SET_NO_NEW_PRIVS 46 #define PR_SET_NO_NEW_PRIVS 38 47 #define PR_GET_NO_NEW_PRIVS 39 48 #endif 49 50 #ifndef PR_SECCOMP_EXT 51 #define PR_SECCOMP_EXT 43 52 #endif 53 54 #ifndef SECCOMP_EXT_ACT 55 #define SECCOMP_EXT_ACT 1 56 #endif 57 58 #ifndef SECCOMP_EXT_ACT_TSYNC 59 #define SECCOMP_EXT_ACT_TSYNC 1 60 #endif 61 62 #ifndef SECCOMP_MODE_STRICT 63 #define SECCOMP_MODE_STRICT 1 64 #endif 65 66 #ifndef SECCOMP_MODE_FILTER 67 #define SECCOMP_MODE_FILTER 2 68 #endif 69 70 #ifndef SECCOMP_RET_KILL 71 #define SECCOMP_RET_KILL 0x00000000U // kill the task immediately 72 #define SECCOMP_RET_TRAP 0x00030000U // disallow and force a SIGSYS 73 #define SECCOMP_RET_ERRNO 0x00050000U // returns an errno 74 #define SECCOMP_RET_TRACE 0x7ff00000U // pass to a tracer or disallow 75 #define SECCOMP_RET_ALLOW 0x7fff0000U // allow 76 77 /* Masks for the return value sections. */ 78 #define SECCOMP_RET_ACTION 0x7fff0000U 79 #define SECCOMP_RET_DATA 0x0000ffffU 80 81 struct seccomp_data { 82 int nr; 83 __u32 arch; 84 __u64 instruction_pointer; 85 __u64 args[6]; 86 }; 87 #endif 88 89 #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n])) 90 91 #define SIBLING_EXIT_UNKILLED 0xbadbeef 92 #define SIBLING_EXIT_FAILURE 0xbadface 93 #define SIBLING_EXIT_NEWPRIVS 0xbadfeed 94 95 TEST(mode_strict_support) { 96 long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL); 97 ASSERT_EQ(0, ret) { 98 TH_LOG("Kernel does not support CONFIG_SECCOMP"); 99 } 100 syscall(__NR_exit, 1); 101 } 102 103 TEST_SIGNAL(mode_strict_cannot_call_prctl, SIGKILL) { 104 long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL); 105 ASSERT_EQ(0, ret) { 106 TH_LOG("Kernel does not support CONFIG_SECCOMP"); 107 } 108 syscall(__NR_prctl, PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL); 109 EXPECT_FALSE(true) { 110 TH_LOG("Unreachable!"); 111 } 112 } 113 114 /* Note! This doesn't test no new privs behavior */ 115 TEST(no_new_privs_support) { 116 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 117 EXPECT_EQ(0, ret) { 118 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 119 } 120 } 121 122 /* Tests kernel support by checking for a copy_from_user() fault on * NULL. */ 123 TEST(mode_filter_support) { 124 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0); 125 ASSERT_EQ(0, ret) { 126 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 127 } 128 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL); 129 EXPECT_EQ(-1, ret); 130 EXPECT_EQ(EFAULT, errno) { 131 TH_LOG("Kernel does not support CONFIG_SECCOMP_FILTER!"); 132 } 133 } 134 135 TEST(mode_filter_without_nnp) { 136 struct sock_filter filter[] = { 137 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 138 }; 139 struct sock_fprog prog = { 140 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 141 .filter = filter, 142 }; 143 long ret = prctl(PR_GET_NO_NEW_PRIVS, 0, NULL, 0, 0); 144 ASSERT_LE(0, ret) { 145 TH_LOG("Expected 0 or unsupported for NO_NEW_PRIVS"); 146 } 147 errno = 0; 148 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 149 /* Succeeds with CAP_SYS_ADMIN, fails without */ 150 /* TODO(wad) check caps not euid */ 151 if (geteuid()) { 152 EXPECT_EQ(-1, ret); 153 EXPECT_EQ(EACCES, errno); 154 } else { 155 EXPECT_EQ(0, ret); 156 } 157 } 158 159 #define MAX_INSNS_PER_PATH 32768 160 161 TEST(filter_size_limits) { 162 int i; 163 int count = BPF_MAXINSNS + 1; 164 struct sock_filter allow[] = { 165 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 166 }; 167 struct sock_filter *filter; 168 struct sock_fprog prog = { }; 169 170 filter = calloc(count, sizeof(*filter)); 171 ASSERT_NE(NULL, filter); 172 173 for (i = 0; i < count; i++) { 174 filter[i] = allow[0]; 175 } 176 177 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 178 ASSERT_EQ(0, ret); 179 180 prog.filter = filter; 181 prog.len = count; 182 183 /* Too many filter instructions in a single filter. */ 184 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 185 ASSERT_NE(0, ret) { 186 TH_LOG("Installing %d insn filter was allowed", prog.len); 187 } 188 189 /* One less is okay, though. */ 190 prog.len -= 1; 191 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 192 ASSERT_EQ(0, ret) { 193 TH_LOG("Installing %d insn filter wasn't allowed", prog.len); 194 } 195 } 196 197 TEST(filter_chain_limits) { 198 int i; 199 int count = BPF_MAXINSNS; 200 struct sock_filter allow[] = { 201 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 202 }; 203 struct sock_filter *filter; 204 struct sock_fprog prog = { }; 205 206 filter = calloc(count, sizeof(*filter)); 207 ASSERT_NE(NULL, filter); 208 209 for (i = 0; i < count; i++) { 210 filter[i] = allow[0]; 211 } 212 213 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 214 ASSERT_EQ(0, ret); 215 216 prog.filter = filter; 217 prog.len = 1; 218 219 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 220 ASSERT_EQ(0, ret); 221 222 prog.len = count; 223 224 /* Too many total filter instructions. */ 225 for (i = 0; i < MAX_INSNS_PER_PATH; i++) { 226 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 227 if (ret != 0) 228 break; 229 } 230 ASSERT_NE(0, ret) { 231 TH_LOG("Allowed %d %d-insn filters (total with penalties:%d)", 232 i, count, i * (count + 4)); 233 } 234 } 235 236 TEST(mode_filter_cannot_move_to_strict) { 237 struct sock_filter filter[] = { 238 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 239 }; 240 struct sock_fprog prog = { 241 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 242 .filter = filter, 243 }; 244 245 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 246 ASSERT_EQ(0, ret); 247 248 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 249 ASSERT_EQ(0, ret); 250 251 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, 0, 0); 252 EXPECT_EQ(-1, ret); 253 EXPECT_EQ(EINVAL, errno); 254 } 255 256 257 TEST(mode_filter_get_seccomp) { 258 struct sock_filter filter[] = { 259 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 260 }; 261 struct sock_fprog prog = { 262 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 263 .filter = filter, 264 }; 265 266 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 267 ASSERT_EQ(0, ret); 268 269 ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0); 270 EXPECT_EQ(0, ret); 271 272 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 273 ASSERT_EQ(0, ret); 274 275 ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0); 276 EXPECT_EQ(2, ret); 277 } 278 279 280 TEST(ALLOW_all) { 281 struct sock_filter filter[] = { 282 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 283 }; 284 struct sock_fprog prog = { 285 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 286 .filter = filter, 287 }; 288 289 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 290 ASSERT_EQ(0, ret); 291 292 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 293 ASSERT_EQ(0, ret); 294 } 295 296 TEST(empty_prog) { 297 struct sock_filter filter[] = { 298 }; 299 struct sock_fprog prog = { 300 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 301 .filter = filter, 302 }; 303 304 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 305 ASSERT_EQ(0, ret); 306 307 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 308 EXPECT_EQ(-1, ret); 309 EXPECT_EQ(EINVAL, errno); 310 } 311 312 TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS) { 313 struct sock_filter filter[] = { 314 BPF_STMT(BPF_RET|BPF_K, 0x10000000U), 315 }; 316 struct sock_fprog prog = { 317 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 318 .filter = filter, 319 }; 320 321 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 322 ASSERT_EQ(0, ret); 323 324 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 325 ASSERT_EQ(0, ret); 326 EXPECT_EQ(0, syscall(__NR_getpid)) { 327 TH_LOG("getpid() shouldn't ever return"); 328 } 329 } 330 331 /* return code >= 0x80000000 is unused. */ 332 TEST_SIGNAL(unknown_ret_is_kill_above_allow, SIGSYS) { 333 struct sock_filter filter[] = { 334 BPF_STMT(BPF_RET|BPF_K, 0x90000000U), 335 }; 336 struct sock_fprog prog = { 337 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 338 .filter = filter, 339 }; 340 341 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 342 ASSERT_EQ(0, ret); 343 344 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 345 ASSERT_EQ(0, ret); 346 EXPECT_EQ(0, syscall(__NR_getpid)) { 347 TH_LOG("getpid() shouldn't ever return"); 348 } 349 } 350 351 TEST_SIGNAL(KILL_all, SIGSYS) { 352 struct sock_filter filter[] = { 353 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 354 }; 355 struct sock_fprog prog = { 356 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 357 .filter = filter, 358 }; 359 360 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 361 ASSERT_EQ(0, ret); 362 363 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 364 ASSERT_EQ(0, ret); 365 } 366 367 TEST_SIGNAL(KILL_one, SIGSYS) { 368 struct sock_filter filter[] = { 369 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 370 offsetof(struct seccomp_data, nr)), 371 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1), 372 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 373 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 374 }; 375 struct sock_fprog prog = { 376 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 377 .filter = filter, 378 }; 379 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 380 pid_t parent = getppid(); 381 ASSERT_EQ(0, ret); 382 383 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 384 ASSERT_EQ(0, ret); 385 386 EXPECT_EQ(parent, syscall(__NR_getppid)); 387 /* getpid() should never return. */ 388 EXPECT_EQ(0, syscall(__NR_getpid)); 389 } 390 391 TEST_SIGNAL(KILL_one_arg_one, SIGSYS) { 392 void *fatal_address; 393 struct sock_filter filter[] = { 394 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 395 offsetof(struct seccomp_data, nr)), 396 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_times, 1, 0), 397 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 398 /* Only both with lower 32-bit for now. */ 399 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)), 400 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 401 (unsigned long)&fatal_address, 0, 1), 402 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 403 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 404 }; 405 struct sock_fprog prog = { 406 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 407 .filter = filter, 408 }; 409 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 410 pid_t parent = getppid(); 411 struct tms timebuf; 412 clock_t clock = times(&timebuf); 413 ASSERT_EQ(0, ret); 414 415 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 416 ASSERT_EQ(0, ret); 417 418 EXPECT_EQ(parent, syscall(__NR_getppid)); 419 EXPECT_LE(clock, syscall(__NR_times, &timebuf)); 420 /* times() should never return. */ 421 EXPECT_EQ(0, syscall(__NR_times, &fatal_address)); 422 } 423 424 TEST_SIGNAL(KILL_one_arg_six, SIGSYS) { 425 #ifndef __NR_mmap2 426 int sysno = __NR_mmap; 427 #else 428 int sysno = __NR_mmap2; 429 #endif 430 struct sock_filter filter[] = { 431 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 432 offsetof(struct seccomp_data, nr)), 433 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, sysno, 1, 0), 434 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 435 /* Only both with lower 32-bit for now. */ 436 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)), 437 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1), 438 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 439 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 440 }; 441 struct sock_fprog prog = { 442 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 443 .filter = filter, 444 }; 445 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 446 pid_t parent = getppid(); 447 int fd; 448 void *map1, *map2; 449 ASSERT_EQ(0, ret); 450 451 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 452 ASSERT_EQ(0, ret); 453 454 fd = open("/dev/zero", O_RDONLY); 455 ASSERT_NE(-1, fd); 456 457 EXPECT_EQ(parent, syscall(__NR_getppid)); 458 map1 = (void *)syscall(sysno, 459 NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, PAGE_SIZE); 460 EXPECT_NE(MAP_FAILED, map1); 461 /* mmap2() should never return. */ 462 map2 = (void *)syscall(sysno, 463 NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x0C0FFEE); 464 EXPECT_EQ(MAP_FAILED, map2); 465 466 /* The test failed, so clean up the resources. */ 467 munmap(map1, PAGE_SIZE); 468 munmap(map2, PAGE_SIZE); 469 close(fd); 470 } 471 472 /* TODO(wad) add 64-bit versus 32-bit arg tests. */ 473 474 TEST(arg_out_of_range) { 475 struct sock_filter filter[] = { 476 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(6)), 477 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 478 }; 479 struct sock_fprog prog = { 480 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 481 .filter = filter, 482 }; 483 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 484 ASSERT_EQ(0, ret); 485 486 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 487 EXPECT_EQ(-1, ret); 488 EXPECT_EQ(EINVAL, errno); 489 } 490 491 TEST(ERRNO_one) { 492 struct sock_filter filter[] = { 493 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 494 offsetof(struct seccomp_data, nr)), 495 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), 496 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG), 497 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 498 }; 499 struct sock_fprog prog = { 500 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 501 .filter = filter, 502 }; 503 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 504 pid_t parent = getppid(); 505 ASSERT_EQ(0, ret); 506 507 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 508 ASSERT_EQ(0, ret); 509 510 EXPECT_EQ(parent, syscall(__NR_getppid)); 511 EXPECT_EQ(-1, read(0, NULL, 0)); 512 EXPECT_EQ(E2BIG, errno); 513 } 514 515 TEST(ERRNO_one_ok) { 516 struct sock_filter filter[] = { 517 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 518 offsetof(struct seccomp_data, nr)), 519 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), 520 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0), 521 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 522 }; 523 struct sock_fprog prog = { 524 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 525 .filter = filter, 526 }; 527 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 528 pid_t parent = getppid(); 529 ASSERT_EQ(0, ret); 530 531 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); 532 ASSERT_EQ(0, ret); 533 534 EXPECT_EQ(parent, syscall(__NR_getppid)); 535 /* "errno" of 0 is ok. */ 536 EXPECT_EQ(0, read(0, NULL, 0)); 537 } 538 539 FIXTURE_DATA(TRAP) { 540 struct sock_fprog prog; 541 }; 542 543 FIXTURE_SETUP(TRAP) { 544 struct sock_filter filter[] = { 545 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 546 offsetof(struct seccomp_data, nr)), 547 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1), 548 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP), 549 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 550 }; 551 memset(&self->prog, 0, sizeof(self->prog)); 552 self->prog.filter = malloc(sizeof(filter)); 553 ASSERT_NE(NULL, self->prog.filter); 554 memcpy(self->prog.filter, filter, sizeof(filter)); 555 self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])); 556 } 557 558 FIXTURE_TEARDOWN(TRAP) { 559 if (self->prog.filter) 560 free(self->prog.filter); 561 }; 562 563 TEST_F_SIGNAL(TRAP, dfl, SIGSYS) { 564 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 565 ASSERT_EQ(0, ret); 566 567 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog); 568 ASSERT_EQ(0, ret); 569 syscall(__NR_getpid); 570 } 571 572 /* Ensure that SIGSYS overrides SIG_IGN */ 573 TEST_F_SIGNAL(TRAP, ign, SIGSYS) { 574 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 575 ASSERT_EQ(0, ret); 576 577 signal(SIGSYS, SIG_IGN); 578 579 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog); 580 ASSERT_EQ(0, ret); 581 syscall(__NR_getpid); 582 } 583 584 static struct siginfo TRAP_info; 585 static volatile int TRAP_nr; 586 static void TRAP_action(int nr, siginfo_t *info, void *void_context) 587 { 588 memcpy(&TRAP_info, info, sizeof(TRAP_info)); 589 TRAP_nr = nr; 590 return; 591 } 592 593 TEST_F(TRAP, handler) { 594 int ret, test; 595 struct sigaction act; 596 sigset_t mask; 597 memset(&act, 0, sizeof(act)); 598 sigemptyset(&mask); 599 sigaddset(&mask, SIGSYS); 600 601 act.sa_sigaction = &TRAP_action; 602 act.sa_flags = SA_SIGINFO; 603 ret = sigaction(SIGSYS, &act, NULL); 604 ASSERT_EQ(0, ret) { 605 TH_LOG("sigaction failed"); 606 } 607 ret = sigprocmask(SIG_UNBLOCK, &mask, NULL); 608 ASSERT_EQ(0, ret) { 609 TH_LOG("sigprocmask failed"); 610 } 611 612 ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 613 ASSERT_EQ(0, ret); 614 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog); 615 ASSERT_EQ(0, ret); 616 TRAP_nr = 0; 617 memset(&TRAP_info, 0, sizeof(TRAP_info)); 618 /* Expect the registers to be rolled back. (nr = error) may vary 619 * based on arch. */ 620 ret = syscall(__NR_getpid); 621 /* Silence gcc warning about volatile. */ 622 test = TRAP_nr; 623 EXPECT_EQ(SIGSYS, test); 624 struct local_sigsys { 625 void *_call_addr; /* calling user insn */ 626 int _syscall; /* triggering system call number */ 627 unsigned int _arch; /* AUDIT_ARCH_* of syscall */ 628 } *sigsys = (struct local_sigsys *) 629 #ifdef si_syscall 630 &(TRAP_info.si_call_addr); 631 #else 632 &TRAP_info.si_pid; 633 #endif 634 EXPECT_EQ(__NR_getpid, sigsys->_syscall); 635 /* Make sure arch is non-zero. */ 636 EXPECT_NE(0, sigsys->_arch); 637 EXPECT_NE(0, (unsigned long)sigsys->_call_addr); 638 } 639 640 FIXTURE_DATA(precedence) { 641 struct sock_fprog allow; 642 struct sock_fprog trace; 643 struct sock_fprog error; 644 struct sock_fprog trap; 645 struct sock_fprog kill; 646 }; 647 648 FIXTURE_SETUP(precedence) { 649 struct sock_filter allow_insns[] = { 650 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 651 }; 652 struct sock_filter trace_insns[] = { 653 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 654 offsetof(struct seccomp_data, nr)), 655 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0), 656 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 657 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE), 658 }; 659 struct sock_filter error_insns[] = { 660 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 661 offsetof(struct seccomp_data, nr)), 662 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0), 663 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 664 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO), 665 }; 666 struct sock_filter trap_insns[] = { 667 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 668 offsetof(struct seccomp_data, nr)), 669 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0), 670 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 671 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP), 672 }; 673 struct sock_filter kill_insns[] = { 674 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 675 offsetof(struct seccomp_data, nr)), 676 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0), 677 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 678 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 679 }; 680 memset(self, 0, sizeof(*self)); 681 #define FILTER_ALLOC(_x) \ 682 self->_x.filter = malloc(sizeof(_x##_insns)); \ 683 ASSERT_NE(NULL, self->_x.filter); \ 684 memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \ 685 self->_x.len = (unsigned short)(sizeof(_x##_insns)/sizeof(_x##_insns[0])) 686 FILTER_ALLOC(allow); 687 FILTER_ALLOC(trace); 688 FILTER_ALLOC(error); 689 FILTER_ALLOC(trap); 690 FILTER_ALLOC(kill); 691 } 692 693 FIXTURE_TEARDOWN(precedence) { 694 #define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter) 695 FILTER_FREE(allow); 696 FILTER_FREE(trace); 697 FILTER_FREE(error); 698 FILTER_FREE(trap); 699 FILTER_FREE(kill); 700 } 701 702 TEST_F(precedence, allow_ok) { 703 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 704 pid_t parent = getppid(); 705 pid_t res = 0; 706 ASSERT_EQ(0, ret); 707 708 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 709 ASSERT_EQ(0, ret); 710 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 711 ASSERT_EQ(0, ret); 712 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 713 ASSERT_EQ(0, ret); 714 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); 715 ASSERT_EQ(0, ret); 716 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill); 717 ASSERT_EQ(0, ret); 718 /* Should work just fine. */ 719 res = syscall(__NR_getppid); 720 EXPECT_EQ(parent, res); 721 } 722 723 TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS) { 724 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 725 pid_t parent = getppid(); 726 pid_t res = 0; 727 ASSERT_EQ(0, ret); 728 729 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 730 ASSERT_EQ(0, ret); 731 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 732 ASSERT_EQ(0, ret); 733 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 734 ASSERT_EQ(0, ret); 735 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); 736 ASSERT_EQ(0, ret); 737 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill); 738 ASSERT_EQ(0, ret); 739 /* Should work just fine. */ 740 res = syscall(__NR_getppid); 741 EXPECT_EQ(parent, res); 742 /* getpid() should never return. */ 743 res = syscall(__NR_getpid); 744 EXPECT_EQ(0, res); 745 } 746 747 TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS) { 748 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 749 pid_t parent = getppid(); 750 ASSERT_EQ(0, ret); 751 752 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 753 ASSERT_EQ(0, ret); 754 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill); 755 ASSERT_EQ(0, ret); 756 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 757 ASSERT_EQ(0, ret); 758 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 759 ASSERT_EQ(0, ret); 760 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); 761 ASSERT_EQ(0, ret); 762 /* Should work just fine. */ 763 EXPECT_EQ(parent, syscall(__NR_getppid)); 764 /* getpid() should never return. */ 765 EXPECT_EQ(0, syscall(__NR_getpid)); 766 } 767 768 TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS) { 769 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 770 pid_t parent = getppid(); 771 ASSERT_EQ(0, ret); 772 773 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 774 ASSERT_EQ(0, ret); 775 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 776 ASSERT_EQ(0, ret); 777 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 778 ASSERT_EQ(0, ret); 779 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); 780 ASSERT_EQ(0, ret); 781 /* Should work just fine. */ 782 EXPECT_EQ(parent, syscall(__NR_getppid)); 783 /* getpid() should never return. */ 784 EXPECT_EQ(0, syscall(__NR_getpid)); 785 } 786 787 TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS) { 788 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 789 pid_t parent = getppid(); 790 ASSERT_EQ(0, ret); 791 792 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 793 ASSERT_EQ(0, ret); 794 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); 795 ASSERT_EQ(0, ret); 796 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 797 ASSERT_EQ(0, ret); 798 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 799 ASSERT_EQ(0, ret); 800 /* Should work just fine. */ 801 EXPECT_EQ(parent, syscall(__NR_getppid)); 802 /* getpid() should never return. */ 803 EXPECT_EQ(0, syscall(__NR_getpid)); 804 } 805 806 TEST_F(precedence, errno_is_third) { 807 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 808 pid_t parent = getppid(); 809 ASSERT_EQ(0, ret); 810 811 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 812 ASSERT_EQ(0, ret); 813 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 814 ASSERT_EQ(0, ret); 815 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 816 ASSERT_EQ(0, ret); 817 /* Should work just fine. */ 818 EXPECT_EQ(parent, syscall(__NR_getppid)); 819 EXPECT_EQ(0, syscall(__NR_getpid)); 820 } 821 822 TEST_F(precedence, errno_is_third_in_any_order) { 823 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 824 pid_t parent = getppid(); 825 ASSERT_EQ(0, ret); 826 827 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); 828 ASSERT_EQ(0, ret); 829 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 830 ASSERT_EQ(0, ret); 831 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 832 ASSERT_EQ(0, ret); 833 /* Should work just fine. */ 834 EXPECT_EQ(parent, syscall(__NR_getppid)); 835 EXPECT_EQ(0, syscall(__NR_getpid)); 836 } 837 838 TEST_F(precedence, trace_is_fourth) { 839 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 840 pid_t parent = getppid(); 841 ASSERT_EQ(0, ret); 842 843 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 844 ASSERT_EQ(0, ret); 845 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 846 ASSERT_EQ(0, ret); 847 /* Should work just fine. */ 848 EXPECT_EQ(parent, syscall(__NR_getppid)); 849 /* No ptracer */ 850 EXPECT_EQ(-1, syscall(__NR_getpid)); 851 } 852 853 TEST_F(precedence, trace_is_fourth_in_any_order) { 854 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 855 pid_t parent = getppid(); 856 ASSERT_EQ(0, ret); 857 858 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); 859 ASSERT_EQ(0, ret); 860 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); 861 ASSERT_EQ(0, ret); 862 /* Should work just fine. */ 863 EXPECT_EQ(parent, syscall(__NR_getppid)); 864 /* No ptracer */ 865 EXPECT_EQ(-1, syscall(__NR_getpid)); 866 } 867 868 #ifndef PTRACE_O_TRACESECCOMP 869 #define PTRACE_O_TRACESECCOMP 0x00000080 870 #endif 871 872 /* Catch the Ubuntu 12.04 value error. */ 873 #if PTRACE_EVENT_SECCOMP != 7 874 #undef PTRACE_EVENT_SECCOMP 875 #endif 876 877 #ifndef PTRACE_EVENT_SECCOMP 878 #define PTRACE_EVENT_SECCOMP 7 879 #endif 880 881 #define IS_SECCOMP_EVENT(status) ((status >> 16) == PTRACE_EVENT_SECCOMP) 882 bool tracer_running; 883 void tracer_stop(int sig) 884 { 885 tracer_running = false; 886 } 887 888 typedef void tracer_func_t(struct __test_metadata *_metadata, 889 pid_t tracee, int status, void *args); 890 891 void tracer(struct __test_metadata *_metadata, int fd, pid_t tracee, 892 tracer_func_t tracer_func, void *args) { 893 int ret = -1; 894 struct sigaction action = { 895 .sa_handler = tracer_stop, 896 }; 897 898 /* Allow external shutdown. */ 899 tracer_running = true; 900 ASSERT_EQ(0, sigaction(SIGUSR1, &action, NULL)); 901 902 errno = 0; 903 while (ret == -1 && errno != EINVAL) { 904 ret = ptrace(PTRACE_ATTACH, tracee, NULL, 0); 905 } 906 ASSERT_EQ(0, ret) { 907 kill(tracee, SIGKILL); 908 } 909 /* Wait for attach stop */ 910 wait(NULL); 911 912 ret = ptrace(PTRACE_SETOPTIONS, tracee, NULL, PTRACE_O_TRACESECCOMP); 913 ASSERT_EQ(0, ret) { 914 TH_LOG("Failed to set PTRACE_O_TRACESECCOMP"); 915 kill(tracee, SIGKILL); 916 } 917 ptrace(PTRACE_CONT, tracee, NULL, 0); 918 919 /* Unblock the tracee */ 920 ASSERT_EQ(1, write(fd, "A", 1)); 921 ASSERT_EQ(0, close(fd)); 922 923 /* Run until we're shut down. Must assert to stop execution. */ 924 while (tracer_running) { 925 int status; 926 if (wait(&status) != tracee) 927 continue; 928 if (WIFSIGNALED(status) || WIFEXITED(status)) 929 /* Child is dead. Time to go. */ 930 return; 931 932 /* Make sure this is a seccomp event. */ 933 ASSERT_EQ(true, IS_SECCOMP_EVENT(status)); 934 935 tracer_func(_metadata, tracee, status, args); 936 937 ret = ptrace(PTRACE_CONT, tracee, NULL, NULL); 938 ASSERT_EQ(0, ret); 939 } 940 /* Directly report the status of our test harness results. */ 941 syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE); 942 } 943 944 /* Common tracer setup/teardown functions. */ 945 void cont_handler(int num) { 946 } 947 pid_t setup_trace_fixture(struct __test_metadata *_metadata, 948 tracer_func_t func, void *args) { 949 char sync; 950 int pipefd[2]; 951 pid_t tracer_pid; 952 pid_t tracee = getpid(); 953 954 /* Setup a pipe for clean synchronization. */ 955 ASSERT_EQ(0, pipe(pipefd)); 956 957 /* Fork a child which we'll promote to tracer */ 958 tracer_pid = fork(); 959 ASSERT_LE(0, tracer_pid); 960 signal(SIGALRM, cont_handler); 961 if (tracer_pid == 0) { 962 close(pipefd[0]); 963 tracer(_metadata, pipefd[1], tracee, func, args); 964 syscall(__NR_exit, 0); 965 } 966 close(pipefd[1]); 967 prctl(PR_SET_PTRACER, tracer_pid, 0, 0, 0); 968 read(pipefd[0], &sync, 1); 969 close(pipefd[0]); 970 971 return tracer_pid; 972 } 973 void teardown_trace_fixture(struct __test_metadata *_metadata, 974 pid_t tracer) { 975 if (tracer) { 976 int status; 977 /* 978 * Extract the exit code from the other process and 979 * adopt it for ourselves in case its asserts failed. 980 */ 981 ASSERT_EQ(0, kill(tracer, SIGUSR1)); 982 ASSERT_EQ(tracer, waitpid(tracer, &status, 0)); 983 if (WEXITSTATUS(status)) 984 _metadata->passed = 0; 985 } 986 } 987 988 /* "poke" tracer arguments and function. */ 989 struct tracer_args_poke_t { 990 unsigned long poke_addr; 991 }; 992 993 void tracer_poke(struct __test_metadata *_metadata, pid_t tracee, int status, 994 void *args) { 995 int ret; 996 unsigned long msg; 997 struct tracer_args_poke_t *info = (struct tracer_args_poke_t *)args; 998 999 ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg); 1000 EXPECT_EQ(0, ret); 1001 /* If this fails, don't try to recover. */ 1002 ASSERT_EQ(0x1001, msg) { 1003 kill(tracee, SIGKILL); 1004 } 1005 /* 1006 * Poke in the message. 1007 * Registers are not touched to try to keep this relatively arch 1008 * agnostic. 1009 */ 1010 ret = ptrace(PTRACE_POKEDATA, tracee, info->poke_addr, 0x1001); 1011 EXPECT_EQ(0, ret); 1012 } 1013 1014 FIXTURE_DATA(TRACE_poke) { 1015 struct sock_fprog prog; 1016 pid_t tracer; 1017 long poked; 1018 struct tracer_args_poke_t tracer_args; 1019 }; 1020 1021 FIXTURE_SETUP(TRACE_poke) { 1022 struct sock_filter filter[] = { 1023 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 1024 offsetof(struct seccomp_data, nr)), 1025 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), 1026 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1001), 1027 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1028 }; 1029 1030 self->poked = 0; 1031 memset(&self->prog, 0, sizeof(self->prog)); 1032 self->prog.filter = malloc(sizeof(filter)); 1033 ASSERT_NE(NULL, self->prog.filter); 1034 memcpy(self->prog.filter, filter, sizeof(filter)); 1035 self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])); 1036 1037 /* Set up tracer args. */ 1038 self->tracer_args.poke_addr = (unsigned long)&self->poked; 1039 1040 /* Launch tracer. */ 1041 self->tracer = setup_trace_fixture(_metadata, tracer_poke, 1042 &self->tracer_args); 1043 } 1044 1045 FIXTURE_TEARDOWN(TRACE_poke) { 1046 teardown_trace_fixture(_metadata, self->tracer); 1047 if (self->prog.filter) 1048 free(self->prog.filter); 1049 }; 1050 1051 TEST_F(TRACE_poke, read_has_side_effects) { 1052 ssize_t ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1053 ASSERT_EQ(0, ret); 1054 1055 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0); 1056 ASSERT_EQ(0, ret); 1057 1058 EXPECT_EQ(0, self->poked); 1059 ret = read(-1, NULL, 0); 1060 EXPECT_EQ(-1, ret); 1061 EXPECT_EQ(0x1001, self->poked); 1062 } 1063 1064 TEST_F(TRACE_poke, getpid_runs_normally) { 1065 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1066 ASSERT_EQ(0, ret); 1067 1068 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0); 1069 ASSERT_EQ(0, ret); 1070 1071 EXPECT_EQ(0, self->poked); 1072 EXPECT_NE(0, syscall(__NR_getpid)); 1073 EXPECT_EQ(0, self->poked); 1074 } 1075 1076 #if defined(__x86_64__) 1077 # define ARCH_REGS struct user_regs_struct 1078 # define SYSCALL_NUM orig_rax 1079 # define SYSCALL_RET rax 1080 #elif defined(__i386__) 1081 # define ARCH_REGS struct user_regs_struct 1082 # define SYSCALL_NUM orig_eax 1083 # define SYSCALL_RET eax 1084 #elif defined(__arm__) 1085 # define ARCH_REGS struct pt_regs 1086 # define SYSCALL_NUM ARM_r7 1087 # define SYSCALL_RET ARM_r0 1088 #elif defined(__aarch64__) 1089 # define ARCH_REGS struct user_pt_regs 1090 # define SYSCALL_NUM regs[8] 1091 # define SYSCALL_RET regs[0] 1092 #else 1093 # error "Do not know how to find your architecture's registers and syscalls" 1094 #endif 1095 1096 /* Architecture-specific syscall fetching routine. */ 1097 int get_syscall(struct __test_metadata *_metadata, pid_t tracee) { 1098 struct iovec iov; 1099 ARCH_REGS regs; 1100 1101 iov.iov_base = ®s; 1102 iov.iov_len = sizeof(regs); 1103 EXPECT_EQ(0, ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov)) { 1104 TH_LOG("PTRACE_GETREGSET failed"); 1105 return -1; 1106 } 1107 1108 return regs.SYSCALL_NUM; 1109 } 1110 1111 /* Architecture-specific syscall changing routine. */ 1112 void change_syscall(struct __test_metadata *_metadata, 1113 pid_t tracee, int syscall) { 1114 struct iovec iov; 1115 int ret; 1116 ARCH_REGS regs; 1117 1118 iov.iov_base = ®s; 1119 iov.iov_len = sizeof(regs); 1120 ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov); 1121 EXPECT_EQ(0, ret); 1122 1123 #if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) 1124 { 1125 regs.SYSCALL_NUM = syscall; 1126 } 1127 1128 #elif defined(__arm__) 1129 # ifndef PTRACE_SET_SYSCALL 1130 # define PTRACE_SET_SYSCALL 23 1131 # endif 1132 { 1133 ret = ptrace(PTRACE_SET_SYSCALL, tracee, NULL, syscall); 1134 EXPECT_EQ(0, ret); 1135 } 1136 1137 #else 1138 ASSERT_EQ(1, 0) { 1139 TH_LOG("How is the syscall changed on this architecture?"); 1140 } 1141 #endif 1142 1143 /* If syscall is skipped, change return value. */ 1144 if (syscall == -1) 1145 regs.SYSCALL_RET = 1; 1146 1147 ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov); 1148 EXPECT_EQ(0, ret); 1149 } 1150 1151 void tracer_syscall(struct __test_metadata *_metadata, pid_t tracee, 1152 int status, void *args) { 1153 int ret; 1154 unsigned long msg; 1155 1156 /* Make sure we got the right message. */ 1157 ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg); 1158 EXPECT_EQ(0, ret); 1159 1160 switch (msg) { 1161 case 0x1002: 1162 /* change getpid to getppid. */ 1163 change_syscall(_metadata, tracee, __NR_getppid); 1164 break; 1165 case 0x1003: 1166 /* skip gettid. */ 1167 change_syscall(_metadata, tracee, -1); 1168 break; 1169 case 0x1004: 1170 /* do nothing (allow getppid) */ 1171 break; 1172 default: 1173 EXPECT_EQ(0, msg) { 1174 TH_LOG("Unknown PTRACE_GETEVENTMSG: 0x%lx", msg); 1175 kill(tracee, SIGKILL); 1176 } 1177 } 1178 1179 } 1180 1181 FIXTURE_DATA(TRACE_syscall) { 1182 struct sock_fprog prog; 1183 pid_t tracer, mytid, mypid, parent; 1184 }; 1185 1186 FIXTURE_SETUP(TRACE_syscall) { 1187 struct sock_filter filter[] = { 1188 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 1189 offsetof(struct seccomp_data, nr)), 1190 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1), 1191 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002), 1192 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1), 1193 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003), 1194 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1), 1195 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004), 1196 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1197 }; 1198 1199 memset(&self->prog, 0, sizeof(self->prog)); 1200 self->prog.filter = malloc(sizeof(filter)); 1201 ASSERT_NE(NULL, self->prog.filter); 1202 memcpy(self->prog.filter, filter, sizeof(filter)); 1203 self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])); 1204 1205 /* Prepare some testable syscall results. */ 1206 self->mytid = syscall(__NR_gettid); 1207 ASSERT_GT(self->mytid, 0); 1208 ASSERT_NE(self->mytid, 1) { 1209 TH_LOG("Running this test as init is not supported. :)"); 1210 } 1211 1212 self->mypid = getpid(); 1213 ASSERT_GT(self->mypid, 0); 1214 ASSERT_EQ(self->mytid, self->mypid); 1215 1216 self->parent = getppid(); 1217 ASSERT_GT(self->parent, 0); 1218 ASSERT_NE(self->parent, self->mypid); 1219 1220 /* Launch tracer. */ 1221 self->tracer = setup_trace_fixture(_metadata, tracer_syscall, NULL); 1222 } 1223 1224 FIXTURE_TEARDOWN(TRACE_syscall) { 1225 teardown_trace_fixture(_metadata, self->tracer); 1226 if (self->prog.filter) 1227 free(self->prog.filter); 1228 }; 1229 1230 TEST_F(TRACE_syscall, syscall_allowed) { 1231 long ret; 1232 1233 ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1234 ASSERT_EQ(0, ret); 1235 1236 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0); 1237 ASSERT_EQ(0, ret); 1238 1239 /* getppid works as expected (no changes). */ 1240 EXPECT_EQ(self->parent, syscall(__NR_getppid)); 1241 EXPECT_NE(self->mypid, syscall(__NR_getppid)); 1242 } 1243 1244 TEST_F(TRACE_syscall, syscall_redirected) { 1245 long ret; 1246 1247 ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1248 ASSERT_EQ(0, ret); 1249 1250 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0); 1251 ASSERT_EQ(0, ret); 1252 1253 /* getpid has been redirected to getppid as expected. */ 1254 EXPECT_EQ(self->parent, syscall(__NR_getpid)); 1255 EXPECT_NE(self->mypid, syscall(__NR_getpid)); 1256 } 1257 1258 TEST_F(TRACE_syscall, syscall_dropped) { 1259 long ret; 1260 1261 ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1262 ASSERT_EQ(0, ret); 1263 1264 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0); 1265 ASSERT_EQ(0, ret); 1266 1267 /* gettid has been skipped and an altered return value stored. */ 1268 EXPECT_EQ(1, syscall(__NR_gettid)); 1269 EXPECT_NE(self->mytid, syscall(__NR_gettid)); 1270 } 1271 1272 #ifndef __NR_seccomp 1273 # if defined(__i386__) 1274 # define __NR_seccomp 354 1275 # elif defined(__x86_64__) 1276 # define __NR_seccomp 317 1277 # elif defined(__arm__) 1278 # define __NR_seccomp 383 1279 # elif defined(__aarch64__) 1280 # define __NR_seccomp 277 1281 # else 1282 # warning "seccomp syscall number unknown for this architecture" 1283 # define __NR_seccomp 0xffff 1284 # endif 1285 #endif 1286 1287 #ifndef SECCOMP_SET_MODE_STRICT 1288 #define SECCOMP_SET_MODE_STRICT 0 1289 #endif 1290 1291 #ifndef SECCOMP_SET_MODE_FILTER 1292 #define SECCOMP_SET_MODE_FILTER 1 1293 #endif 1294 1295 #ifndef SECCOMP_FLAG_FILTER_TSYNC 1296 #define SECCOMP_FLAG_FILTER_TSYNC 1 1297 #endif 1298 1299 #ifndef seccomp 1300 int seccomp(unsigned int op, unsigned int flags, struct sock_fprog *filter) 1301 { 1302 errno = 0; 1303 return syscall(__NR_seccomp, op, flags, filter); 1304 } 1305 #endif 1306 1307 TEST(seccomp_syscall) { 1308 struct sock_filter filter[] = { 1309 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1310 }; 1311 struct sock_fprog prog = { 1312 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 1313 .filter = filter, 1314 }; 1315 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); 1316 ASSERT_EQ(0, ret) { 1317 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1318 } 1319 1320 /* Reject insane operation. */ 1321 ret = seccomp(-1, 0, &prog); 1322 EXPECT_EQ(EINVAL, errno) { 1323 TH_LOG("Did not reject crazy op value!"); 1324 } 1325 1326 /* Reject strict with flags or pointer. */ 1327 ret = seccomp(SECCOMP_SET_MODE_STRICT, -1, NULL); 1328 EXPECT_EQ(EINVAL, errno) { 1329 TH_LOG("Did not reject mode strict with flags!"); 1330 } 1331 ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, &prog); 1332 EXPECT_EQ(EINVAL, errno) { 1333 TH_LOG("Did not reject mode strict with uargs!"); 1334 } 1335 1336 /* Reject insane args for filter. */ 1337 ret = seccomp(SECCOMP_SET_MODE_FILTER, -1, &prog); 1338 EXPECT_EQ(EINVAL, errno) { 1339 TH_LOG("Did not reject crazy filter flags!"); 1340 } 1341 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, NULL); 1342 EXPECT_EQ(EFAULT, errno) { 1343 TH_LOG("Did not reject NULL filter!"); 1344 } 1345 1346 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog); 1347 EXPECT_EQ(0, errno) { 1348 TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER: %s", 1349 strerror(errno)); 1350 } 1351 } 1352 1353 TEST(seccomp_syscall_mode_lock) { 1354 struct sock_filter filter[] = { 1355 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1356 }; 1357 struct sock_fprog prog = { 1358 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 1359 .filter = filter, 1360 }; 1361 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0); 1362 ASSERT_EQ(0, ret) { 1363 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1364 } 1365 1366 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog); 1367 EXPECT_EQ(0, ret) { 1368 TH_LOG("Could not install filter!"); 1369 } 1370 1371 /* Make sure neither entry point will switch to strict. */ 1372 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, 0, 0, 0); 1373 EXPECT_EQ(EINVAL, errno) { 1374 TH_LOG("Switched to mode strict!"); 1375 } 1376 1377 ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, NULL); 1378 EXPECT_EQ(EINVAL, errno) { 1379 TH_LOG("Switched to mode strict!"); 1380 } 1381 } 1382 1383 TEST(TSYNC_first) { 1384 struct sock_filter filter[] = { 1385 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1386 }; 1387 struct sock_fprog prog = { 1388 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 1389 .filter = filter, 1390 }; 1391 long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0); 1392 ASSERT_EQ(0, ret) { 1393 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1394 } 1395 1396 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1397 &prog); 1398 EXPECT_EQ(0, ret) { 1399 TH_LOG("Could not install initial filter with TSYNC!"); 1400 } 1401 } 1402 1403 #define TSYNC_SIBLINGS 2 1404 struct tsync_sibling { 1405 pthread_t tid; 1406 pid_t system_tid; 1407 sem_t *started; 1408 pthread_cond_t *cond; 1409 pthread_mutex_t *mutex; 1410 int diverge; 1411 int num_waits; 1412 struct sock_fprog *prog; 1413 struct __test_metadata *metadata; 1414 }; 1415 1416 FIXTURE_DATA(TSYNC) { 1417 struct sock_fprog root_prog, apply_prog; 1418 struct tsync_sibling sibling[TSYNC_SIBLINGS]; 1419 sem_t started; 1420 pthread_cond_t cond; 1421 pthread_mutex_t mutex; 1422 int sibling_count; 1423 }; 1424 1425 FIXTURE_SETUP(TSYNC) { 1426 struct sock_filter root_filter[] = { 1427 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1428 }; 1429 struct sock_filter apply_filter[] = { 1430 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 1431 offsetof(struct seccomp_data, nr)), 1432 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), 1433 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 1434 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1435 }; 1436 memset(&self->root_prog, 0, sizeof(self->root_prog)); 1437 memset(&self->apply_prog, 0, sizeof(self->apply_prog)); 1438 memset(&self->sibling, 0, sizeof(self->sibling)); 1439 self->root_prog.filter = malloc(sizeof(root_filter)); 1440 ASSERT_NE(NULL, self->root_prog.filter); 1441 memcpy(self->root_prog.filter, &root_filter, sizeof(root_filter)); 1442 self->root_prog.len = (unsigned short)(sizeof(root_filter)/sizeof(root_filter[0])); 1443 1444 self->apply_prog.filter = malloc(sizeof(apply_filter)); 1445 ASSERT_NE(NULL, self->apply_prog.filter); 1446 memcpy(self->apply_prog.filter, &apply_filter, sizeof(apply_filter)); 1447 self->apply_prog.len = (unsigned short)(sizeof(apply_filter)/sizeof(apply_filter[0])); 1448 1449 self->sibling_count = 0; 1450 pthread_mutex_init(&self->mutex, NULL); 1451 pthread_cond_init(&self->cond, NULL); 1452 sem_init(&self->started, 0, 0); 1453 self->sibling[0].tid = 0; 1454 self->sibling[0].cond = &self->cond; 1455 self->sibling[0].started = &self->started; 1456 self->sibling[0].mutex = &self->mutex; 1457 self->sibling[0].diverge = 0; 1458 self->sibling[0].num_waits = 1; 1459 self->sibling[0].prog = &self->root_prog; 1460 self->sibling[0].metadata = _metadata; 1461 self->sibling[1].tid = 0; 1462 self->sibling[1].cond = &self->cond; 1463 self->sibling[1].started = &self->started; 1464 self->sibling[1].mutex = &self->mutex; 1465 self->sibling[1].diverge = 0; 1466 self->sibling[1].prog = &self->root_prog; 1467 self->sibling[1].num_waits = 1; 1468 self->sibling[1].metadata = _metadata; 1469 } 1470 1471 FIXTURE_TEARDOWN(TSYNC) { 1472 int sib = 0; 1473 if (self->root_prog.filter) 1474 free(self->root_prog.filter); 1475 if (self->apply_prog.filter) 1476 free(self->apply_prog.filter); 1477 1478 for ( ; sib < self->sibling_count; ++sib) { 1479 struct tsync_sibling *s = &self->sibling[sib]; 1480 void *status; 1481 if (!s->tid) 1482 continue; 1483 if (pthread_kill(s->tid, 0)) { 1484 //pthread_cancel(s->tid); // ANDROID 1485 pthread_join(s->tid, &status); 1486 } 1487 } 1488 pthread_mutex_destroy(&self->mutex); 1489 pthread_cond_destroy(&self->cond); 1490 sem_destroy(&self->started); 1491 }; 1492 1493 void *tsync_sibling(void *data) 1494 { 1495 long ret = 0; 1496 struct tsync_sibling *me = data; 1497 me->system_tid = syscall(__NR_gettid); 1498 1499 pthread_mutex_lock(me->mutex); 1500 if (me->diverge) { 1501 /* Just re-apply the root prog to fork the tree */ 1502 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, 1503 me->prog, 0, 0); 1504 } 1505 sem_post(me->started); 1506 /* Return outside of started so parent notices failures. */ 1507 if (ret) { 1508 pthread_mutex_unlock(me->mutex); 1509 return (void *)SIBLING_EXIT_FAILURE; 1510 } 1511 do { 1512 pthread_cond_wait(me->cond, me->mutex); 1513 me->num_waits = me->num_waits - 1; 1514 } 1515 while (me->num_waits); 1516 pthread_mutex_unlock(me->mutex); 1517 long nnp = prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0); 1518 if (!nnp) 1519 return (void*)SIBLING_EXIT_NEWPRIVS; 1520 read(0, NULL, 0); 1521 return (void *)SIBLING_EXIT_UNKILLED; 1522 } 1523 1524 void tsync_start_sibling(struct tsync_sibling *sibling) 1525 { 1526 pthread_create(&sibling->tid, NULL, tsync_sibling, (void *)sibling); 1527 } 1528 1529 TEST_F(TSYNC, siblings_fail_prctl) { 1530 long ret; 1531 void *status; 1532 struct sock_filter filter[] = { 1533 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 1534 offsetof(struct seccomp_data, nr)), 1535 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1), 1536 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EINVAL), 1537 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1538 }; 1539 struct sock_fprog prog = { 1540 .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 1541 .filter = filter, 1542 }; 1543 1544 ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1545 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1546 } 1547 1548 /* Check prctl failure detection by requesting sib 0 diverge. */ 1549 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog); 1550 ASSERT_EQ(0, ret) { 1551 TH_LOG("setting filter failed"); 1552 } 1553 1554 self->sibling[0].diverge = 1; 1555 tsync_start_sibling(&self->sibling[0]); 1556 tsync_start_sibling(&self->sibling[1]); 1557 1558 while (self->sibling_count < TSYNC_SIBLINGS) { 1559 sem_wait(&self->started); 1560 self->sibling_count++; 1561 } 1562 1563 /* Signal the threads to clean up*/ 1564 pthread_mutex_lock(&self->mutex); 1565 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1566 TH_LOG("cond broadcast non-zero"); 1567 } 1568 pthread_mutex_unlock(&self->mutex); 1569 1570 /* Ensure diverging sibling failed to call prctl. */ 1571 pthread_join(self->sibling[0].tid, &status); 1572 EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status); 1573 pthread_join(self->sibling[1].tid, &status); 1574 EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); 1575 } 1576 1577 TEST_F(TSYNC, two_siblings_with_ancestor) { 1578 long ret; 1579 void *status; 1580 1581 ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1582 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1583 } 1584 1585 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog); 1586 ASSERT_EQ(0, ret) { 1587 TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!"); 1588 } 1589 tsync_start_sibling(&self->sibling[0]); 1590 tsync_start_sibling(&self->sibling[1]); 1591 1592 while (self->sibling_count < TSYNC_SIBLINGS) { 1593 sem_wait(&self->started); 1594 self->sibling_count++; 1595 } 1596 1597 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1598 &self->apply_prog); 1599 ASSERT_EQ(0, ret) { 1600 TH_LOG("Could install filter on all threads!"); 1601 } 1602 /* Tell the siblings to test the policy */ 1603 pthread_mutex_lock(&self->mutex); 1604 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1605 TH_LOG("cond broadcast non-zero"); 1606 } 1607 pthread_mutex_unlock(&self->mutex); 1608 /* Ensure they are both killed and don't exit cleanly. */ 1609 pthread_join(self->sibling[0].tid, &status); 1610 EXPECT_EQ(0x0, (long)status); 1611 pthread_join(self->sibling[1].tid, &status); 1612 EXPECT_EQ(0x0, (long)status); 1613 } 1614 1615 TEST_F(TSYNC, two_sibling_want_nnp) { 1616 void *status; 1617 1618 /* start siblings before any prctl() operations */ 1619 tsync_start_sibling(&self->sibling[0]); 1620 tsync_start_sibling(&self->sibling[1]); 1621 while (self->sibling_count < TSYNC_SIBLINGS) { 1622 sem_wait(&self->started); 1623 self->sibling_count++; 1624 } 1625 1626 /* Tell the siblings to test no policy */ 1627 pthread_mutex_lock(&self->mutex); 1628 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1629 TH_LOG("cond broadcast non-zero"); 1630 } 1631 pthread_mutex_unlock(&self->mutex); 1632 1633 /* Ensure they are both upset about lacking nnp. */ 1634 pthread_join(self->sibling[0].tid, &status); 1635 EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); 1636 pthread_join(self->sibling[1].tid, &status); 1637 EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); 1638 } 1639 1640 TEST_F(TSYNC, two_siblings_with_no_filter) { 1641 long ret; 1642 void *status; 1643 1644 /* start siblings before any prctl() operations */ 1645 tsync_start_sibling(&self->sibling[0]); 1646 tsync_start_sibling(&self->sibling[1]); 1647 while (self->sibling_count < TSYNC_SIBLINGS) { 1648 sem_wait(&self->started); 1649 self->sibling_count++; 1650 } 1651 1652 ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1653 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1654 } 1655 1656 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1657 &self->apply_prog); 1658 ASSERT_EQ(0, ret) { 1659 TH_LOG("Could install filter on all threads!"); 1660 } 1661 1662 /* Tell the siblings to test the policy */ 1663 pthread_mutex_lock(&self->mutex); 1664 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1665 TH_LOG("cond broadcast non-zero"); 1666 } 1667 pthread_mutex_unlock(&self->mutex); 1668 1669 /* Ensure they are both killed and don't exit cleanly. */ 1670 pthread_join(self->sibling[0].tid, &status); 1671 EXPECT_EQ(0x0, (long)status); 1672 pthread_join(self->sibling[1].tid, &status); 1673 EXPECT_EQ(0x0, (long)status); 1674 } 1675 1676 TEST_F(TSYNC, two_siblings_with_one_divergence) { 1677 long ret; 1678 void *status; 1679 1680 ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1681 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1682 } 1683 1684 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog); 1685 ASSERT_EQ(0, ret) { 1686 TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!"); 1687 } 1688 self->sibling[0].diverge = 1; 1689 tsync_start_sibling(&self->sibling[0]); 1690 tsync_start_sibling(&self->sibling[1]); 1691 1692 while (self->sibling_count < TSYNC_SIBLINGS) { 1693 sem_wait(&self->started); 1694 self->sibling_count++; 1695 } 1696 1697 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1698 &self->apply_prog); 1699 ASSERT_EQ(self->sibling[0].system_tid, ret) { 1700 TH_LOG("Did not fail on diverged sibling."); 1701 } 1702 1703 /* Wake the threads */ 1704 pthread_mutex_lock(&self->mutex); 1705 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1706 TH_LOG("cond broadcast non-zero"); 1707 } 1708 pthread_mutex_unlock(&self->mutex); 1709 1710 /* Ensure they are both unkilled. */ 1711 pthread_join(self->sibling[0].tid, &status); 1712 EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); 1713 pthread_join(self->sibling[1].tid, &status); 1714 EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); 1715 } 1716 1717 TEST_F(TSYNC, two_siblings_not_under_filter) { 1718 long ret, sib; 1719 void *status; 1720 1721 ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1722 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1723 } 1724 1725 /* 1726 * Sibling 0 will have its own seccomp policy 1727 * and Sibling 1 will not be under seccomp at 1728 * all. Sibling 1 will enter seccomp and 0 1729 * will cause failure. 1730 */ 1731 self->sibling[0].diverge = 1; 1732 tsync_start_sibling(&self->sibling[0]); 1733 tsync_start_sibling(&self->sibling[1]); 1734 1735 while (self->sibling_count < TSYNC_SIBLINGS) { 1736 sem_wait(&self->started); 1737 self->sibling_count++; 1738 } 1739 1740 ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog); 1741 ASSERT_EQ(0, ret) { 1742 TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!"); 1743 } 1744 1745 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1746 &self->apply_prog); 1747 ASSERT_EQ(ret, self->sibling[0].system_tid) { 1748 TH_LOG("Did not fail on diverged sibling."); 1749 } 1750 sib = 1; 1751 if (ret == self->sibling[0].system_tid) 1752 sib = 0; 1753 1754 pthread_mutex_lock(&self->mutex); 1755 1756 /* Increment the other siblings num_waits so we can clean up 1757 * the one we just saw. 1758 */ 1759 self->sibling[!sib].num_waits += 1; 1760 1761 /* Signal the thread to clean up*/ 1762 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1763 TH_LOG("cond broadcast non-zero"); 1764 } 1765 pthread_mutex_unlock(&self->mutex); 1766 pthread_join(self->sibling[sib].tid, &status); 1767 EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); 1768 /* Poll for actual task death. pthread_join doesn't guarantee it. */ 1769 while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1); 1770 /* Switch to the remaining sibling */ 1771 sib = !sib; 1772 1773 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1774 &self->apply_prog); 1775 ASSERT_EQ(0, ret) { 1776 TH_LOG("Expected the remaining sibling to sync"); 1777 }; 1778 1779 pthread_mutex_lock(&self->mutex); 1780 1781 /* If remaining sibling didn't have a chance to wake up during 1782 * the first broadcast, manually reduce the num_waits now. 1783 */ 1784 if (self->sibling[sib].num_waits > 1) 1785 self->sibling[sib].num_waits = 1; 1786 ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) { 1787 TH_LOG("cond broadcast non-zero"); 1788 } 1789 pthread_mutex_unlock(&self->mutex); 1790 pthread_join(self->sibling[sib].tid, &status); 1791 EXPECT_EQ(0, (long)status); 1792 /* Poll for actual task death. pthread_join doesn't guarantee it. */ 1793 while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1); 1794 1795 ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, 1796 &self->apply_prog); 1797 ASSERT_EQ(0, ret); /* just us chickens */ 1798 } 1799 1800 /* Make sure restarted syscalls are seen directly as "restart_syscall". */ 1801 TEST(syscall_restart) 1802 { 1803 long ret; 1804 unsigned long msg; 1805 pid_t child_pid; 1806 int pipefd[2]; 1807 int status; 1808 siginfo_t info = { }; 1809 struct sock_filter filter[] = { 1810 BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 1811 offsetof(struct seccomp_data, nr)), 1812 1813 #ifdef __NR_sigreturn 1814 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_sigreturn, 6, 0), 1815 #endif 1816 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0), 1817 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0), 1818 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0), 1819 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_nanosleep, 4, 0), 1820 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0), 1821 1822 /* Allow __NR_write for easy logging. */ 1823 BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1), 1824 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), 1825 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), 1826 /* The nanosleep jump target. */ 1827 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100), 1828 /* The restart_syscall jump target. */ 1829 BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200), 1830 }; 1831 struct sock_fprog prog = { 1832 .len = (unsigned short) (sizeof(filter)/sizeof(filter[0])), 1833 .filter = filter, 1834 }; 1835 #if defined(__arm__) 1836 struct utsname utsbuf; 1837 #endif 1838 1839 ASSERT_EQ(0, pipe(pipefd)); 1840 1841 child_pid = fork(); 1842 ASSERT_LE(0, child_pid); 1843 if (child_pid == 0) { 1844 /* Child uses EXPECT not ASSERT to deliver status correctly. */ 1845 char buf = ' '; 1846 struct timespec timeout = { }; 1847 1848 /* Attach parent as tracer and stop. */ 1849 EXPECT_EQ(0, ptrace(PTRACE_TRACEME)); 1850 EXPECT_EQ(0, raise(SIGSTOP)); 1851 1852 EXPECT_EQ(0, close(pipefd[1])); 1853 1854 EXPECT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { 1855 TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); 1856 } 1857 1858 ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0); 1859 EXPECT_EQ(0, ret) { 1860 TH_LOG("Failed to install filter!"); 1861 } 1862 1863 EXPECT_EQ(1, read(pipefd[0], &buf, 1)) { 1864 TH_LOG("Failed to read() sync from parent"); 1865 } 1866 EXPECT_EQ('.', buf) { 1867 TH_LOG("Failed to get sync data from read()"); 1868 } 1869 1870 /* Start nanosleep to be interrupted. */ 1871 timeout.tv_sec = 1; 1872 errno = 0; 1873 EXPECT_EQ(0, nanosleep(&timeout, NULL)) { 1874 TH_LOG("Call to nanosleep() failed (errno %d)", errno); 1875 } 1876 1877 /* Read final sync from parent. */ 1878 EXPECT_EQ(1, read(pipefd[0], &buf, 1)) { 1879 TH_LOG("Failed final read() from parent"); 1880 } 1881 EXPECT_EQ('!', buf) { 1882 TH_LOG("Failed to get final data from read()"); 1883 } 1884 1885 /* Directly report the status of our test harness results. */ 1886 syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS 1887 : EXIT_FAILURE); 1888 } 1889 EXPECT_EQ(0, close(pipefd[0])); 1890 1891 /* Attach to child, setup options, and release. */ 1892 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1893 ASSERT_EQ(true, WIFSTOPPED(status)); 1894 ASSERT_EQ(0, ptrace(PTRACE_SETOPTIONS, child_pid, NULL, 1895 PTRACE_O_TRACESECCOMP)); 1896 ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0)); 1897 ASSERT_EQ(1, write(pipefd[1], ".", 1)); 1898 1899 /* Wait for nanosleep() to start. */ 1900 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1901 ASSERT_EQ(true, WIFSTOPPED(status)); 1902 ASSERT_EQ(SIGTRAP, WSTOPSIG(status)); 1903 ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16)); 1904 ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg)); 1905 ASSERT_EQ(0x100, msg); 1906 EXPECT_EQ(__NR_nanosleep, get_syscall(_metadata, child_pid)); 1907 1908 /* Might as well check siginfo for sanity while we're here. */ 1909 ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info)); 1910 ASSERT_EQ(SIGTRAP, info.si_signo); 1911 ASSERT_EQ(SIGTRAP | (PTRACE_EVENT_SECCOMP << 8), info.si_code); 1912 EXPECT_EQ(0, info.si_errno); 1913 EXPECT_EQ(getuid(), info.si_uid); 1914 /* Verify signal delivery came from child (seccomp-triggered). */ 1915 EXPECT_EQ(child_pid, info.si_pid); 1916 1917 /* Interrupt nanosleep with SIGSTOP (which we'll need to handle). */ 1918 ASSERT_EQ(0, kill(child_pid, SIGSTOP)); 1919 ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0)); 1920 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1921 ASSERT_EQ(true, WIFSTOPPED(status)); 1922 ASSERT_EQ(SIGSTOP, WSTOPSIG(status)); 1923 /* Verify signal delivery came from parent now. */ 1924 ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info)); 1925 EXPECT_EQ(getpid(), info.si_pid); 1926 1927 /* Restart nanosleep with SIGCONT, which triggers restart_syscall. */ 1928 ASSERT_EQ(0, kill(child_pid, SIGCONT)); 1929 ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0)); 1930 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1931 ASSERT_EQ(true, WIFSTOPPED(status)); 1932 ASSERT_EQ(SIGCONT, WSTOPSIG(status)); 1933 ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0)); 1934 1935 /* Wait for restart_syscall() to start. */ 1936 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1937 ASSERT_EQ(true, WIFSTOPPED(status)); 1938 ASSERT_EQ(SIGTRAP, WSTOPSIG(status)); 1939 ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16)); 1940 ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg)); 1941 1942 ASSERT_EQ(0x200, msg); 1943 ret = get_syscall(_metadata, child_pid); 1944 #if defined(__arm__) 1945 /* 1946 * FIXME: 1947 * - native ARM registers do NOT expose true syscall. 1948 * - compat ARM registers on ARM64 DO expose true syscall. 1949 */ 1950 ASSERT_EQ(0, uname(&utsbuf)); 1951 if (strncmp(utsbuf.machine, "arm", 3) == 0) { 1952 EXPECT_EQ(__NR_nanosleep, ret); 1953 } else 1954 #endif 1955 { 1956 EXPECT_EQ(__NR_restart_syscall, ret); 1957 } 1958 1959 /* Write again to end test. */ 1960 ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0)); 1961 ASSERT_EQ(1, write(pipefd[1], "!", 1)); 1962 EXPECT_EQ(0, close(pipefd[1])); 1963 1964 ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); 1965 if (WIFSIGNALED(status) || WEXITSTATUS(status)) 1966 _metadata->passed = 0; 1967 } 1968 1969 /* 1970 * TODO: 1971 * - add microbenchmarks 1972 * - expand NNP testing 1973 * - better arch-specific TRACE and TRAP handlers. 1974 * - endianness checking when appropriate 1975 * - 64-bit arg prodding 1976 * - arch value testing (x86 modes especially) 1977 * - ... 1978 */ 1979 1980 // ANDROID:begin 1981 struct __test_metadata* get_seccomp_test_list() { 1982 return __test_list; 1983 } 1984 // ANDROID:end 1985 1986 TEST_HARNESS_MAIN 1987