// https://syzkaller.appspot.com/bug?id=11e48263e95de26d2c62f23fe0664e8e41e92067 // autogenerated by syzkaller (http://github.com/google/syzkaller) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include __attribute__((noreturn)) static void doexit(int status) { volatile unsigned i; syscall(__NR_exit_group, status); for (i = 0;; i++) { } } #include #include #include #include #include #include #include #include #include #include const int kFailStatus = 67; const int kRetryStatus = 69; static void fail(const char* msg, ...) { int e = errno; va_list args; va_start(args, msg); vfprintf(stderr, msg, args); va_end(args); fprintf(stderr, " (errno %d)\n", e); doexit((e == ENOMEM || e == EAGAIN) ? kRetryStatus : kFailStatus); } static void exitf(const char* msg, ...) { int e = errno; va_list args; va_start(args, msg); vfprintf(stderr, msg, args); va_end(args); fprintf(stderr, " (errno %d)\n", e); doexit(kRetryStatus); } static __thread int skip_segv; static __thread jmp_buf segv_env; static void segv_handler(int sig, siginfo_t* info, void* uctx) { uintptr_t addr = (uintptr_t)info->si_addr; const uintptr_t prog_start = 1 << 20; const uintptr_t prog_end = 100 << 20; if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) && (addr < prog_start || addr > prog_end)) { _longjmp(segv_env, 1); } doexit(sig); } static void install_segv_handler() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; syscall(SYS_rt_sigaction, 0x20, &sa, NULL, 8); syscall(SYS_rt_sigaction, 0x21, &sa, NULL, 8); memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = segv_handler; sa.sa_flags = SA_NODEFER | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); } #define NONFAILING(...) \ { \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (_setjmp(segv_env) == 0) { \ __VA_ARGS__; \ } \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ } static uint64_t current_time_ms() { struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts)) fail("clock_gettime failed"); return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; } static void use_temporary_dir() { char tmpdir_template[] = "./syzkaller.XXXXXX"; char* tmpdir = mkdtemp(tmpdir_template); if (!tmpdir) fail("failed to mkdtemp"); if (chmod(tmpdir, 0777)) fail("failed to chmod"); if (chdir(tmpdir)) fail("failed to chdir"); } static bool write_file(const char* file, const char* what, ...) { char buf[1024]; va_list args; va_start(args, what); vsnprintf(buf, sizeof(buf), what, args); va_end(args); buf[sizeof(buf) - 1] = 0; int len = strlen(buf); int fd = open(file, O_WRONLY | O_CLOEXEC); if (fd == -1) return false; if (write(fd, buf, len) != len) { int err = errno; close(fd); errno = err; return false; } close(fd); return true; } static void setup_cgroups() { if (mkdir("/syzcgroup", 0777)) { } if (mkdir("/syzcgroup/unified", 0777)) { } if (mount("none", "/syzcgroup/unified", "cgroup2", 0, NULL)) { } if (chmod("/syzcgroup/unified", 0777)) { } if (!write_file("/syzcgroup/unified/cgroup.subtree_control", "+cpu +memory +io +pids +rdma")) { } if (mkdir("/syzcgroup/cpu", 0777)) { } if (mount("none", "/syzcgroup/cpu", "cgroup", 0, "cpuset,cpuacct,perf_event,hugetlb")) { } if (!write_file("/syzcgroup/cpu/cgroup.clone_children", "1")) { } if (chmod("/syzcgroup/cpu", 0777)) { } if (mkdir("/syzcgroup/net", 0777)) { } if (mount("none", "/syzcgroup/net", "cgroup", 0, "net_cls,net_prio,devices,freezer")) { } if (chmod("/syzcgroup/net", 0777)) { } } static void setup_binfmt_misc() { if (!write_file("/proc/sys/fs/binfmt_misc/register", ":syz0:M:0:syz0::./file0:")) { } if (!write_file("/proc/sys/fs/binfmt_misc/register", ":syz1:M:1:yz1::./file0:POC")) { } } static void loop(); static void sandbox_common() { prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); setpgrp(); setsid(); struct rlimit rlim; rlim.rlim_cur = rlim.rlim_max = 160 << 20; setrlimit(RLIMIT_AS, &rlim); rlim.rlim_cur = rlim.rlim_max = 8 << 20; setrlimit(RLIMIT_MEMLOCK, &rlim); rlim.rlim_cur = rlim.rlim_max = 136 << 20; setrlimit(RLIMIT_FSIZE, &rlim); rlim.rlim_cur = rlim.rlim_max = 1 << 20; setrlimit(RLIMIT_STACK, &rlim); rlim.rlim_cur = rlim.rlim_max = 0; setrlimit(RLIMIT_CORE, &rlim); if (unshare(CLONE_NEWNS)) { } if (unshare(CLONE_NEWIPC)) { } if (unshare(0x02000000)) { } if (unshare(CLONE_NEWUTS)) { } if (unshare(CLONE_SYSVSEM)) { } } static int real_uid; static int real_gid; __attribute__((aligned(64 << 10))) static char sandbox_stack[1 << 20]; static int namespace_sandbox_proc(void* arg) { sandbox_common(); write_file("/proc/self/setgroups", "deny"); if (!write_file("/proc/self/uid_map", "0 %d 1\n", real_uid)) fail("write of /proc/self/uid_map failed"); if (!write_file("/proc/self/gid_map", "0 %d 1\n", real_gid)) fail("write of /proc/self/gid_map failed"); if (unshare(CLONE_NEWNET)) fail("unshare(CLONE_NEWNET)"); if (mkdir("./syz-tmp", 0777)) fail("mkdir(syz-tmp) failed"); if (mount("", "./syz-tmp", "tmpfs", 0, NULL)) fail("mount(tmpfs) failed"); if (mkdir("./syz-tmp/newroot", 0777)) fail("mkdir failed"); if (mkdir("./syz-tmp/newroot/dev", 0700)) fail("mkdir failed"); unsigned mount_flags = MS_BIND | MS_REC | MS_PRIVATE; if (mount("/dev", "./syz-tmp/newroot/dev", NULL, mount_flags, NULL)) fail("mount(dev) failed"); if (mkdir("./syz-tmp/newroot/proc", 0700)) fail("mkdir failed"); if (mount(NULL, "./syz-tmp/newroot/proc", "proc", 0, NULL)) fail("mount(proc) failed"); if (mkdir("./syz-tmp/newroot/selinux", 0700)) fail("mkdir failed"); const char* selinux_path = "./syz-tmp/newroot/selinux"; if (mount("/selinux", selinux_path, NULL, mount_flags, NULL)) { if (errno != ENOENT) fail("mount(/selinux) failed"); if (mount("/sys/fs/selinux", selinux_path, NULL, mount_flags, NULL) && errno != ENOENT) fail("mount(/sys/fs/selinux) failed"); } if (mkdir("./syz-tmp/newroot/sys", 0700)) fail("mkdir failed"); if (mount(NULL, "./syz-tmp/newroot/sys", "sysfs", 0, NULL)) fail("mount(sysfs) failed"); if (mkdir("./syz-tmp/newroot/syzcgroup", 0700)) fail("mkdir failed"); if (mkdir("./syz-tmp/newroot/syzcgroup/unified", 0700)) fail("mkdir failed"); if (mkdir("./syz-tmp/newroot/syzcgroup/cpu", 0700)) fail("mkdir failed"); if (mkdir("./syz-tmp/newroot/syzcgroup/net", 0700)) fail("mkdir failed"); if (mount("/syzcgroup/unified", "./syz-tmp/newroot/syzcgroup/unified", NULL, mount_flags, NULL)) { } if (mount("/syzcgroup/cpu", "./syz-tmp/newroot/syzcgroup/cpu", NULL, mount_flags, NULL)) { } if (mount("/syzcgroup/net", "./syz-tmp/newroot/syzcgroup/net", NULL, mount_flags, NULL)) { } if (mkdir("./syz-tmp/pivot", 0777)) fail("mkdir failed"); if (syscall(SYS_pivot_root, "./syz-tmp", "./syz-tmp/pivot")) { if (chdir("./syz-tmp")) fail("chdir failed"); } else { if (chdir("/")) fail("chdir failed"); if (umount2("./pivot", MNT_DETACH)) fail("umount failed"); } if (chroot("./newroot")) fail("chroot failed"); if (chdir("/")) fail("chdir failed"); struct __user_cap_header_struct cap_hdr = {}; struct __user_cap_data_struct cap_data[2] = {}; cap_hdr.version = _LINUX_CAPABILITY_VERSION_3; cap_hdr.pid = getpid(); if (syscall(SYS_capget, &cap_hdr, &cap_data)) fail("capget failed"); cap_data[0].effective &= ~(1 << CAP_SYS_PTRACE); cap_data[0].permitted &= ~(1 << CAP_SYS_PTRACE); cap_data[0].inheritable &= ~(1 << CAP_SYS_PTRACE); if (syscall(SYS_capset, &cap_hdr, &cap_data)) fail("capset failed"); loop(); doexit(1); } static int do_sandbox_namespace(void) { int pid; setup_cgroups(); setup_binfmt_misc(); real_uid = getuid(); real_gid = getgid(); mprotect(sandbox_stack, 4096, PROT_NONE); pid = clone(namespace_sandbox_proc, &sandbox_stack[sizeof(sandbox_stack) - 64], CLONE_NEWUSER | CLONE_NEWPID, 0); if (pid < 0) fail("sandbox clone failed"); return pid; } static void remove_dir(const char* dir) { DIR* dp; struct dirent* ep; int iter = 0; retry: while (umount2(dir, MNT_DETACH) == 0) { } dp = opendir(dir); if (dp == NULL) { if (errno == EMFILE) { exitf("opendir(%s) failed due to NOFILE, exiting", dir); } exitf("opendir(%s) failed", dir); } while ((ep = readdir(dp))) { if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) continue; char filename[FILENAME_MAX]; snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name); struct stat st; if (lstat(filename, &st)) exitf("lstat(%s) failed", filename); if (S_ISDIR(st.st_mode)) { remove_dir(filename); continue; } int i; for (i = 0;; i++) { if (unlink(filename) == 0) break; if (errno == EROFS) { break; } if (errno != EBUSY || i > 100) exitf("unlink(%s) failed", filename); if (umount2(filename, MNT_DETACH)) exitf("umount(%s) failed", filename); } } closedir(dp); int i; for (i = 0;; i++) { if (rmdir(dir) == 0) break; if (i < 100) { if (errno == EROFS) { break; } if (errno == EBUSY) { if (umount2(dir, MNT_DETACH)) exitf("umount(%s) failed", dir); continue; } if (errno == ENOTEMPTY) { if (iter < 100) { iter++; goto retry; } } } exitf("rmdir(%s) failed", dir); } } static void execute_one(); extern unsigned long long procid; static void loop() { char cgroupdir[64]; snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/unified/syz%llu", procid); char cgroupdir_cpu[64]; snprintf(cgroupdir_cpu, sizeof(cgroupdir_cpu), "/syzcgroup/cpu/syz%llu", procid); char cgroupdir_net[64]; snprintf(cgroupdir_net, sizeof(cgroupdir_net), "/syzcgroup/net/syz%llu", procid); if (mkdir(cgroupdir, 0777)) { } if (mkdir(cgroupdir_cpu, 0777)) { } if (mkdir(cgroupdir_net, 0777)) { } int pid = getpid(); char procs_file[128]; snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir); if (!write_file(procs_file, "%d", pid)) { } snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_cpu); if (!write_file(procs_file, "%d", pid)) { } snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_net); if (!write_file(procs_file, "%d", pid)) { } int iter; for (iter = 0;; iter++) { char cwdbuf[32]; sprintf(cwdbuf, "./%d", iter); if (mkdir(cwdbuf, 0777)) fail("failed to mkdir"); int pid = fork(); if (pid < 0) fail("clone failed"); if (pid == 0) { prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); setpgrp(); if (chdir(cwdbuf)) fail("failed to chdir"); if (symlink(cgroupdir, "./cgroup")) { } if (symlink(cgroupdir_cpu, "./cgroup.cpu")) { } if (symlink(cgroupdir_net, "./cgroup.net")) { } execute_one(); doexit(0); } int status = 0; uint64_t start = current_time_ms(); for (;;) { int res = waitpid(-1, &status, __WALL | WNOHANG); if (res == pid) { break; } usleep(1000); if (current_time_ms() - start < 3 * 1000) continue; kill(-pid, SIGKILL); kill(pid, SIGKILL); while (waitpid(-1, &status, __WALL) != pid) { } break; } remove_dir(cwdbuf); } } struct thread_t { int created, running, call; pthread_t th; }; static struct thread_t threads[16]; static void execute_call(int call); static int running; static int collide; static void* thr(void* arg) { struct thread_t* th = (struct thread_t*)arg; for (;;) { while (!__atomic_load_n(&th->running, __ATOMIC_ACQUIRE)) syscall(SYS_futex, &th->running, FUTEX_WAIT, 0, 0); execute_call(th->call); __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED); __atomic_store_n(&th->running, 0, __ATOMIC_RELEASE); syscall(SYS_futex, &th->running, FUTEX_WAKE); } return 0; } static void execute(int num_calls) { int call, thread; running = 0; for (call = 0; call < num_calls; call++) { for (thread = 0; thread < sizeof(threads) / sizeof(threads[0]); thread++) { struct thread_t* th = &threads[thread]; if (!th->created) { th->created = 1; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 128 << 10); pthread_create(&th->th, &attr, thr, th); } if (!__atomic_load_n(&th->running, __ATOMIC_ACQUIRE)) { th->call = call; __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED); __atomic_store_n(&th->running, 1, __ATOMIC_RELEASE); syscall(SYS_futex, &th->running, FUTEX_WAKE); if (collide && call % 2) break; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 20 * 1000 * 1000; syscall(SYS_futex, &th->running, FUTEX_WAIT, 1, &ts); if (running) usleep((call == num_calls - 1) ? 10000 : 1000); break; } } } } uint64_t r[1] = {0xffffffffffffffff}; unsigned long long procid; void execute_call(int call) { long res; switch (call) { case 0: res = syscall(__NR_socket, 0xa, 1, 0); if (res != -1) r[0] = res; break; case 1: syscall(__NR_ioctl, r[0], 0x4000008912, 0x20000100); break; case 2: NONFAILING(*(uint16_t*)0x20000040 = 4); NONFAILING(*(uint32_t*)0x20000044 = htobe32(0xe0000001)); NONFAILING(*(uint16_t*)0x20000048 = htobe16(0x4e23)); NONFAILING(*(uint32_t*)0x2000004c = 1); NONFAILING(memcpy( (void*)0x20000050, "\x6c\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16)); NONFAILING(*(uint32_t*)0x20000060 = 0x28); NONFAILING(*(uint32_t*)0x20000064 = 6); NONFAILING(*(uint32_t*)0x20000068 = htobe32(0x28)); syscall(__NR_setsockopt, -1, 0, 0x48f, 0x20000040, 0x2c); break; case 3: NONFAILING(memcpy((void*)0x20001340, "\x6d\x61\x6e\x67\x6c\x65\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00", 32)); NONFAILING(*(uint32_t*)0x20001360 = 0x1f); NONFAILING(*(uint32_t*)0x20001364 = 6); NONFAILING(*(uint32_t*)0x20001368 = 0x598); NONFAILING(*(uint32_t*)0x2000136c = 0x300); NONFAILING(*(uint32_t*)0x20001370 = 0x3e8); NONFAILING(*(uint32_t*)0x20001374 = 0); NONFAILING(*(uint32_t*)0x20001378 = 0x240); NONFAILING(*(uint32_t*)0x2000137c = 0x300); NONFAILING(*(uint32_t*)0x20001380 = 0x500); NONFAILING(*(uint32_t*)0x20001384 = 0x500); NONFAILING(*(uint32_t*)0x20001388 = 0x500); NONFAILING(*(uint32_t*)0x2000138c = 0x500); NONFAILING(*(uint32_t*)0x20001390 = 0x500); NONFAILING(*(uint32_t*)0x20001394 = 6); NONFAILING(*(uint64_t*)0x20001398 = 0x200012c0); NONFAILING(*(uint32_t*)0x200013a0 = htobe32(0xe0000001)); NONFAILING(*(uint32_t*)0x200013a4 = htobe32(-1)); NONFAILING(*(uint32_t*)0x200013a8 = htobe32(-1)); NONFAILING(*(uint32_t*)0x200013ac = htobe32(0)); NONFAILING(memcpy( (void*)0x200013b0, "\x76\x65\x74\x68\x30\x5f\x74\x6f\x5f\x74\x65\x61\x6d\x00\x00\x00", 16)); NONFAILING(memcpy( (void*)0x200013c0, "\x6e\x72\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16)); NONFAILING(*(uint8_t*)0x200013dc = 0); NONFAILING(*(uint8_t*)0x200013fa = -1); NONFAILING(*(uint16_t*)0x2000140a = 0x7f); NONFAILING(*(uint8_t*)0x2000140c = 2); NONFAILING(*(uint8_t*)0x2000140d = 0x41); NONFAILING(*(uint32_t*)0x20001418 = 0); NONFAILING(*(uint16_t*)0x2000141c = 0xe8); NONFAILING(*(uint16_t*)0x2000141e = 0x110); NONFAILING(*(uint32_t*)0x20001420 = 0); NONFAILING(*(uint64_t*)0x20001428 = 0); NONFAILING(*(uint64_t*)0x20001430 = 0); NONFAILING(*(uint16_t*)0x20001438 = 0x50); NONFAILING(memcpy((void*)0x2000143a, "\x6f\x73\x66\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x20001457 = 0); NONFAILING(memcpy((void*)0x20001458, "\x73\x79\x7a\x30\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00", 32)); NONFAILING(*(uint32_t*)0x20001478 = 2); NONFAILING(*(uint32_t*)0x2000147c = 0xe); NONFAILING(*(uint32_t*)0x20001480 = 8); NONFAILING(*(uint32_t*)0x20001484 = 2); NONFAILING(*(uint16_t*)0x20001488 = 0x28); NONFAILING(memcpy((void*)0x2000148a, "\x44\x53\x43\x50\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x200014a7 = 0); NONFAILING(*(uint8_t*)0x200014a8 = 0xe); NONFAILING(*(uint8_t*)0x200014b0 = 0); NONFAILING(*(uint8_t*)0x200014b1 = 0); NONFAILING(*(uint8_t*)0x200014b2 = 0); NONFAILING(*(uint8_t*)0x200014b3 = 0); NONFAILING(*(uint8_t*)0x200014b4 = 0); NONFAILING(*(uint8_t*)0x200014b5 = 0); NONFAILING(*(uint8_t*)0x200014b6 = 0); NONFAILING(*(uint8_t*)0x200014b7 = 0); NONFAILING(*(uint8_t*)0x200014b8 = 0); NONFAILING(*(uint8_t*)0x200014b9 = 0); NONFAILING(*(uint8_t*)0x200014ba = 0); NONFAILING(*(uint8_t*)0x200014bb = 0); NONFAILING(*(uint8_t*)0x200014bc = 0); NONFAILING(*(uint8_t*)0x200014bd = 0); NONFAILING(*(uint8_t*)0x200014be = 0); NONFAILING(*(uint8_t*)0x200014bf = 0); NONFAILING(*(uint8_t*)0x200014c0 = 0); NONFAILING(*(uint8_t*)0x200014c1 = 0); NONFAILING(*(uint8_t*)0x200014c2 = 0); NONFAILING(*(uint8_t*)0x200014c3 = 0); NONFAILING(*(uint8_t*)0x200014c4 = 0); NONFAILING(*(uint8_t*)0x200014c5 = 0); NONFAILING(*(uint8_t*)0x200014c6 = 0); NONFAILING(*(uint8_t*)0x200014c7 = 0); NONFAILING(*(uint8_t*)0x200014c8 = 0); NONFAILING(*(uint8_t*)0x200014c9 = 0); NONFAILING(*(uint8_t*)0x200014ca = 0); NONFAILING(*(uint8_t*)0x200014cb = 0); NONFAILING(*(uint8_t*)0x200014cc = 0); NONFAILING(*(uint8_t*)0x200014cd = 0); NONFAILING(*(uint8_t*)0x200014ce = 0); NONFAILING(*(uint8_t*)0x200014cf = 0); NONFAILING(*(uint8_t*)0x200014d0 = 0); NONFAILING(*(uint8_t*)0x200014d1 = 0); NONFAILING(*(uint8_t*)0x200014d2 = 0); NONFAILING(*(uint8_t*)0x200014d3 = 0); NONFAILING(*(uint8_t*)0x200014d4 = 0); NONFAILING(*(uint8_t*)0x200014d5 = 0); NONFAILING(*(uint8_t*)0x200014d6 = 0); NONFAILING(*(uint8_t*)0x200014d7 = 0); NONFAILING(*(uint8_t*)0x200014d8 = 0); NONFAILING(*(uint8_t*)0x200014d9 = 0); NONFAILING(*(uint8_t*)0x200014da = 0); NONFAILING(*(uint8_t*)0x200014db = 0); NONFAILING(*(uint8_t*)0x200014dc = 0); NONFAILING(*(uint8_t*)0x200014dd = 0); NONFAILING(*(uint8_t*)0x200014de = 0); NONFAILING(*(uint8_t*)0x200014df = 0); NONFAILING(*(uint8_t*)0x200014e0 = 0); NONFAILING(*(uint8_t*)0x200014e1 = 0); NONFAILING(*(uint8_t*)0x200014e2 = 0); NONFAILING(*(uint8_t*)0x200014e3 = 0); NONFAILING(*(uint8_t*)0x200014e4 = 0); NONFAILING(*(uint8_t*)0x200014e5 = 0); NONFAILING(*(uint8_t*)0x200014e6 = 0); NONFAILING(*(uint8_t*)0x200014e7 = 0); NONFAILING(*(uint8_t*)0x200014e8 = 0); NONFAILING(*(uint8_t*)0x200014e9 = 0); NONFAILING(*(uint8_t*)0x200014ea = 0); NONFAILING(*(uint8_t*)0x200014eb = 0); NONFAILING(*(uint8_t*)0x200014ec = 0); NONFAILING(*(uint8_t*)0x200014ed = 0); NONFAILING(*(uint8_t*)0x200014ee = 0); NONFAILING(*(uint8_t*)0x200014ef = 0); NONFAILING(*(uint8_t*)0x200014f0 = 0); NONFAILING(*(uint8_t*)0x200014f1 = 0); NONFAILING(*(uint8_t*)0x200014f2 = 0); NONFAILING(*(uint8_t*)0x200014f3 = 0); NONFAILING(*(uint8_t*)0x200014f4 = 0); NONFAILING(*(uint8_t*)0x200014f5 = 0); NONFAILING(*(uint8_t*)0x200014f6 = 0); NONFAILING(*(uint8_t*)0x200014f7 = 0); NONFAILING(*(uint8_t*)0x200014f8 = 0); NONFAILING(*(uint8_t*)0x200014f9 = 0); NONFAILING(*(uint8_t*)0x200014fa = 0); NONFAILING(*(uint8_t*)0x200014fb = 0); NONFAILING(*(uint8_t*)0x200014fc = 0); NONFAILING(*(uint8_t*)0x200014fd = 0); NONFAILING(*(uint8_t*)0x200014fe = 0); NONFAILING(*(uint8_t*)0x200014ff = 0); NONFAILING(*(uint8_t*)0x20001500 = 0); NONFAILING(*(uint8_t*)0x20001501 = 0); NONFAILING(*(uint8_t*)0x20001502 = 0); NONFAILING(*(uint8_t*)0x20001503 = 0); NONFAILING(*(uint32_t*)0x20001528 = 0); NONFAILING(*(uint16_t*)0x2000152c = 0x100); NONFAILING(*(uint16_t*)0x2000152e = 0x130); NONFAILING(*(uint32_t*)0x20001530 = 0); NONFAILING(*(uint64_t*)0x20001538 = 0); NONFAILING(*(uint64_t*)0x20001540 = 0); NONFAILING(*(uint16_t*)0x20001548 = 0x28); NONFAILING(memcpy((void*)0x2000154a, "\x69\x63\x6d\x70\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x20001567 = 0); NONFAILING(*(uint8_t*)0x20001568 = 0x12); NONFAILING(*(uint8_t*)0x20001569 = 0x80); NONFAILING(*(uint8_t*)0x2000156a = 0xfe); NONFAILING(*(uint8_t*)0x2000156b = 1); NONFAILING(*(uint16_t*)0x20001570 = 0x40); NONFAILING(memcpy((void*)0x20001572, "\x73\x65\x74\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x2000158f = 0); NONFAILING(*(uint16_t*)0x20001590 = 0xc2); NONFAILING(*(uint32_t*)0x20001594 = 5); NONFAILING(*(uint32_t*)0x20001598 = 0xffffff01); NONFAILING(*(uint32_t*)0x2000159c = 1); NONFAILING(*(uint32_t*)0x200015a0 = 5); NONFAILING(*(uint32_t*)0x200015a4 = 0x35); NONFAILING(*(uint32_t*)0x200015a8 = 1); NONFAILING(*(uint8_t*)0x200015ac = 0); NONFAILING(*(uint8_t*)0x200015ad = 6); NONFAILING(*(uint16_t*)0x200015ae = 6); NONFAILING(*(uint16_t*)0x200015b0 = 0x30); NONFAILING(memcpy((void*)0x200015b2, "\x54\x50\x52\x4f\x58\x59\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x200015cf = 0); NONFAILING(*(uint32_t*)0x200015d0 = 0x80000001); NONFAILING(*(uint32_t*)0x200015d4 = 0x80000000); NONFAILING(*(uint32_t*)0x200015d8 = htobe32(0xe0000001)); NONFAILING(*(uint16_t*)0x200015dc = htobe16(0x4e24)); NONFAILING(*(uint8_t*)0x200015e0 = 0); NONFAILING(*(uint8_t*)0x200015e1 = 0); NONFAILING(*(uint8_t*)0x200015e2 = 0); NONFAILING(*(uint8_t*)0x200015e3 = 0); NONFAILING(*(uint8_t*)0x200015e4 = 0); NONFAILING(*(uint8_t*)0x200015e5 = 0); NONFAILING(*(uint8_t*)0x200015e6 = 0); NONFAILING(*(uint8_t*)0x200015e7 = 0); NONFAILING(*(uint8_t*)0x200015e8 = 0); NONFAILING(*(uint8_t*)0x200015e9 = 0); NONFAILING(*(uint8_t*)0x200015ea = 0); NONFAILING(*(uint8_t*)0x200015eb = 0); NONFAILING(*(uint8_t*)0x200015ec = 0); NONFAILING(*(uint8_t*)0x200015ed = 0); NONFAILING(*(uint8_t*)0x200015ee = 0); NONFAILING(*(uint8_t*)0x200015ef = 0); NONFAILING(*(uint8_t*)0x200015f0 = 0); NONFAILING(*(uint8_t*)0x200015f1 = 0); NONFAILING(*(uint8_t*)0x200015f2 = 0); NONFAILING(*(uint8_t*)0x200015f3 = 0); NONFAILING(*(uint8_t*)0x200015f4 = 0); NONFAILING(*(uint8_t*)0x200015f5 = 0); NONFAILING(*(uint8_t*)0x200015f6 = 0); NONFAILING(*(uint8_t*)0x200015f7 = 0); NONFAILING(*(uint8_t*)0x200015f8 = 0); NONFAILING(*(uint8_t*)0x200015f9 = 0); NONFAILING(*(uint8_t*)0x200015fa = 0); NONFAILING(*(uint8_t*)0x200015fb = 0); NONFAILING(*(uint8_t*)0x200015fc = 0); NONFAILING(*(uint8_t*)0x200015fd = 0); NONFAILING(*(uint8_t*)0x200015fe = 0); NONFAILING(*(uint8_t*)0x200015ff = 0); NONFAILING(*(uint8_t*)0x20001600 = 0); NONFAILING(*(uint8_t*)0x20001601 = 0); NONFAILING(*(uint8_t*)0x20001602 = 0); NONFAILING(*(uint8_t*)0x20001603 = 0); NONFAILING(*(uint8_t*)0x20001604 = 0); NONFAILING(*(uint8_t*)0x20001605 = 0); NONFAILING(*(uint8_t*)0x20001606 = 0); NONFAILING(*(uint8_t*)0x20001607 = 0); NONFAILING(*(uint8_t*)0x20001608 = 0); NONFAILING(*(uint8_t*)0x20001609 = 0); NONFAILING(*(uint8_t*)0x2000160a = 0); NONFAILING(*(uint8_t*)0x2000160b = 0); NONFAILING(*(uint8_t*)0x2000160c = 0); NONFAILING(*(uint8_t*)0x2000160d = 0); NONFAILING(*(uint8_t*)0x2000160e = 0); NONFAILING(*(uint8_t*)0x2000160f = 0); NONFAILING(*(uint8_t*)0x20001610 = 0); NONFAILING(*(uint8_t*)0x20001611 = 0); NONFAILING(*(uint8_t*)0x20001612 = 0); NONFAILING(*(uint8_t*)0x20001613 = 0); NONFAILING(*(uint8_t*)0x20001614 = 0); NONFAILING(*(uint8_t*)0x20001615 = 0); NONFAILING(*(uint8_t*)0x20001616 = 0); NONFAILING(*(uint8_t*)0x20001617 = 0); NONFAILING(*(uint8_t*)0x20001618 = 0); NONFAILING(*(uint8_t*)0x20001619 = 0); NONFAILING(*(uint8_t*)0x2000161a = 0); NONFAILING(*(uint8_t*)0x2000161b = 0); NONFAILING(*(uint8_t*)0x2000161c = 0); NONFAILING(*(uint8_t*)0x2000161d = 0); NONFAILING(*(uint8_t*)0x2000161e = 0); NONFAILING(*(uint8_t*)0x2000161f = 0); NONFAILING(*(uint8_t*)0x20001620 = 0); NONFAILING(*(uint8_t*)0x20001621 = 0); NONFAILING(*(uint8_t*)0x20001622 = 0); NONFAILING(*(uint8_t*)0x20001623 = 0); NONFAILING(*(uint8_t*)0x20001624 = 0); NONFAILING(*(uint8_t*)0x20001625 = 0); NONFAILING(*(uint8_t*)0x20001626 = 0); NONFAILING(*(uint8_t*)0x20001627 = 0); NONFAILING(*(uint8_t*)0x20001628 = 0); NONFAILING(*(uint8_t*)0x20001629 = 0); NONFAILING(*(uint8_t*)0x2000162a = 0); NONFAILING(*(uint8_t*)0x2000162b = 0); NONFAILING(*(uint8_t*)0x2000162c = 0); NONFAILING(*(uint8_t*)0x2000162d = 0); NONFAILING(*(uint8_t*)0x2000162e = 0); NONFAILING(*(uint8_t*)0x2000162f = 0); NONFAILING(*(uint8_t*)0x20001630 = 0); NONFAILING(*(uint8_t*)0x20001631 = 0); NONFAILING(*(uint8_t*)0x20001632 = 0); NONFAILING(*(uint8_t*)0x20001633 = 0); NONFAILING(*(uint32_t*)0x20001658 = 0); NONFAILING(*(uint16_t*)0x2000165c = 0x98); NONFAILING(*(uint16_t*)0x2000165e = 0xc0); NONFAILING(*(uint32_t*)0x20001660 = 0); NONFAILING(*(uint64_t*)0x20001668 = 0); NONFAILING(*(uint64_t*)0x20001670 = 0); NONFAILING(*(uint16_t*)0x20001678 = 0x28); NONFAILING(memcpy((void*)0x2000167a, "\x54\x54\x4c\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x20001697 = 0); NONFAILING(*(uint8_t*)0x20001698 = 0); NONFAILING(*(uint8_t*)0x20001699 = 0x9a); NONFAILING(*(uint32_t*)0x200016a0 = htobe32(0)); NONFAILING(*(uint8_t*)0x200016a4 = 0xac); NONFAILING(*(uint8_t*)0x200016a5 = 0x14); NONFAILING(*(uint8_t*)0x200016a6 = 0x14); NONFAILING(*(uint8_t*)0x200016a7 = 0xbb); NONFAILING(*(uint32_t*)0x200016a8 = htobe32(-1)); NONFAILING(*(uint32_t*)0x200016ac = htobe32(-1)); NONFAILING(memcpy( (void*)0x200016b0, "\x74\x65\x71\x6c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16)); NONFAILING(memcpy( (void*)0x200016c0, "\x69\x70\x5f\x76\x74\x69\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16)); NONFAILING(*(uint8_t*)0x200016dc = -1); NONFAILING(*(uint8_t*)0x200016fa = 0); NONFAILING(*(uint16_t*)0x2000170a = 0x2f); NONFAILING(*(uint8_t*)0x2000170c = 1); NONFAILING(*(uint8_t*)0x2000170d = 0x20); NONFAILING(*(uint32_t*)0x20001718 = 0); NONFAILING(*(uint16_t*)0x2000171c = 0xc0); NONFAILING(*(uint16_t*)0x2000171e = 0xe8); NONFAILING(*(uint32_t*)0x20001720 = 0); NONFAILING(*(uint64_t*)0x20001728 = 0); NONFAILING(*(uint64_t*)0x20001730 = 0); NONFAILING(*(uint16_t*)0x20001738 = 0x28); NONFAILING(memcpy((void*)0x2000173a, "\x72\x70\x66\x69\x6c\x74\x65\x72\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x20001757 = 0); NONFAILING(*(uint8_t*)0x20001758 = 8); NONFAILING(*(uint16_t*)0x20001760 = 0x28); NONFAILING(memcpy((void*)0x20001762, "\x54\x54\x4c\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x2000177f = 0); NONFAILING(*(uint8_t*)0x20001780 = 0); NONFAILING(*(uint8_t*)0x20001781 = 4); NONFAILING(*(uint32_t*)0x20001788 = htobe32(-1)); NONFAILING(*(uint8_t*)0x2000178c = 0xac); NONFAILING(*(uint8_t*)0x2000178d = 0x14); NONFAILING(*(uint8_t*)0x2000178e = 0x14); NONFAILING(*(uint8_t*)0x2000178f = 0xaa); NONFAILING(*(uint32_t*)0x20001790 = htobe32(0xff)); NONFAILING(*(uint32_t*)0x20001794 = htobe32(-1)); NONFAILING(memcpy( (void*)0x20001798, "\x74\x65\x61\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x31\x00\x00\x00\x00", 16)); NONFAILING(memcpy( (void*)0x200017a8, "\x62\x72\x69\x64\x67\x65\x5f\x73\x6c\x61\x76\x65\x5f\x30\x00\x00", 16)); NONFAILING(*(uint8_t*)0x200017c4 = -1); NONFAILING(*(uint8_t*)0x200017e2 = -1); NONFAILING(*(uint16_t*)0x200017f2 = 0x29); NONFAILING(*(uint8_t*)0x200017f4 = 2); NONFAILING(*(uint8_t*)0x200017f5 = 0x40); NONFAILING(*(uint32_t*)0x20001800 = 0); NONFAILING(*(uint16_t*)0x20001804 = 0xf0); NONFAILING(*(uint16_t*)0x20001806 = 0x118); NONFAILING(*(uint32_t*)0x20001808 = 0); NONFAILING(*(uint64_t*)0x20001810 = 0); NONFAILING(*(uint64_t*)0x20001818 = 0); NONFAILING(*(uint16_t*)0x20001820 = 0x30); NONFAILING(memcpy((void*)0x20001822, "\x61\x68\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x2000183f = 0); NONFAILING(*(uint32_t*)0x20001840 = 4); NONFAILING(*(uint32_t*)0x20001844 = 0xe83); NONFAILING(*(uint8_t*)0x20001848 = 0); NONFAILING(*(uint16_t*)0x20001850 = 0x28); NONFAILING(memcpy((void*)0x20001852, "\x72\x70\x66\x69\x6c\x74\x65\x72\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x2000186f = 0); NONFAILING(*(uint8_t*)0x20001870 = 0xf); NONFAILING(*(uint16_t*)0x20001878 = 0x28); NONFAILING(memcpy((void*)0x2000187a, "\x54\x54\x4c\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x20001897 = 0); NONFAILING(*(uint8_t*)0x20001898 = 0); NONFAILING(*(uint8_t*)0x20001899 = 1); NONFAILING(*(uint8_t*)0x200018a0 = 0); NONFAILING(*(uint8_t*)0x200018a1 = 0); NONFAILING(*(uint8_t*)0x200018a2 = 0); NONFAILING(*(uint8_t*)0x200018a3 = 0); NONFAILING(*(uint8_t*)0x200018a4 = 0); NONFAILING(*(uint8_t*)0x200018a5 = 0); NONFAILING(*(uint8_t*)0x200018a6 = 0); NONFAILING(*(uint8_t*)0x200018a7 = 0); NONFAILING(*(uint8_t*)0x200018a8 = 0); NONFAILING(*(uint8_t*)0x200018a9 = 0); NONFAILING(*(uint8_t*)0x200018aa = 0); NONFAILING(*(uint8_t*)0x200018ab = 0); NONFAILING(*(uint8_t*)0x200018ac = 0); NONFAILING(*(uint8_t*)0x200018ad = 0); NONFAILING(*(uint8_t*)0x200018ae = 0); NONFAILING(*(uint8_t*)0x200018af = 0); NONFAILING(*(uint8_t*)0x200018b0 = 0); NONFAILING(*(uint8_t*)0x200018b1 = 0); NONFAILING(*(uint8_t*)0x200018b2 = 0); NONFAILING(*(uint8_t*)0x200018b3 = 0); NONFAILING(*(uint8_t*)0x200018b4 = 0); NONFAILING(*(uint8_t*)0x200018b5 = 0); NONFAILING(*(uint8_t*)0x200018b6 = 0); NONFAILING(*(uint8_t*)0x200018b7 = 0); NONFAILING(*(uint8_t*)0x200018b8 = 0); NONFAILING(*(uint8_t*)0x200018b9 = 0); NONFAILING(*(uint8_t*)0x200018ba = 0); NONFAILING(*(uint8_t*)0x200018bb = 0); NONFAILING(*(uint8_t*)0x200018bc = 0); NONFAILING(*(uint8_t*)0x200018bd = 0); NONFAILING(*(uint8_t*)0x200018be = 0); NONFAILING(*(uint8_t*)0x200018bf = 0); NONFAILING(*(uint8_t*)0x200018c0 = 0); NONFAILING(*(uint8_t*)0x200018c1 = 0); NONFAILING(*(uint8_t*)0x200018c2 = 0); NONFAILING(*(uint8_t*)0x200018c3 = 0); NONFAILING(*(uint8_t*)0x200018c4 = 0); NONFAILING(*(uint8_t*)0x200018c5 = 0); NONFAILING(*(uint8_t*)0x200018c6 = 0); NONFAILING(*(uint8_t*)0x200018c7 = 0); NONFAILING(*(uint8_t*)0x200018c8 = 0); NONFAILING(*(uint8_t*)0x200018c9 = 0); NONFAILING(*(uint8_t*)0x200018ca = 0); NONFAILING(*(uint8_t*)0x200018cb = 0); NONFAILING(*(uint8_t*)0x200018cc = 0); NONFAILING(*(uint8_t*)0x200018cd = 0); NONFAILING(*(uint8_t*)0x200018ce = 0); NONFAILING(*(uint8_t*)0x200018cf = 0); NONFAILING(*(uint8_t*)0x200018d0 = 0); NONFAILING(*(uint8_t*)0x200018d1 = 0); NONFAILING(*(uint8_t*)0x200018d2 = 0); NONFAILING(*(uint8_t*)0x200018d3 = 0); NONFAILING(*(uint8_t*)0x200018d4 = 0); NONFAILING(*(uint8_t*)0x200018d5 = 0); NONFAILING(*(uint8_t*)0x200018d6 = 0); NONFAILING(*(uint8_t*)0x200018d7 = 0); NONFAILING(*(uint8_t*)0x200018d8 = 0); NONFAILING(*(uint8_t*)0x200018d9 = 0); NONFAILING(*(uint8_t*)0x200018da = 0); NONFAILING(*(uint8_t*)0x200018db = 0); NONFAILING(*(uint8_t*)0x200018dc = 0); NONFAILING(*(uint8_t*)0x200018dd = 0); NONFAILING(*(uint8_t*)0x200018de = 0); NONFAILING(*(uint8_t*)0x200018df = 0); NONFAILING(*(uint8_t*)0x200018e0 = 0); NONFAILING(*(uint8_t*)0x200018e1 = 0); NONFAILING(*(uint8_t*)0x200018e2 = 0); NONFAILING(*(uint8_t*)0x200018e3 = 0); NONFAILING(*(uint8_t*)0x200018e4 = 0); NONFAILING(*(uint8_t*)0x200018e5 = 0); NONFAILING(*(uint8_t*)0x200018e6 = 0); NONFAILING(*(uint8_t*)0x200018e7 = 0); NONFAILING(*(uint8_t*)0x200018e8 = 0); NONFAILING(*(uint8_t*)0x200018e9 = 0); NONFAILING(*(uint8_t*)0x200018ea = 0); NONFAILING(*(uint8_t*)0x200018eb = 0); NONFAILING(*(uint8_t*)0x200018ec = 0); NONFAILING(*(uint8_t*)0x200018ed = 0); NONFAILING(*(uint8_t*)0x200018ee = 0); NONFAILING(*(uint8_t*)0x200018ef = 0); NONFAILING(*(uint8_t*)0x200018f0 = 0); NONFAILING(*(uint8_t*)0x200018f1 = 0); NONFAILING(*(uint8_t*)0x200018f2 = 0); NONFAILING(*(uint8_t*)0x200018f3 = 0); NONFAILING(*(uint32_t*)0x200018f4 = 0); NONFAILING(*(uint16_t*)0x200018f8 = 0x70); NONFAILING(*(uint16_t*)0x200018fa = 0x98); NONFAILING(*(uint32_t*)0x200018fc = 0); NONFAILING(*(uint64_t*)0x20001900 = 0); NONFAILING(*(uint64_t*)0x20001908 = 0); NONFAILING(*(uint16_t*)0x20001910 = 0x28); NONFAILING(memcpy((void*)0x20001912, "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00", 29)); NONFAILING(*(uint8_t*)0x2000192f = 0); NONFAILING(*(uint32_t*)0x20001930 = 0xfffffffe); syscall(__NR_setsockopt, -1, 0, 0x40, 0x20001340, 0x5f8); break; case 4: NONFAILING(*(uint32_t*)0x20001240 = 8); NONFAILING(*(uint32_t*)0x20001244 = 0x1ff); syscall(__NR_open_by_handle_at, -1, 0x20001240, 0x402000); break; case 5: NONFAILING(*(uint32_t*)0x20000140 = 0x40); syscall(__NR_getsockopt, -1, 0, 0x480, 0x20000080, 0x20000140); break; case 6: syscall(__NR_clone, 0, 0x20000000, 0x200000c0, 0x20000100, 0x20000140); break; case 7: syscall(__NR_wait4, -1, 0, 0x60000000, 0x20000180); break; } } void execute_one() { execute(8); collide = 1; execute(8); } int main() { syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0); install_segv_handler(); char* cwd = get_current_dir_name(); for (;;) { if (chdir(cwd)) fail("failed to chdir"); use_temporary_dir(); int pid = do_sandbox_namespace(); int status = 0; while (waitpid(pid, &status, __WALL) != pid) { } } }