// https://syzkaller.appspot.com/bug?id=7b1188e36d188e8dccdbcc72e0600e00d585cfa3 // autogenerated by syzkaller (https://github.com/google/syzkaller) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #ifndef __NR_clone3 #define __NR_clone3 435 #endif #define USLEEP_FORKED_CHILD (3 * 50 * 1000) static long handle_clone_ret(long ret) { if (ret != 0) { return ret; } usleep(USLEEP_FORKED_CHILD); syscall(__NR_exit, 0); while (1) { } } #define MAX_CLONE_ARGS_BYTES 256 static long syz_clone3(volatile long a0, volatile long a1) { unsigned long copy_size = a1; if (copy_size < sizeof(uint64_t) || copy_size > MAX_CLONE_ARGS_BYTES) return -1; char clone_args[MAX_CLONE_ARGS_BYTES]; memcpy(&clone_args, (void*)a0, copy_size); uint64_t* flags = (uint64_t*)&clone_args; *flags &= ~CLONE_VM; return handle_clone_ret((long)syscall(__NR_clone3, &clone_args, copy_size)); } uint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}; int main(void) { syscall(__NR_mmap, /*addr=*/0x1ffffffff000ul, /*len=*/0x1000, /*prot=*/0ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); syscall(__NR_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000, /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); syscall(__NR_mmap, /*addr=*/0x200001000000ul, /*len=*/0x1000, /*prot=*/0ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); const char* reason; (void)reason; intptr_t res = 0; if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { } // socket$pppl2tp arguments: [ // domain: const = 0x18 (8 bytes) // type: const = 0x1 (8 bytes) // proto: const = 0x1 (4 bytes) // ] // returns sock_pppl2tp res = syscall(__NR_socket, /*domain=*/0x18ul, /*type=*/1ul, /*proto=*/1); if (res != -1) r[0] = res; // socket$inet6_udp arguments: [ // domain: const = 0xa (8 bytes) // type: const = 0x2 (8 bytes) // proto: const = 0x0 (4 bytes) // ] // returns sock_udp6 res = syscall(__NR_socket, /*domain=*/0xaul, /*type=*/2ul, /*proto=*/0); if (res != -1) r[1] = res; // connect$pppl2tp arguments: [ // fd: sock_pppl2tp (resource) // addr: ptr[in, sockaddr_pppl2tp] { // union sockaddr_pppl2tp { // pppol2tpin6: sockaddr_pppl2tp_t[pppol2tpin6_addr] { // sa_family: const = 0x18 (2 bytes) // sa_protocol: const = 0x1 (4 bytes) // addr: pppol2tpin6_addr_t[int16] { // pid: const = 0x0 (4 bytes) // fd: sock (resource) // s_tunnel: int16 = 0x8 (2 bytes) // s_session: int16 = 0x0 (2 bytes) // d_tunnel: int16 = 0x0 (2 bytes) // d_session: int16 = 0x0 (2 bytes) // addr: sockaddr_in6 { // family: const = 0xa (2 bytes) // port: int16be = 0x0 (2 bytes) // flow: int32be = 0x0 (4 bytes) // addr: union ipv6_addr { // rand_addr: buffer: {20 01 00 00 00 00 00 00 00 00 00 00 00 // 00 00 02} (length 0x10) // } // scope: int32 = 0x0 (4 bytes) // } // } // } // } // } // addrlen: len = 0x32 (8 bytes) // ] *(uint16_t*)0x200000000240 = 0x18; *(uint32_t*)0x200000000242 = 1; *(uint32_t*)0x200000000246 = 0; *(uint32_t*)0x20000000024a = r[1]; *(uint16_t*)0x20000000024e = 8; *(uint16_t*)0x200000000250 = 0; *(uint16_t*)0x200000000252 = 0; *(uint16_t*)0x200000000254 = 0; *(uint16_t*)0x200000000256 = 0xa; *(uint16_t*)0x200000000258 = htobe16(0); *(uint32_t*)0x20000000025a = htobe32(0); memcpy((void*)0x20000000025e, " \001\000\000\000\000\000\000\000\000\000\000\000\000\000\002", 16); *(uint32_t*)0x20000000026e = 0; syscall(__NR_connect, /*fd=*/r[0], /*addr=*/0x200000000240ul, /*addrlen=*/0x32ul); // sendfile arguments: [ // fdout: fd (resource) // fdin: fd (resource) // off: ptr[inout, intptr] { // intptr = 0x3 (8 bytes) // } // count: intptr = 0xac5 (8 bytes) // ] *(uint64_t*)0x200000000040 = 3; syscall(__NR_sendfile, /*fdout=*/(intptr_t)-1, /*fdin=*/(intptr_t)-1, /*off=*/0x200000000040ul, /*count=*/0xac5ul); // syz_clone3 arguments: [ // args: ptr[in, clone_args] { // clone_args { // flags: clone3_flags = 0x23800000 (8 bytes) // pidfd: ptr[out, fd_pidfd] { // fd_pidfd (resource) // } // child_tid: nil // parent_tid: nil // exit_signal: align64[signalno] { // v: int32 = 0x27 (4 bytes) // pad = 0x0 (4 bytes) // } // stack: nil // stack_size: bytesize = 0x0 (8 bytes) // tls: nil // set_tid: nil // set_tid_size: len = 0x0 (8 bytes) // cgroup: align64[fd_cgroup] { // v: fd_cgroup (resource) // pad = 0x0 (4 bytes) // } // } // } // size: bytesize = 0x58 (8 bytes) // ] // returns pid *(uint64_t*)0x200000000900 = 0x23800000; *(uint64_t*)0x200000000908 = 0x200000000040; *(uint64_t*)0x200000000910 = 0; *(uint64_t*)0x200000000918 = 0; *(uint32_t*)0x200000000920 = 0x27; *(uint64_t*)0x200000000928 = 0; *(uint64_t*)0x200000000930 = 0; *(uint64_t*)0x200000000938 = 0; *(uint64_t*)0x200000000940 = 0; *(uint64_t*)0x200000000948 = 0; *(uint32_t*)0x200000000950 = -1; res = -1; res = syz_clone3(/*args=*/0x200000000900, /*size=*/0x58); if (res != -1) r[2] = *(uint32_t*)0x200000000040; // ioctl$EXT4_IOC_GETFSUUID arguments: [ // fd: fd (resource) // cmd: const = 0x80487436 (4 bytes) // arg: nil // ] syscall(__NR_ioctl, /*fd=*/r[2], /*cmd=*/0x80487436, /*arg=*/0ul); return 0; }