2024-04-13 00:50:34

by syzbot

[permalink] [raw]
Subject: [syzbot] [bpf?] [net?] KMSAN: uninit-value in sock_hash_delete_elem

Hello,

syzbot found the following issue on:

HEAD commit: fec50db7033e Linux 6.9-rc3
git tree: upstream
console+strace: https://syzkaller.appspot.com/x/log.txt?x=1425a483180000
kernel config: https://syzkaller.appspot.com/x/.config?x=13e7da432565d94c
dashboard link: https://syzkaller.appspot.com/bug?extid=c33bff5d5da1391df027
compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17b653d3180000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=159a2cf3180000

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/901017b36ccc/disk-fec50db7.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/16bfcf5618d3/vmlinux-fec50db7.xz
kernel image: https://storage.googleapis.com/syzbot-assets/dc9c5a1e7d02/bzImage-fec50db7.xz

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: [email protected]

=====================================================
BUG: KMSAN: uninit-value in spin_lock_bh include/linux/spinlock.h:356 [inline]
BUG: KMSAN: uninit-value in sock_hash_delete_elem+0x239/0x710 net/core/sock_map.c:945
spin_lock_bh include/linux/spinlock.h:356 [inline]
sock_hash_delete_elem+0x239/0x710 net/core/sock_map.c:945
____bpf_map_delete_elem kernel/bpf/helpers.c:77 [inline]
bpf_map_delete_elem+0x5c/0x80 kernel/bpf/helpers.c:73
___bpf_prog_run+0x13fe/0xe0f0 kernel/bpf/core.c:1997
__bpf_prog_run32+0xb2/0xe0 kernel/bpf/core.c:2236
bpf_dispatcher_nop_func include/linux/bpf.h:1234 [inline]
__bpf_prog_run include/linux/filter.h:657 [inline]
bpf_prog_run include/linux/filter.h:664 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:2381 [inline]
bpf_trace_run3+0x132/0x320 kernel/trace/bpf_trace.c:2421
__bpf_trace_block_bio_remap+0x34/0x50 include/trace/events/block.h:507
__traceiter_block_bio_remap+0xa5/0x160 include/trace/events/block.h:507
trace_block_bio_remap include/trace/events/block.h:507 [inline]
blk_partition_remap block/blk-core.c:571 [inline]
submit_bio_noacct+0x2449/0x2800 block/blk-core.c:762
submit_bio+0x58a/0x5b0 block/blk-core.c:879
ext4_io_submit fs/ext4/page-io.c:378 [inline]
io_submit_add_bh fs/ext4/page-io.c:419 [inline]
ext4_bio_write_folio+0x1e76/0x2e40 fs/ext4/page-io.c:563
mpage_submit_folio+0x351/0x4a0 fs/ext4/inode.c:1869
mpage_map_and_submit_buffers fs/ext4/inode.c:2115 [inline]
mpage_map_and_submit_extent fs/ext4/inode.c:2254 [inline]
ext4_do_writepages+0x3733/0x62e0 fs/ext4/inode.c:2679
ext4_writepages+0x312/0x830 fs/ext4/inode.c:2768
do_writepages+0x427/0xc30 mm/page-writeback.c:2612
__writeback_single_inode+0x10d/0x12c0 fs/fs-writeback.c:1650
writeback_sb_inodes+0xb48/0x1be0 fs/fs-writeback.c:1941
__writeback_inodes_wb+0x14c/0x440 fs/fs-writeback.c:2012
wb_writeback+0x4da/0xdf0 fs/fs-writeback.c:2119
wb_check_old_data_flush fs/fs-writeback.c:2223 [inline]
wb_do_writeback fs/fs-writeback.c:2276 [inline]
wb_workfn+0x110c/0x1940 fs/fs-writeback.c:2304
process_one_work kernel/workqueue.c:3254 [inline]
process_scheduled_works+0xa81/0x1bd0 kernel/workqueue.c:3335
worker_thread+0xea5/0x1560 kernel/workqueue.c:3416
kthread+0x3e2/0x540 kernel/kthread.c:388
ret_from_fork+0x6d/0x90 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:243

Local variable stack created at:
__bpf_prog_run32+0x43/0xe0 kernel/bpf/core.c:2236
bpf_dispatcher_nop_func include/linux/bpf.h:1234 [inline]
__bpf_prog_run include/linux/filter.h:657 [inline]
bpf_prog_run include/linux/filter.h:664 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:2381 [inline]
bpf_trace_run3+0x132/0x320 kernel/trace/bpf_trace.c:2421

CPU: 1 PID: 76 Comm: kworker/u8:5 Not tainted 6.9.0-rc3-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024
Workqueue: writeback wb_workfn (flush-8:0)
=====================================================


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at [email protected].

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup


2024-06-14 12:04:19

by syzbot

[permalink] [raw]
Subject: Re: [syzbot] [PATCH] [syzbot] [bpf?] [net?] KMSAN: uninit-value in sock_hash_delete_elem

For archival purposes, forwarding an incoming command email to
[email protected], [email protected].

***

Subject: [PATCH] [syzbot] [bpf?] [net?] KMSAN: uninit-value in sock_hash_delete_elem
Author: [email protected]

#syz test: https://linux.googlesource.com/linux/kernel/git/torvalds/linux 90302a82de094e0a51a2f51935ce27c4f1fe8dc4

2024-06-14 12:09:38

by syzbot

[permalink] [raw]
Subject: Re: [syzbot] [PATCH] [syzbot] [bpf?] [net?] KMSAN: uninit-value in sock_hash_delete_elem

For archival purposes, forwarding an incoming command email to
[email protected], [email protected].

***

Subject: [PATCH] [syzbot] [bpf?] [net?] KMSAN: uninit-value in sock_hash_delete_elem
Author: [email protected]

#syz test: https://linux.googlesource.com/linux/kernel/git/torvalds/linux e478cf26c556e4ab572ab0ab2306c986901dcd61

Some syzkaller repros create BPF code that passes as an argument to map
functions a pointer to uninitialized map key on bpf program stack. So far
handling calls to map functions did not check for not/initialized
pointed to values with some comments that it was not possible to tell the
pointer use be read or write op. This led to KMSAN report in a case of
reading not initialized map key.
The fix assumes ARG_PTR_TO_MAP_KEY arguments to map function calls from
BPF byte code are always of read type. For read access the value pointed
to by map key pointer is expected to be initialized. Otherwise the BPF
bytecode will not load.

Syzbot report

=====================================================
BUG: KMSAN: uninit-value in __htab_map_lookup_elem kernel/bpf/hashtab.c:691 [inline]
BUG: KMSAN: uninit-value in htab_lru_percpu_map_lookup_percpu_elem+0x3f8/0x630 kernel/bpf/hashtab.c:2343
__htab_map_lookup_elem kernel/bpf/hashtab.c:691 [inline]
htab_lru_percpu_map_lookup_percpu_elem+0x3f8/0x630 kernel/bpf/hashtab.c:2343
____bpf_map_lookup_percpu_elem kernel/bpf/helpers.c:133 [inline]
bpf_map_lookup_percpu_elem+0x67/0x90 kernel/bpf/helpers.c:130
___bpf_prog_run+0x13fe/0xe0f0 kernel/bpf/core.c:1997
__bpf_prog_run32+0xb2/0xe0 kernel/bpf/core.c:2236
bpf_dispatcher_nop_func include/linux/bpf.h:1234 [inline]
__bpf_prog_run include/linux/filter.h:657 [inline]
bpf_prog_run include/linux/filter.h:664 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:2381 [inline]
bpf_trace_run2+0x116/0x300 kernel/trace/bpf_trace.c:2420
__bpf_trace_kfree+0x29/0x40 include/trace/events/kmem.h:94
trace_kfree include/trace/events/kmem.h:94 [inline]
kfree+0x6a5/0xa30 mm/slub.c:4377
security_task_free+0x115/0x150 security/security.c:3032
__put_task_struct+0x17f/0x730 kernel/fork.c:976
put_task_struct include/linux/sched/task.h:138 [inline]
delayed_put_task_struct+0x8a/0x280 kernel/exit.c:229
rcu_do_batch kernel/rcu/tree.c:2196 [inline]
rcu_core+0xa59/0x1e70 kernel/rcu/tree.c:2471
rcu_core_si+0x12/0x20 kernel/rcu/tree.c:2488
__do_softirq+0x1c0/0x7d7 kernel/softirq.c:554
invoke_softirq kernel/softirq.c:428 [inline]
__irq_exit_rcu kernel/softirq.c:633 [inline]
irq_exit_rcu+0x6a/0x130 kernel/softirq.c:645
instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1043 [inline]
sysvec_apic_timer_interrupt+0x83/0x90 arch/x86/kernel/apic/apic.c:1043
asm_sysvec_apic_timer_interrupt+0x1f/0x30 arch/x86/include/asm/idtentry.h:702
__msan_metadata_ptr_for_load_8+0x31/0x40 mm/kmsan/instrumentation.c:92
filter_irq_stacks+0x60/0x1a0 kernel/stacktrace.c:397
stack_depot_save_flags+0x2c/0x6e0 lib/stackdepot.c:609
stack_depot_save+0x12/0x20 lib/stackdepot.c:685
__msan_poison_alloca+0x106/0x1b0 mm/kmsan/instrumentation.c:285
arch_local_save_flags arch/x86/include/asm/irqflags.h:67 [inline]
arch_local_irq_save arch/x86/include/asm/irqflags.h:103 [inline]
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:108 [inline]
_raw_spin_lock_irqsave+0x35/0xc0 kernel/locking/spinlock.c:162
remove_wait_queue+0x36/0x270 kernel/sched/wait.c:54
do_wait+0x34a/0x530 kernel/exit.c:1640
kernel_wait4+0x2ab/0x480 kernel/exit.c:1790
__do_sys_wait4 kernel/exit.c:1818 [inline]
__se_sys_wait4 kernel/exit.c:1814 [inline]
__x64_sys_wait4+0x14e/0x310 kernel/exit.c:1814
x64_sys_call+0x6e6/0x3b50 arch/x86/include/generated/asm/syscalls_64.h:62
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xcf/0x1e0 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f

Local variable stack created at:
__bpf_prog_run32+0x43/0xe0 kernel/bpf/core.c:2236
bpf_dispatcher_nop_func include/linux/bpf.h:1234 [inline]
__bpf_prog_run include/linux/filter.h:657 [inline]
bpf_prog_run include/linux/filter.h:664 [inline]
__bpf_trace_run kernel/trace/bpf_trace.c:2381 [inline]
bpf_trace_run2+0x116/0x300 kernel/trace/bpf_trace.c:2420

CPU: 0 PID: 5018 Comm: strace-static-x Not tainted 6.9.0-rc3-syzkaller-00355-g7efd0a74039f #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/27/2024
=====================================================
Signed-off-by: Wojciech Gładysz <[email protected]>
---
kernel/bpf/verifier.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 36ef8e96787e..13a9c2e2908a 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -7146,8 +7146,8 @@ static int check_stack_range_initialized(
* reads. However, if raw_mode is not set, we'll do extra
* checks below.
*/
- bounds_check_type = BPF_WRITE;
- clobber = true;
+ clobber = !meta || meta->raw_mode;
+ bounds_check_type = clobber ? BPF_WRITE : BPF_READ;
} else {
bounds_check_type = BPF_READ;
}
@@ -7230,8 +7230,7 @@ static int check_stack_range_initialized(
stype = &state->stack[spi].slot_type[slot % BPF_REG_SIZE];
if (*stype == STACK_MISC)
goto mark;
- if ((*stype == STACK_ZERO) ||
- (*stype == STACK_INVALID && env->allow_uninit_stack)) {
+ if (*stype == STACK_ZERO) {
if (clobber) {
/* helper can write anything into the stack */
*stype = STACK_MISC;
@@ -8748,6 +8747,8 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
meta->map_uid = reg->map_uid;
break;
case ARG_PTR_TO_MAP_KEY:
+ /* always mark read access */
+ meta->raw_mode = false;
/* bpf_map_xxx(..., map_ptr, ..., key) call:
* check that [key, key + map->key_size) are within
* stack limits and initialized
@@ -8763,7 +8764,7 @@ static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
}
err = check_helper_mem_access(env, regno,
meta->map_ptr->key_size, false,
- NULL);
+ meta);
break;
case ARG_PTR_TO_MAP_VALUE:
if (type_may_be_null(arg_type) && register_is_null(reg))
--
2.35.3