zzqq0103

Untitled

Mar 15th, 2024
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.09 KB | None | 0 0
  1. // autogenerated by syzkaller (https://github.com/google/syzkaller)
  2.  
  3. #define _GNU_SOURCE
  4.  
  5. #include <dirent.h>
  6. #include <endian.h>
  7. #include <errno.h>
  8. #include <fcntl.h>
  9. #include <signal.h>
  10. #include <stdarg.h>
  11. #include <stdbool.h>
  12. #include <stdint.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <sys/prctl.h>
  17. #include <sys/stat.h>
  18. #include <sys/syscall.h>
  19. #include <sys/types.h>
  20. #include <sys/wait.h>
  21. #include <time.h>
  22. #include <unistd.h>
  23.  
  24. static void sleep_ms(uint64_t ms)
  25. {
  26.   usleep(ms * 1000);
  27. }
  28.  
  29. static uint64_t current_time_ms(void)
  30. {
  31.   struct timespec ts;
  32.   if (clock_gettime(CLOCK_MONOTONIC, &ts))
  33.     exit(1);
  34.   return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
  35. }
  36.  
  37. static bool write_file(const char* file, const char* what, ...)
  38. {
  39.   char buf[1024];
  40.   va_list args;
  41.   va_start(args, what);
  42.   vsnprintf(buf, sizeof(buf), what, args);
  43.   va_end(args);
  44.   buf[sizeof(buf) - 1] = 0;
  45.   int len = strlen(buf);
  46.   int fd = open(file, O_WRONLY | O_CLOEXEC);
  47.   if (fd == -1)
  48.     return false;
  49.   if (write(fd, buf, len) != len) {
  50.     int err = errno;
  51.     close(fd);
  52.     errno = err;
  53.     return false;
  54.   }
  55.   close(fd);
  56.   return true;
  57. }
  58.  
  59. static long syz_open_dev(volatile long a0, volatile long a1, volatile long a2)
  60. {
  61.   if (a0 == 0xc || a0 == 0xb) {
  62.     char buf[128];
  63.     sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1,
  64.             (uint8_t)a2);
  65.     return open(buf, O_RDWR, 0);
  66.   } else {
  67.     char buf[1024];
  68.     char* hash;
  69.     strncpy(buf, (char*)a0, sizeof(buf) - 1);
  70.     buf[sizeof(buf) - 1] = 0;
  71.     while ((hash = strchr(buf, '#'))) {
  72.       *hash = '0' + (char)(a1 % 10);
  73.       a1 /= 10;
  74.     }
  75.     return open(buf, a2, 0);
  76.   }
  77. }
  78.  
  79. static void kill_and_wait(int pid, int* status)
  80. {
  81.   kill(-pid, SIGKILL);
  82.   kill(pid, SIGKILL);
  83.   for (int i = 0; i < 100; i++) {
  84.     if (waitpid(-1, status, WNOHANG | __WALL) == pid)
  85.       return;
  86.     usleep(1000);
  87.   }
  88.   DIR* dir = opendir("/sys/fs/fuse/connections");
  89.   if (dir) {
  90.     for (;;) {
  91.       struct dirent* ent = readdir(dir);
  92.       if (!ent)
  93.         break;
  94.       if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
  95.         continue;
  96.       char abort[300];
  97.       snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
  98.                ent->d_name);
  99.       int fd = open(abort, O_WRONLY);
  100.       if (fd == -1) {
  101.         continue;
  102.       }
  103.       if (write(fd, abort, 1) < 0) {
  104.       }
  105.       close(fd);
  106.     }
  107.     closedir(dir);
  108.   } else {
  109.   }
  110.   while (waitpid(-1, status, __WALL) != pid) {
  111.   }
  112. }
  113.  
  114. static void setup_test()
  115. {
  116.   prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  117.   setpgrp();
  118.   write_file("/proc/self/oom_score_adj", "1000");
  119. }
  120.  
  121. static void setup_sysctl()
  122. {
  123.   char mypid[32];
  124.   snprintf(mypid, sizeof(mypid), "%d", getpid());
  125.   struct {
  126.     const char* name;
  127.     const char* data;
  128.   } files[] = {
  129.       {"/sys/kernel/debug/x86/nmi_longest_ns", "10000000000"},
  130.       {"/proc/sys/kernel/hung_task_check_interval_secs", "20"},
  131.       {"/proc/sys/net/core/bpf_jit_kallsyms", "1"},
  132.       {"/proc/sys/net/core/bpf_jit_harden", "0"},
  133.       {"/proc/sys/kernel/kptr_restrict", "0"},
  134.       {"/proc/sys/kernel/softlockup_all_cpu_backtrace", "1"},
  135.       {"/proc/sys/fs/mount-max", "100"},
  136.       {"/proc/sys/vm/oom_dump_tasks", "0"},
  137.       {"/proc/sys/debug/exception-trace", "0"},
  138.       {"/proc/sys/kernel/printk", "7 4 1 3"},
  139.       {"/proc/sys/kernel/keys/gc_delay", "1"},
  140.       {"/proc/sys/vm/oom_kill_allocating_task", "1"},
  141.       {"/proc/sys/kernel/ctrl-alt-del", "0"},
  142.       {"/proc/sys/kernel/cad_pid", mypid},
  143.   };
  144.   for (size_t i = 0; i < sizeof(files) / sizeof(files[0]); i++) {
  145.     if (!write_file(files[i].name, files[i].data))
  146.       printf("write to %s failed: %s\n", files[i].name, strerror(errno));
  147.   }
  148. }
  149.  
  150. static void execute_one(void);
  151.  
  152. #define WAIT_FLAGS __WALL
  153.  
  154. static void loop(void)
  155. {
  156.   int iter = 0;
  157.   for (;; iter++) {
  158.     int pid = fork();
  159.     if (pid < 0)
  160.       exit(1);
  161.     if (pid == 0) {
  162.       setup_test();
  163.       execute_one();
  164.       exit(0);
  165.     }
  166.     int status = 0;
  167.     uint64_t start = current_time_ms();
  168.     for (;;) {
  169.       if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
  170.         break;
  171.       sleep_ms(1);
  172.       if (current_time_ms() - start < 5000)
  173.         continue;
  174.       kill_and_wait(pid, &status);
  175.       break;
  176.     }
  177.   }
  178. }
  179.  
  180. uint64_t r[1] = {0xffffffffffffffff};
  181.  
  182. void execute_one(void)
  183. {
  184.   intptr_t res = 0;
  185.   memcpy((void*)0x20000080, "/dev/sg#\000", 9);
  186.   res = -1;
  187.   res = syz_open_dev(/*dev=*/0x20000080, /*id=*/0, /*flags=*/0);
  188.   if (res != -1)
  189.     r[0] = res;
  190.   memcpy(
  191.       (void*)0x200000c0,
  192.       "\x00\x00\x00\x00\x02\x00\x00\x00\x85\x08\x91\x9e\x10\x09\x77\x0b\xd7\x99"
  193.       "\xeb\xe3\x0f\x18\x24\xfe\xc7\x24\x6a\xe5\xb2\xf7\xe0\x1a\xec\x07\x9b\x85"
  194.       "\x5e\x33\x1f\x6a\x99\xdb\xfe\x84\x38\xea\xe1\x51\x85\x25\xb9\x28\xae\xcb"
  195.       "\x82\x5d\x8b\x86\xbb\x87\x17\xd9\x6b\x52\xd2\xd4\x26\xa0\x02\x53\x7d\x4d"
  196.       "\xb5\x56\x10\xbb\xcd\xb0\xab\x76\xf8\x3a\xfa\x41\x8e\x29\x55\x8d\x7d\xbe"
  197.       "\x26\xbe\xb7\x01\x65\x86\x2c\x60\x46\x18\x68\x81\x33\xf2\xa9\x6e\x87\xd9"
  198.       "\x11\x8d\xa2\x9e\xbb\xad\x80\xbf\x3b\xf6\x48\x6b\xab\xfc\x72\xcf\xe5\x0e"
  199.       "\x10\x0b\x9d\x37\xfe\x81\x81\xbc\x02\xc7\x94\x63\x3e\x07\x91\x6c\xef\x43"
  200.       "\x31\x11\x34\x64\x82\x95\xfc\xbd\x0e\x95\x5a\x3b\x40\x7c\x86\xd4\xb1\xb9"
  201.       "\x5f\x5e\x50\x7a\x2b\x0c\x4a\x2f\x30\x21\x3e\xc6\xc7\x36\xd1\x75\x97\xc5"
  202.       "\x5c\x7f\x7d\xe3\x68\x7d\xed\x7d\x0e\x58\xd9\x36\xaa\xc5\x3a\xcc\x72\x9f"
  203.       "\x8b\xf6\x60\xae\xc6\x95\x3e\xf9\xdc\xad\x6e\x16\xd6",
  204.       211);
  205.   syscall(__NR_ioctl, /*fd=*/r[0], /*cmd=*/1, /*arg=*/0x200000c0ul);
  206. }
  207. int main(void)
  208. {
  209.   syscall(__NR_mmap, /*addr=*/0x1ffff000ul, /*len=*/0x1000ul, /*prot=*/0ul,
  210.           /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
  211.           /*offset=*/0ul);
  212.   syscall(__NR_mmap, /*addr=*/0x20000000ul, /*len=*/0x1000000ul,
  213.           /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul,
  214.           /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
  215.           /*offset=*/0ul);
  216.   syscall(__NR_mmap, /*addr=*/0x21000000ul, /*len=*/0x1000ul, /*prot=*/0ul,
  217.           /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/-1,
  218.           /*offset=*/0ul);
  219.   setup_sysctl();
  220.   loop();
  221.   return 0;
  222. }
  223.  
Advertisement
Add Comment
Please, Sign In to add comment