Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp391376ybt; Fri, 19 Jun 2020 04:30:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw0Ku4SDqq64nVPlEaB/RWghRa2JJPADqRyyG0n0CtHe8zN76p29yDpphRsb7cGgy1IIPHJ X-Received: by 2002:a50:951d:: with SMTP id u29mr2875626eda.333.1592566227859; Fri, 19 Jun 2020 04:30:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592566227; cv=none; d=google.com; s=arc-20160816; b=qYKypnbe0by2yaxYiArRzoy3qJQm1gdzkxa7DbxpLdYS5bzMFEE2eJyief66RI1gmX MMrqN+/P+WNex3q5iosT47gpVTNcHu4eIUwLUGAM7CASjV97R2a1ieJnZt8qcYq/Gd/X QqtvuRU+KkYhfLvC7IEVkc6xWa9iPFJ/J7TWZFq3WjdnlMXtR/lyMUSpxvqlxUrhJtEx /61rRqx5GRdjb/D5++vT2YXaJ9hGQHgNuEKcw5Tc4AP6qxj0GalAFWi8EcDajMARS6z7 x8RXm47TSPu53UnSC8f1I6XKFdRw5Ji+EfyOQs5D2EHb88R8ivZsk7eqmwDjljzRsgAO 6RZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=f+YuwvBx8zkhispwE2ywFtcrQQk8jeoNwp2eKZY9LLo=; b=KyYfLwh/5koVROkBu6oj+a5YdnbPf02q6UhZjyZsjEDXq9UwC5+5+z0vV/UV7moGnn xszfPfXkXaiaeqeqxyk/YuwaLBhpw5xMzw29HsN14oZo4kHnsJ9yT6WGTDcxfM4Cgpc3 fyk1IbzeNY2jC/0DX8As3enx7yfOeTVJjOjRYNjM73mGlKEk6KUsnE8+Hoi76wWIIDr7 sYpm3G//xHVNOrXNZSzMbYT+3Dz0SfD509PbNe4/PO47BJNVqUXjV/WJwclRcV8MM9y+ mu4VCOgn/elghTUbYPWgVdvdfS9Ha/E3v8AZly7l9pMgvxzMj9SvFtBIic5Qy9wxD0K9 5+CQ== 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 w19si3569973edt.402.2020.06.19.04.30.03; Fri, 19 Jun 2020 04:30:27 -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 S1731779AbgFSJHH (ORCPT + 99 others); Fri, 19 Jun 2020 05:07:07 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:57942 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1731775AbgFSJGx (ORCPT ); Fri, 19 Jun 2020 05:06:53 -0400 Received: from DGGEMS414-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id DC06B6324870621A196D; Fri, 19 Jun 2020 17:06:48 +0800 (CST) Received: from DESKTOP-FKFNUOQ.china.huawei.com (10.67.101.2) by DGGEMS414-HUB.china.huawei.com (10.3.19.214) with Microsoft SMTP Server id 14.3.487.0; Fri, 19 Jun 2020 17:06:39 +0800 From: Zhe Li To: , , , CC: , , , , Subject: [PATCH] jffs2: fix UAF problem Date: Fri, 19 Jun 2020 17:06:35 +0800 Message-ID: <20200619090635.58548-1-lizhe67@huawei.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.67.101.2] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The log of UAF problem is listed below. BUG: KASAN: use-after-free in jffs2_rmdir+0xa4/0x1cc [jffs2] at addr c1f165fc Read of size 4 by task rm/8283 ============================================================================= BUG kmalloc-32 (Tainted: P B O ): kasan: bad access detected ----------------------------------------------------------------------------- INFO: Allocated in 0xbbbbbbbb age=3054364 cpu=0 pid=0 0xb0bba6ef jffs2_write_dirent+0x11c/0x9c8 [jffs2] __slab_alloc.isra.21.constprop.25+0x2c/0x44 __kmalloc+0x1dc/0x370 jffs2_write_dirent+0x11c/0x9c8 [jffs2] jffs2_do_unlink+0x328/0x5fc [jffs2] jffs2_rmdir+0x110/0x1cc [jffs2] vfs_rmdir+0x180/0x268 do_rmdir+0x2cc/0x300 ret_from_syscall+0x0/0x3c INFO: Freed in 0x205b age=3054364 cpu=0 pid=0 0x2e9173 jffs2_add_fd_to_list+0x138/0x1dc [jffs2] jffs2_add_fd_to_list+0x138/0x1dc [jffs2] jffs2_garbage_collect_dirent.isra.3+0x21c/0x288 [jffs2] jffs2_garbage_collect_live+0x16bc/0x1800 [jffs2] jffs2_garbage_collect_pass+0x678/0x11d4 [jffs2] jffs2_garbage_collect_thread+0x1e8/0x3b0 [jffs2] kthread+0x1a8/0x1b0 ret_from_kernel_thread+0x5c/0x64 Call Trace: [c17ddd20] [c02452d4] kasan_report.part.0+0x298/0x72c (unreliable) [c17ddda0] [d2509680] jffs2_rmdir+0xa4/0x1cc [jffs2] [c17dddd0] [c026da04] vfs_rmdir+0x180/0x268 [c17dde00] [c026f4e4] do_rmdir+0x2cc/0x300 [c17ddf40] [c001a658] ret_from_syscall+0x0/0x3c The root cause is that we don't get "jffs2_inode_info.sem" before we scan list "jffs2_inode_info.dents" in function jffs2_rmdir. This patch add codes to get "jffs2_inode_info.sem" before we scan "jffs2_inode_info.dents" to slove the UAF problem. Signed-off-by: Zhe Li --- fs/jffs2/dir.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index f20cff1..7764937 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -590,10 +590,14 @@ static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry) int ret; uint32_t now = JFFS2_NOW(); + mutex_lock(&f->sem); for (fd = f->dents ; fd; fd = fd->next) { - if (fd->ino) + if (fd->ino) { + mutex_unlock(&f->sem); return -ENOTEMPTY; + } } + mutex_unlock(&f->sem); ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name, dentry->d_name.len, f, now); -- 2.7.4