Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp679844pxa; Sat, 1 Aug 2020 02:42:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwOOvEb15gT0nkMnGDX5e14sq8zFLHRSZ90jGmwUdKEwlAH9BRrX5Lks5lm59Wj9JuWwZpM X-Received: by 2002:a17:906:3a9b:: with SMTP id y27mr7845777ejd.38.1596274964781; Sat, 01 Aug 2020 02:42:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596274964; cv=none; d=google.com; s=arc-20160816; b=KSzKVw/7dy70oHKR2SjzafO2mpREJJ3XRLWUPcgMjs5geYaxM30USLzlXGxjMLpXJM uEgXYKgVxxSKMqUhwo8W0nvqHb+kuff6kjF+FkWSmJrK3b0ICa6rNtx95Hb8YT7qV2p9 A6bRdPworGXbLcRJ2AQuHAy4dHO0WZSUiLZB4aFSZhmO61dSCR1EwjWxJhwz7fiF7msU lra+a+c7Ja0qujcHH2pB09MbRi4eWwxPq7DohIpnM1XrbkglyI2o5ovii/aRj/C/MC8m JAj4vB6lPfgIHd+CEIulPp8RrINgyaoajSTWxEv6eamKcK4D4pi+xZROHc0tFTWJWnCQ 7fyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:subject:cc:to:from:message-id:date; bh=uQBxyD4hFayjYTybCn45hQbozTFC7GxBPDZj478sl+A=; b=B3rtOX6SFfEwut7WC2UMhC80nxnMYJ/WZ3pWKYvf6NCtLIqdx5r0Yp3u45k1x0EMNw rT4O2lFO1tdKO63rZ03QsXtME8bosT5u82v4pMHbxpfyhzZ+lid9XR32FsPVAnMZLD0E wNsZL1YO2kdUSSNv+POm43oHoeLr2PUW2o0o68zFqCr9EPEyobRLZoQJ+Mc6kx4n9YzK lU8dGVilZKuqJVXd6FsXcvGrun4Pm27cKJsOU7kSxGWAKeC+i8Y10dBxhfkCXCm0DFR4 /MM0z1xtXRBl74VGhtEruy6y2hfJoBKvfN9UCtyQRJqoaFQ0O6xniGtXCfAF4aCPbX5U 4NJQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i2si7163032ejp.201.2020.08.01.02.42.21; Sat, 01 Aug 2020 02:42:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728714AbgHAJj4 (ORCPT + 99 others); Sat, 1 Aug 2020 05:39:56 -0400 Received: from mx2.suse.de ([195.135.220.15]:59964 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725931AbgHAJjz (ORCPT ); Sat, 1 Aug 2020 05:39:55 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id B0F64ABF1; Sat, 1 Aug 2020 09:40:07 +0000 (UTC) Date: Sat, 01 Aug 2020 11:39:53 +0200 Message-ID: From: Takashi Iwai To: Cc: , , , Subject: Re: [PATCH] ALSA: seq: KASAN: use-after-free Read in delete_and_unsubscribe_port In-Reply-To: <20200801062403.8005-1-qiang.zhang@windriver.com> References: <20200801062403.8005-1-qiang.zhang@windriver.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 01 Aug 2020 08:24:03 +0200, wrote: > > From: Zhang Qiang > > There is a potential race window,when a task acquire "src->list_mutex" > write sem,traverse the linked list to find "subs" objects through > parameter "info" in snd_seq_port_disconnect and then release this > write sem, before this task acquire write sem again,this write sem > may be acquired by another task, and get the same "subs" object through > the same "info" before, it could happen "use-after-free" later, so a > simple solution is to delete the object from the linked list when it > is found. > > BUG: KASAN: use-after-free in list_empty include/linux/list.h:282 [inline] > BUG: KASAN: use-after-free in delete_and_unsubscribe_port+0x8b/0x450 > sound/core/seq/seq_ports.c:530 > Read of size 8 at addr ffff888098523060 by task syz-executor.0/7202 > > Call Trace: > __dump_stack lib/dump_stack.c:77 [inline] > dump_stack+0x1f0/0x31e lib/dump_stack.c:118 > print_address_description+0x66/0x5a0 mm/kasan/report.c:383 > __kasan_report mm/kasan/report.c:513 [inline] > kasan_report+0x132/0x1d0 mm/kasan/report.c:530 > list_empty include/linux/list.h:282 [inline] > delete_and_unsubscribe_port+0x8b/0x450 sound/core/seq/seq_ports.c:530 > snd_seq_port_disconnect+0x568/0x610 sound/core/seq/seq_ports.c:612 > snd_seq_ioctl_unsubscribe_port+0x349/0x6c0 sound/core/seq/seq_clientmgr.c:1525 > snd_seq_oss_midi_close+0x397/0x620 sound/core/seq/oss/seq_oss_midi.c:405 > snd_seq_oss_synth_reset+0x335/0x8b0 sound/core/seq/oss/seq_oss_synth.c:406 > snd_seq_oss_reset+0x5b/0x250 sound/core/seq/oss/seq_oss_init.c:435 > snd_seq_oss_ioctl+0x5c2/0x1090 sound/core/seq/oss/seq_oss_ioctl.c:93 > odev_ioctl+0x51/0x70 sound/core/seq/oss/seq_oss.c:174 > vfs_ioctl fs/ioctl.c:48 [inline] > ksys_ioctl fs/ioctl.c:753 [inline] > __do_sys_ioctl fs/ioctl.c:762 [inline] > __se_sys_ioctl+0xf9/0x160 fs/ioctl.c:760 > do_syscall_64+0x73/0xe0 arch/x86/entry/common.c:384 > entry_SYSCALL_64_after_hwframe+0x44/0xa9 > > Allocated by task 7202: > save_stack mm/kasan/common.c:48 [inline] > set_track mm/kasan/common.c:56 [inline] > __kasan_kmalloc+0x103/0x140 mm/kasan/common.c:494 > kmem_cache_alloc_trace+0x234/0x300 mm/slab.c:3551 > kmalloc include/linux/slab.h:555 [inline] > kzalloc include/linux/slab.h:669 [inline] > snd_seq_port_connect+0x66/0x460 sound/core/seq/seq_ports.c:553 > snd_seq_ioctl_subscribe_port+0x349/0x6c0 sound/core/seq/seq_clientmgr.c:1484 > snd_seq_oss_midi_open+0x4db/0x830 sound/core/seq/oss/seq_oss_midi.c:364 > snd_seq_oss_synth_setup_midi+0x108/0x510 sound/core/seq/oss/seq_oss_synth.c:269 > snd_seq_oss_open+0x899/0xe90 sound/core/seq/oss/seq_oss_init.c:261 > odev_open+0x5e/0x90 sound/core/seq/oss/seq_oss.c:125 > chrdev_open+0x498/0x580 fs/char_dev.c:414 > do_dentry_open+0x813/0x1070 fs/open.c:828 > do_open fs/namei.c:3243 [inline] > path_openat+0x278d/0x37f0 fs/namei.c:3360 > do_filp_open+0x191/0x3a0 fs/namei.c:3387 > do_sys_openat2+0x463/0x770 fs/open.c:1179 > do_sys_open fs/open.c:1195 [inline] > __do_sys_openat fs/open.c:1209 [inline] > __se_sys_openat fs/open.c:1204 [inline] > __x64_sys_openat+0x1c8/0x1f0 fs/open.c:1204 > do_syscall_64+0x73/0xe0 arch/x86/entry/common.c:384 > entry_SYSCALL_64_after_hwframe+0x44/0xa9 > > Freed by task 7203: > save_stack mm/kasan/common.c:48 [inline] > set_track mm/kasan/common.c:56 [inline] > kasan_set_free_info mm/kasan/common.c:316 [inline] > __kasan_slab_free+0x114/0x170 mm/kasan/common.c:455 > __cache_free mm/slab.c:3426 [inline] > kfree+0x10a/0x220 mm/slab.c:3757 > snd_seq_port_disconnect+0x570/0x610 sound/core/seq/seq_ports.c:614 > snd_seq_ioctl_unsubscribe_port+0x349/0x6c0 sound/core/seq/seq_clientmgr.c:1525 > snd_seq_oss_midi_close+0x397/0x620 sound/core/seq/oss/seq_oss_midi.c:405 > snd_seq_oss_synth_reset+0x335/0x8b0 sound/core/seq/oss/seq_oss_synth.c:406 > snd_seq_oss_reset+0x5b/0x250 sound/core/seq/oss/seq_oss_init.c:435 > snd_seq_oss_ioctl+0x5c2/0x1090 sound/core/seq/oss/seq_oss_ioctl.c:93 > odev_ioctl+0x51/0x70 sound/core/seq/oss/seq_oss.c:174 > vfs_ioctl fs/ioctl.c:48 [inline] > ksys_ioctl fs/ioctl.c:753 [inline] > __do_sys_ioctl fs/ioctl.c:762 [inline] > __se_sys_ioctl+0xf9/0x160 fs/ioctl.c:760 > do_syscall_64+0x73/0xe0 arch/x86/entry/common.c:384 > entry_SYSCALL_64_after_hwframe+0x44/0xa9 > > The buggy address belongs to the object at ffff888098523000 > which belongs to the cache kmalloc-128 of size 128 > The buggy address is located 96 bytes inside of > 128-byte region [ffff888098523000, ffff888098523080) > The buggy address belongs to the page: > page:ffffea00026148c0 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 > flags: 0xfffe0000000200(slab) > raw: 00fffe0000000200 ffffea0002613988 ffffea000262c648 ffff8880aa400700 > raw: 0000000000000000 ffff888098523000 0000000100000010 0000000000000000 > page dumped because: kasan: bad access detected > > Memory state around the buggy address: > ffff888098522f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > ffff888098522f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > >ffff888098523000: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > ^ > ffff888098523080: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > ffff888098523100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > ================================================================== > > Reported-by: syzbot+1a54a94bd32716796edd@syzkaller.appspotmail.com > Signed-off-by: Zhang Qiang Thanks for the patch. But I'm afraid that this change would break the existing behavior and might have a bad side-effect. It's likely the same issue as reported in another syzkaller report ("KASAN: invalid-free in snd_seq_port_disconnect"), and Hillf's patch below should covert this as well. Could you check whether it works? thanks, Takashi --- --- a/sound/core/seq/oss/seq_oss.c +++ b/sound/core/seq/oss/seq_oss.c @@ -167,11 +167,17 @@ odev_write(struct file *file, const char static long odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { + long rc; struct seq_oss_devinfo *dp; + + mutex_lock(®ister_mutex); dp = file->private_data; if (snd_BUG_ON(!dp)) - return -ENXIO; - return snd_seq_oss_ioctl(dp, cmd, arg); + rc = -ENXIO; + else + rc = snd_seq_oss_ioctl(dp, cmd, arg); + mutex_unlock(®ister_mutex); + return rc; } #ifdef CONFIG_COMPAT