/report0 Secret
Created
April 9, 2024 12:35
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
================================================================== | |
BUG: KASAN: slab-use-after-free in __mutex_lock_common kernel/locking/mutex.c:587 [inline] | |
BUG: KASAN: slab-use-after-free in __mutex_lock+0xfe/0xd70 kernel/locking/mutex.c:752 | |
Read of size 8 at addr ffff8880333e4130 by task jffs2_gcd_mtd0/18996 | |
CPU: 0 PID: 18996 Comm: jffs2_gcd_mtd0 Not tainted 6.8.0-08951-gfe46a7dd189e-dirty #6 | |
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-debian-1.16.2-1 04/01/2014 | |
Call Trace: | |
<TASK> | |
__dump_stack lib/dump_stack.c:88 [inline] | |
dump_stack_lvl+0x250/0x380 lib/dump_stack.c:114 | |
print_address_description mm/kasan/report.c:377 [inline] | |
print_report+0x169/0x550 mm/kasan/report.c:488 | |
kasan_report+0x143/0x180 mm/kasan/report.c:601 | |
__mutex_lock_common kernel/locking/mutex.c:587 [inline] | |
__mutex_lock+0xfe/0xd70 kernel/locking/mutex.c:752 | |
jffs2_garbage_collect_pass+0xb3/0x2130 fs/jffs2/gc.c:134 | |
jffs2_garbage_collect_thread+0x691/0x730 fs/jffs2/background.c:155 | |
kthread+0x310/0x3b0 kernel/kthread.c:388 | |
ret_from_fork+0x52/0x80 arch/x86/kernel/process.c:147 | |
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:243 | |
</TASK> | |
Allocated by task 18995: | |
kasan_save_stack mm/kasan/common.c:47 [inline] | |
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 | |
poison_kmalloc_redzone mm/kasan/common.c:370 [inline] | |
__kasan_kmalloc+0x98/0xb0 mm/kasan/common.c:387 | |
kasan_kmalloc include/linux/kasan.h:211 [inline] | |
kmalloc_trace+0x1db/0x360 mm/slub.c:3997 | |
kmalloc include/linux/slab.h:628 [inline] | |
kzalloc include/linux/slab.h:749 [inline] | |
jffs2_init_fs_context+0x54/0xd0 fs/jffs2/super.c:313 | |
alloc_fs_context+0x6a5/0x830 fs/fs_context.c:318 | |
do_new_mount+0x175/0xb90 fs/namespace.c:3331 | |
do_mount fs/namespace.c:3692 [inline] | |
__do_sys_mount fs/namespace.c:3898 [inline] | |
__se_sys_mount+0x362/0x3d0 fs/namespace.c:3875 | |
do_syscall_64+0xfb/0x240 | |
entry_SYSCALL_64_after_hwframe+0x6d/0x75 | |
Freed by task 8213: | |
kasan_save_stack mm/kasan/common.c:47 [inline] | |
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 | |
kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:579 | |
poison_slab_object+0xa6/0xe0 mm/kasan/common.c:240 | |
__kasan_slab_free+0x37/0x60 mm/kasan/common.c:256 | |
kasan_slab_free include/linux/kasan.h:184 [inline] | |
slab_free_hook mm/slub.c:2106 [inline] | |
slab_free mm/slub.c:4280 [inline] | |
kfree+0x14a/0x380 mm/slub.c:4390 | |
deactivate_locked_super+0xcb/0x140 fs/super.c:472 | |
cleanup_mnt+0x444/0x4e0 fs/namespace.c:1267 | |
task_work_run+0x25c/0x320 kernel/task_work.c:180 | |
resume_user_mode_work include/linux/resume_user_mode.h:50 [inline] | |
exit_to_user_mode_loop kernel/entry/common.c:108 [inline] | |
exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline] | |
__syscall_exit_to_user_mode_work kernel/entry/common.c:201 [inline] | |
syscall_exit_to_user_mode+0x168/0x360 kernel/entry/common.c:212 | |
do_syscall_64+0x10a/0x240 arch/x86/entry/common.c:89 | |
entry_SYSCALL_64_after_hwframe+0x6d/0x75 | |
The buggy address belongs to the object at ffff8880333e4000 | |
which belongs to the cache kmalloc-4k of size 4096 | |
The buggy address is located 304 bytes inside of | |
freed 4096-byte region [ffff8880333e4000, ffff8880333e5000) | |
The buggy address belongs to the physical page: | |
page:ffffea0000ccf800 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x333e0 | |
head:ffffea0000ccf800 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 | |
anon flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff) | |
page_type: 0xffffffff() | |
raw: 00fff00000000840 ffff888015043040 0000000000000000 dead000000000001 | |
raw: 0000000000000000 0000000000040004 00000001ffffffff 0000000000000000 | |
page dumped because: kasan: bad access detected | |
page_owner tracks the page as allocated | |
page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd2040(__GFP_IO|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 4568, tgid 4568 (systemd-udevd), ts 81669718595, free_ts 81650637861 | |
set_page_owner include/linux/page_owner.h:31 [inline] | |
post_alloc_hook+0x1ea/0x210 mm/page_alloc.c:1533 | |
prep_new_page mm/page_alloc.c:1540 [inline] | |
get_page_from_freelist+0x33ea/0x3580 mm/page_alloc.c:3311 | |
__alloc_pages+0x256/0x680 mm/page_alloc.c:4569 | |
__alloc_pages_node include/linux/gfp.h:238 [inline] | |
alloc_pages_node include/linux/gfp.h:261 [inline] | |
alloc_slab_page+0x5f/0x160 mm/slub.c:2175 | |
allocate_slab mm/slub.c:2338 [inline] | |
new_slab+0x84/0x2f0 mm/slub.c:2391 | |
___slab_alloc+0xc73/0x1260 mm/slub.c:3525 | |
__slab_alloc mm/slub.c:3610 [inline] | |
__slab_alloc_node mm/slub.c:3663 [inline] | |
slab_alloc_node mm/slub.c:3835 [inline] | |
__do_kmalloc_node mm/slub.c:3965 [inline] | |
__kmalloc+0x2e5/0x4a0 mm/slub.c:3979 | |
kmalloc include/linux/slab.h:632 [inline] | |
tomoyo_realpath_from_path+0xd6/0x5e0 security/tomoyo/realpath.c:251 | |
tomoyo_get_realpath security/tomoyo/file.c:151 [inline] | |
tomoyo_path_perm+0x2be/0x760 security/tomoyo/file.c:822 | |
security_inode_getattr+0xdc/0x140 security/security.c:2263 | |
vfs_getattr+0x4b/0x440 fs/stat.c:173 | |
vfs_fstat fs/stat.c:198 [inline] | |
__do_sys_newfstat fs/stat.c:478 [inline] | |
__se_sys_newfstat fs/stat.c:475 [inline] | |
__x64_sys_newfstat+0x108/0x1c0 fs/stat.c:475 | |
do_syscall_64+0xfb/0x240 | |
entry_SYSCALL_64_after_hwframe+0x6d/0x75 | |
page last free pid 4568 tgid 4568 stack trace: | |
reset_page_owner include/linux/page_owner.h:24 [inline] | |
free_pages_prepare mm/page_alloc.c:1140 [inline] | |
free_unref_page_prepare+0x95d/0xa80 mm/page_alloc.c:2346 | |
free_unref_page+0x37/0x3f0 mm/page_alloc.c:2486 | |
discard_slab mm/slub.c:2437 [inline] | |
__put_partials+0xeb/0x130 mm/slub.c:2906 | |
put_cpu_partial+0x17c/0x250 mm/slub.c:2981 | |
__slab_free+0x2ea/0x3d0 mm/slub.c:4151 | |
qlink_free mm/kasan/quarantine.c:163 [inline] | |
qlist_free_all+0x5e/0xc0 mm/kasan/quarantine.c:179 | |
kasan_quarantine_reduce+0x14f/0x170 mm/kasan/quarantine.c:286 | |
__kasan_slab_alloc+0x23/0x80 mm/kasan/common.c:322 | |
kasan_slab_alloc include/linux/kasan.h:201 [inline] | |
slab_post_alloc_hook mm/slub.c:3798 [inline] | |
slab_alloc_node mm/slub.c:3845 [inline] | |
kmem_cache_alloc+0x174/0x340 mm/slub.c:3852 | |
getname_flags+0xc6/0x520 fs/namei.c:139 | |
do_sys_openat2+0xc1/0x1c0 fs/open.c:1400 | |
do_sys_open fs/open.c:1421 [inline] | |
__do_sys_openat fs/open.c:1437 [inline] | |
__se_sys_openat fs/open.c:1432 [inline] | |
__x64_sys_openat+0x246/0x2a0 fs/open.c:1432 | |
do_syscall_64+0xfb/0x240 | |
entry_SYSCALL_64_after_hwframe+0x6d/0x75 | |
Memory state around the buggy address: | |
ffff8880333e4000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb | |
ffff8880333e4080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb | |
>ffff8880333e4100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb | |
^ | |
ffff8880333e4180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb | |
ffff8880333e4200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb | |
================================================================== |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define _GNU_SOURCE | |
#include <endian.h> | |
#include <errno.h> | |
#include <fcntl.h> | |
#include <sched.h> | |
#include <stdarg.h> | |
#include <stdbool.h> | |
#include <stdint.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/mount.h> | |
#include <sys/prctl.h> | |
#include <sys/resource.h> | |
#include <sys/stat.h> | |
#include <sys/syscall.h> | |
#include <sys/time.h> | |
#include <sys/types.h> | |
#include <sys/wait.h> | |
#include <unistd.h> | |
#include <linux/capability.h> | |
#ifndef __NR_fsconfig | |
#define __NR_fsconfig 431 | |
#endif | |
#ifndef __NR_fspick | |
#define __NR_fspick 433 | |
#endif | |
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_common() { | |
if (mount(0, "/sys/fs/fuse/connections", "fusectl", 0, 0)) { | |
} | |
} | |
static void setup_binderfs() { | |
if (mkdir("/dev/binderfs", 0777)) { | |
} | |
if (mount("binder", "/dev/binderfs", "binder", 0, NULL)) { | |
} | |
if (symlink("/dev/binderfs", "./binderfs")) { | |
} | |
} | |
static void loop(); | |
static void sandbox_common() { | |
prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); | |
setsid(); | |
struct rlimit rlim; | |
rlim.rlim_cur = rlim.rlim_max = (200 << 20); | |
setrlimit(RLIMIT_AS, &rlim); | |
rlim.rlim_cur = rlim.rlim_max = 32 << 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 = 128 << 20; | |
setrlimit(RLIMIT_CORE, &rlim); | |
rlim.rlim_cur = rlim.rlim_max = 256; | |
setrlimit(RLIMIT_NOFILE, &rlim); | |
if (unshare(CLONE_NEWNS)) { | |
} | |
if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL)) { | |
} | |
if (unshare(CLONE_NEWIPC)) { | |
} | |
if (unshare(0x02000000)) { | |
} | |
if (unshare(CLONE_NEWUTS)) { | |
} | |
if (unshare(CLONE_SYSVSEM)) { | |
} | |
typedef struct { | |
const char* name; | |
const char* value; | |
} sysctl_t; | |
static const sysctl_t sysctls[] = { | |
{"/proc/sys/kernel/shmmax", "16777216"}, | |
{"/proc/sys/kernel/shmall", "536870912"}, | |
{"/proc/sys/kernel/shmmni", "1024"}, | |
{"/proc/sys/kernel/msgmax", "8192"}, | |
{"/proc/sys/kernel/msgmni", "1024"}, | |
{"/proc/sys/kernel/msgmnb", "1024"}, | |
{"/proc/sys/kernel/sem", "1024 1048576 500 1024"}, | |
}; | |
unsigned i; | |
for (i = 0; i < sizeof(sysctls) / sizeof(sysctls[0]); i++) | |
write_file(sysctls[i].name, sysctls[i].value); | |
} | |
static int wait_for_loop(int pid) { | |
if (pid < 0) | |
exit(1); | |
int status = 0; | |
while (waitpid(-1, &status, __WALL) != pid) { | |
} | |
return WEXITSTATUS(status); | |
} | |
static void drop_caps(void) { | |
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)) | |
exit(1); | |
const int drop = (1 << CAP_SYS_PTRACE) | (1 << CAP_SYS_NICE); | |
cap_data[0].effective &= ~drop; | |
cap_data[0].permitted &= ~drop; | |
cap_data[0].inheritable &= ~drop; | |
if (syscall(SYS_capset, &cap_hdr, &cap_data)) | |
exit(1); | |
} | |
static int do_sandbox_none(void) { | |
if (unshare(CLONE_NEWPID)) { | |
} | |
int pid = fork(); | |
if (pid != 0) | |
return wait_for_loop(pid); | |
setup_common(); | |
sandbox_common(); | |
drop_caps(); | |
if (unshare(CLONE_NEWNET)) { | |
} | |
write_file("/proc/sys/net/ipv4/ping_group_range", "0 65535"); | |
setup_binderfs(); | |
loop(); | |
exit(1); | |
} | |
static void setup_binfmt_misc() { | |
if (mount(0, "/proc/sys/fs/binfmt_misc", "binfmt_misc", 0, 0)) { | |
} | |
write_file("/proc/sys/fs/binfmt_misc/register", ":syz0:M:0:\x01::./file0:"); | |
write_file("/proc/sys/fs/binfmt_misc/register", | |
":syz1:M:1:\x02::./file0:POC"); | |
} | |
uint64_t r[1] = {0xffffffffffffffff}; | |
void loop(void) { | |
intptr_t res = 0; | |
memcpy((void*)0x200000c0, "./file0\000", 8); | |
syscall(__NR_mkdirat, /*fd=*/0xffffff9c, /*path=*/0x200000c0ul, /*mode=*/0ul); | |
memcpy((void*)0x20000040, "mtd", 3); | |
sprintf((char*)0x20000043, "0x%016llx", (long long)0); | |
memcpy((void*)0x200000c0, "./file0\000", 8); | |
memcpy((void*)0x20001200, "jffs2\000", 6); | |
syscall(__NR_mount, /*src=*/0x20000040ul, /*dst=*/0x200000c0ul, | |
/*type=*/0x20001200ul, /*flags=*/3ul, /*data=*/0ul); | |
memcpy((void*)0x20000380, "./file0/../file0\000", 17); | |
res = syscall(__NR_fspick, /*dfd=*/0xffffff9c, /*path=*/0x20000380ul, | |
/*flags=*/0ul); | |
if (res != -1) | |
r[0] = res; | |
syscall(__NR_fsconfig, /*fd=*/r[0], /*cmd=*/7ul, /*key=*/0ul, /*value=*/0ul, | |
/*aux=*/0ul); | |
} | |
int main(void) { | |
syscall(__NR_mmap, /*addr=*/0x1ffff000ul, /*len=*/0x1000ul, /*prot=*/0ul, | |
/*flags=*/0x32ul, /*fd=*/-1, /*offset=*/0ul); | |
syscall(__NR_mmap, /*addr=*/0x20000000ul, /*len=*/0x1000000ul, /*prot=*/7ul, | |
/*flags=*/0x32ul, /*fd=*/-1, /*offset=*/0ul); | |
syscall(__NR_mmap, /*addr=*/0x21000000ul, /*len=*/0x1000ul, /*prot=*/0ul, | |
/*flags=*/0x32ul, /*fd=*/-1, /*offset=*/0ul); | |
setup_binfmt_misc(); | |
do_sandbox_none(); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mkdirat(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00', 0x0) | |
mount(&(0x7f0000000040)=ANY=[@ANYBLOB='mtd', @ANYRESHEX=0x0], &(0x7f00000000c0)='./file0\x00', &(0x7f0000001200)='jffs2\x00', 0x3, 0x0) | |
r0 = fspick(0xffffffffffffff9c, &(0x7f0000000380)='./file0/../file0\x00', 0x0) | |
fsconfig$FSCONFIG_CMD_RECONFIGURE(r0, 0x7, 0x0, 0x0, 0x0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment