KASAN: global-out-of-bounds Read in srcu_gp_start_if_needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear Maintainers, When using our customized Syzkaller to fuzz the
latest Linux kernel, the following crash was triggered.

Kernel commit: v6.14-rc4 (Commits on Feb 24, 2025)
Kernel Config : https://github.com/Strforexc/LinuxKernelbug/blob/main/.config
Kernel Log: attachment

I’ve encountered a KASAN-reported global-out-of-bounds read in Linux
kernel 6.14.0-rc4, involving the RCU subsystem and bcachefs. Here are
the details:

A global-out-of-bounds read of size 1 was detected at address
ffffffff8b8e8d55 in string_nocheck (lib/vsprintf.c:632), called from
string (lib/vsprintf.c:714). The buggy address belongs to
str__rcu__trace_system_name+0x815/0xb40, triggered by a kworker task.

The issue occurs during a bcachefs transaction commit
(bch2_trans_commit), which enqueues an RCU callback via
srcu_gp_start_if_needed. The out-of-bounds access happens in
string_nocheck, likely during a printk or tracepoint operation
(vprintk_emit), triggered by a lockdep warning (__warn_printk). The
variable str__rcu__trace_system_name (size 0xb40) is overrun at offset
0x815, suggesting a string handling bug in RCU or bcachefs debug
output.

The bug was observed in a QEMU environment during
btree_interior_update_work execution in bcachefs. It may involve
filesystem operations (e.g., key cache dropping) under load. I don’t
have a precise reproducer yet but can assist with testing.

Could RCU or bcachefs maintainers investigate? This might be a
tracepoint or printk format string issue in srcu_gp_start_if_needed or
related code. I suspect an invalid index into
str__rcu__trace_system_name or a pointer corruption. Happy to provide
more logs or test patches.

If you fix this issue, please add the following tag to the commit:
Reported-by: Zhizhuo Tang <strforexctzzchange@xxxxxxxxxxx>, Jianzhou
Zhao <xnxc22xnxc22@xxxxxx>, Haoran Liu <cherest_san@xxxxxxx>
------------[ cut here ]------------
==================================================================
BUG: KASAN: global-out-of-bounds in string_nocheck lib/vsprintf.c:632 [inline]
BUG: KASAN: global-out-of-bounds in string+0x4b3/0x500 lib/vsprintf.c:714
Read of size 1 at addr ffffffff8b8e8d55 by task kworker/u10:0/28

CPU: 1 UID: 0 PID: 28 Comm: kworker/u10:0 Not tainted 6.14.0-rc4 #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
Workqueue: btree_update btree_interior_update_work
Call Trace:
 <TASK>
 __dump_stack lib/dump_stack.c:94 [inline]
 dump_stack_lvl+0x116/0x1b0 lib/dump_stack.c:120
 print_address_description.constprop.0+0x2c/0x420 mm/kasan/report.c:408
 print_report+0xaa/0x270 mm/kasan/report.c:521
 kasan_report+0xbd/0x100 mm/kasan/report.c:634
 string_nocheck lib/vsprintf.c:632 [inline]
 string+0x4b3/0x500 lib/vsprintf.c:714
 vsnprintf+0x620/0x1120 lib/vsprintf.c:2843
 vprintk_store+0x34f/0xb90 kernel/printk/printk.c:2279
 vprintk_emit+0x151/0x330 kernel/printk/printk.c:2408
 __warn_printk+0x162/0x320 kernel/panic.c:797
 look_up_lock_class+0xad/0x160 kernel/locking/lockdep.c:938
 register_lock_class+0xb2/0xfc0 kernel/locking/lockdep.c:1292
 __lock_acquire+0xc3/0x16a0 kernel/locking/lockdep.c:5103
 lock_acquire+0x181/0x3a0 kernel/locking/lockdep.c:5851
 __raw_spin_trylock include/linux/spinlock_api_smp.h:90 [inline]
 _raw_spin_trylock+0x76/0xa0 kernel/locking/spinlock.c:138
 spin_lock_irqsave_sdp_contention kernel/rcu/srcutree.c:375 [inline]
 srcu_gp_start_if_needed+0x1a9/0x5f0 kernel/rcu/srcutree.c:1270
 __call_rcu fs/bcachefs/rcu_pending.c:76 [inline]
 __rcu_pending_enqueue fs/bcachefs/rcu_pending.c:497 [inline]
 rcu_pending_enqueue+0x686/0xd30 fs/bcachefs/rcu_pending.c:531
 bkey_cached_free+0xfd/0x170 fs/bcachefs/btree_key_cache.c:115
 bch2_btree_key_cache_drop+0xe7/0x770 fs/bcachefs/btree_key_cache.c:613
 bch2_trans_commit_write_locked.constprop.0+0x2bc6/0x3bc0
fs/bcachefs/btree_trans_commit.c:794
 do_bch2_trans_commit.isra.0+0x7a6/0x12f0 fs/bcachefs/btree_trans_commit.c:866
 __bch2_trans_commit+0x1018/0x18e0 fs/bcachefs/btree_trans_commit.c:1070
 bch2_trans_commit fs/bcachefs/btree_update.h:183 [inline]
 btree_update_nodes_written+0x1352/0x2210
fs/bcachefs/btree_update_interior.c:708
 btree_interior_update_work+0xda/0x100 fs/bcachefs/btree_update_interior.c:846
 process_one_work+0x109d/0x18c0 kernel/workqueue.c:3236
 process_scheduled_works kernel/workqueue.c:3317 [inline]
 worker_thread+0x677/0xe90 kernel/workqueue.c:3398
 kthread+0x3b3/0x760 kernel/kthread.c:464
 ret_from_fork+0x48/0x80 arch/x86/kernel/process.c:148
 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
 </TASK>

The buggy address belongs to the variable:
 str__rcu__trace_system_name+0x815/0xb40

The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0xb8e8
flags: 0xfff00000002000(reserved|node=0|zone=1|lastcpupid=0x7ff)
raw: 00fff00000002000 ffffea00002e3a08 ffffea00002e3a08 0000000000000000
raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner info is not present (never set?)

Memory state around the buggy address:
 ffffffff8b8e8c00: f9 f9 f9 f9 00 00 00 00 03 f9 f9 f9 f9 f9 f9 f9
 ffffffff8b8e8c80: 00 00 00 00 00 00 01 f9 f9 f9 f9 f9 00 00 00 07
>ffffffff8b8e8d00: f9 f9 f9 f9 00 00 00 03 f9 f9 f9 f9 00 00 00 06
                                                 ^
 ffffffff8b8e8d80: f9 f9 f9 f9 00 00 03 f9 f9 f9 f9 f9 00 00 01 f9
 ffffffff8b8e8e00: f9 f9 f9 f9 00 01 f9 f9 f9 f9 f9 f9 00 00 00 00
==================================================================
Thanks,
Zhizhuo Tang

Attachment: log
Description: Binary data


[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux