Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // autogenerated by syzkaller (https://github.com/google/syzkaller)
- #define _GNU_SOURCE
- #include <dirent.h>
- #include <endian.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <stdarg.h>
- #include <stdbool.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/prctl.h>
- #include <sys/stat.h>
- #include <sys/syscall.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <time.h>
- #include <unistd.h>
- static void sleep_ms(uint64_t ms)
- {
- usleep(ms * 1000);
- }
- static uint64_t current_time_ms(void)
- {
- struct timespec ts;
- if (clock_gettime(CLOCK_MONOTONIC, &ts))
- exit(1);
- return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
- }
- 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 long syz_open_dev(volatile long a0, volatile long a1, volatile long a2)
- {
- if (a0 == 0xc || a0 == 0xb) {
- char buf[128];
- sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1,
- (uint8_t)a2);
- return open(buf, O_RDWR, 0);
- } else {
- char buf[1024];
- char* hash;
- strncpy(buf, (char*)a0, sizeof(buf) - 1);
- buf[sizeof(buf) - 1] = 0;
- while ((hash = strchr(buf, '#'))) {
- *hash = '0' + (char)(a1 % 10);
- a1 /= 10;
- }
- return open(buf, a2, 0);
- }
- }
- static void kill_and_wait(int pid, int* status)
- {
- kill(-pid, SIGKILL);
- kill(pid, SIGKILL);
- for (int i = 0; i < 100; i++) {
- if (waitpid(-1, status, WNOHANG | __WALL) == pid)
- return;
- usleep(1000);
- }
- DIR* dir = opendir("/sys/fs/fuse/connections");
- if (dir) {
- for (;;) {
- struct dirent* ent = readdir(dir);
- if (!ent)
- break;
- if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
- continue;
- char abort[300];
- snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
- ent->d_name);
- int fd = open(abort, O_WRONLY);
- if (fd == -1) {
- continue;
- }
- if (write(fd, abort, 1) < 0) {
- }
- close(fd);
- }
- closedir(dir);
- } else {
- }
- while (waitpid(-1, status, __WALL) != pid) {
- }
- }
- static void setup_test()
- {
- prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
- setpgrp();
- write_file("/proc/self/oom_score_adj", "1000");
- }
- static void setup_sysctl()
- {
- char mypid[32];
- snprintf(mypid, sizeof(mypid), "%d", getpid());
- struct {
- const char* name;
- const char* data;
- } files[] = {
- {"/sys/kernel/debug/x86/nmi_longest_ns", "10000000000"},
- {"/proc/sys/kernel/hung_task_check_interval_secs", "20"},
- {"/proc/sys/net/core/bpf_jit_kallsyms", "1"},
- {"/proc/sys/net/core/bpf_jit_harden", "0"},
- {"/proc/sys/kernel/kptr_restrict", "0"},
- {"/proc/sys/kernel/softlockup_all_cpu_backtrace", "1"},
- {"/proc/sys/fs/mount-max", "100"},
- {"/proc/sys/vm/oom_dump_tasks", "0"},
- {"/proc/sys/debug/exception-trace", "0"},
- {"/proc/sys/kernel/printk", "7 4 1 3"},
- {"/proc/sys/kernel/keys/gc_delay", "1"},
- {"/proc/sys/vm/oom_kill_allocating_task", "1"},
- {"/proc/sys/kernel/ctrl-alt-del", "0"},
- {"/proc/sys/kernel/cad_pid", mypid},
- };
- for (size_t i = 0; i < sizeof(files) / sizeof(files[0]); i++) {
- if (!write_file(files[i].name, files[i].data))
- printf("write to %s failed: %s\n", files[i].name, strerror(errno));
- }
- }
- static void execute_one(void);
- #define WAIT_FLAGS __WALL
- static void loop(void)
- {
- int iter = 0;
- for (;; iter++) {
- int pid = fork();
- if (pid < 0)
- exit(1);
- if (pid == 0) {
- setup_test();
- execute_one();
- exit(0);
- }
- int status = 0;
- uint64_t start = current_time_ms();
- for (;;) {
- if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
- break;
- sleep_ms(1);
- if (current_time_ms() - start < 5000)
- continue;
- kill_and_wait(pid, &status);
- break;
- }
- }
- }
- uint64_t r[1] = {0xffffffffffffffff};
- void execute_one(void)
- {
- intptr_t res = 0;
- memcpy((void*)0x20000080, "/dev/sg#\000", 9);
- res = -1;
- res = syz_open_dev(/*dev=*/0x20000080, /*id=*/0, /*flags=*/0);
- if (res != -1)
- r[0] = res;
- memcpy(
- (void*)0x200000c0,
- "\x00\x00\x00\x00\x02\x00\x00\x00\x85\x08\x91\x9e\x10\x09\x77\x0b\xd7\x99"
- "\xeb\xe3\x0f\x18\x24\xfe\xc7\x24\x6a\xe5\xb2\xf7\xe0\x1a\xec\x07\x9b\x85"
- "\x5e\x33\x1f\x6a\x99\xdb\xfe\x84\x38\xea\xe1\x51\x85\x25\xb9\x28\xae\xcb"
- "\x82\x5d\x8b\x86\xbb\x87\x17\xd9\x6b\x52\xd2\xd4\x26\xa0\x02\x53\x7d\x4d"
- "\xb5\x56\x10\xbb\xcd\xb0\xab\x76\xf8\x3a\xfa\x41\x8e\x29\x55\x8d\x7d\xbe"
- "\x26\xbe\xb7\x01\x65\x86\x2c\x60\x46\x18\x68\x81\x33\xf2\xa9\x6e\x87\xd9"
- "\x11\x8d\xa2\x9e\xbb\xad\x80\xbf\x3b\xf6\x48\x6b\xab\xfc\x72\xcf\xe5\x0e"
- "\x10\x0b\x9d\x37\xfe\x81\x81\xbc\x02\xc7\x94\x63\x3e\x07\x91\x6c\xef\x43"
- "\x31\x11\x34\x64\x82\x95\xfc\xbd\x0e\x95\x5a\x3b\x40\x7c\x86\xd4\xb1\xb9"
- "\x5f\x5e\x50\x7a\x2b\x0c\x4a\x2f\x30\x21\x3e\xc6\xc7\x36\xd1\x75\x97\xc5"
- "\x5c\x7f\x7d\xe3\x68\x7d\xed\x7d\x0e\x58\xd9\x36\xaa\xc5\x3a\xcc\x72\x9f"
- "\x8b\xf6\x60\xae\xc6\x95\x3e\xf9\xdc\xad\x6e\x16\xd6",
- 211);
- syscall(__NR_ioctl, /*fd=*/r[0], /*cmd=*/1, /*arg=*/0x200000c0ul);
- }
- int main(void)
- {
- syscall(__NR_mmap, /*addr=*/0x1ffff000ul, /*len=*/0x1000ul, /*prot=*/0ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- syscall(__NR_mmap, /*addr=*/0x20000000ul, /*len=*/0x1000000ul,
- /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- syscall(__NR_mmap, /*addr=*/0x21000000ul, /*len=*/0x1000ul, /*prot=*/0ul,
- /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
- /*offset=*/0ul);
- setup_sysctl();
- loop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment