From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 66BE3C77B7D for ; Mon, 17 Apr 2023 16:01:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: List-Subscribe:List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: In-Reply-To:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Reply-To:Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date :Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sJEh78SrxLUK2E1EYZK5E1+niPczqF4RBxLGiCFcYVQ=; b=c/M1cPT11Mt9kjOImW1HiUisXq AV/MGHDjAj1SXcye2aVA+KItnnnryAupQsA2tV9uOFnV8OtPV+SKPx0IkEgw7lvWv42Xs/8SdqBvd jVAgYdIfz8ojlRp7c45U58SttR4jNygrrwQOdjpXVLYS+kGuxOpsotM67EgjgCkzcijGNsq8HKiIM tgImOlF7eV9zK5h2BYc5yEFj2e3FzFSGrDF9Trilf6dZMq/Kbegqg/Lfso+2lEAbSHjPF/mncyC15 JylXkIRZzc7eGdQrmqufnQ/n46NnRov9A6zrVd8vHwN8zZ8281KJZ8yUWEJQD/xIUV5tih8Ov9Q7U ntCxLkpw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1poRI4-00Gz0h-35; Mon, 17 Apr 2023 16:01:16 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1poRI2-00Gyzw-0U for linux-mtd@lists.infradead.org; Mon, 17 Apr 2023 16:01:16 +0000 Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1poRHt-00055n-V1; Mon, 17 Apr 2023 18:01:05 +0200 Received: from [2a0a:edc0:0:900:1d::77] (helo=ptz.office.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1poRHr-00BuXB-Ko; Mon, 17 Apr 2023 18:01:03 +0200 Received: from ukl by ptz.office.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1poRHq-00DyP0-TH; Mon, 17 Apr 2023 18:01:02 +0200 Date: Mon, 17 Apr 2023 18:01:02 +0200 From: Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= To: George Kennedy Cc: richard@nod.at, miquel.raynal@bootlin.com, vigneshr@ti.com, eorge.kennedy@oracle.com, linux-mtd@lists.infradead.org, syzkaller@googlegroups.com, linux-kernel@vger.kernel.org, harshit.m.mogalapalli@oracle.com, kernel@pengutronix.de, stable@vger.kernel.org Subject: [Regression] Cannot overwrite VID header offset any more [Was: [PATCH] ubi: ensure that VID header offset + VID header size <= alloc, size] Message-ID: <20230417160102.lw6n7bdxwrlkluwj@pengutronix.de> References: MIME-Version: 1.0 In-Reply-To: X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-mtd@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230417_090114_355277_AE9ED0EF X-CRM114-Status: GOOD ( 25.64 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============5685837553804329234==" Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org --===============5685837553804329234== Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="vrholj4gzneqir3b" Content-Disposition: inline --vrholj4gzneqir3b Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello, On Tue, Nov 15, 2022 at 10:14:44AM -0500, George Kennedy wrote: > Ensure that the VID header offset + VID header size does not exceed > the allocated area to avoid slab OOB. >=20 > BUG: KASAN: slab-out-of-bounds in crc32_body lib/crc32.c:111 [inline] > BUG: KASAN: slab-out-of-bounds in crc32_le_generic lib/crc32.c:179 [inlin= e] > BUG: KASAN: slab-out-of-bounds in crc32_le_base+0x58c/0x626 lib/crc32.c:1= 97 > Read of size 4 at addr ffff88802bb36f00 by task syz-executor136/1555 >=20 > CPU: 2 PID: 1555 Comm: syz-executor136 Tainted: G W > 6.0.0-1868 #1 > Hardware name: Red Hat KVM, BIOS 1.13.0-2.module+el8.3.0+7860+a7792d29 > 04/01/2014 > Call Trace: > > __dump_stack lib/dump_stack.c:88 [inline] > dump_stack_lvl+0x85/0xad lib/dump_stack.c:106 > print_address_description mm/kasan/report.c:317 [inline] > print_report.cold.13+0xb6/0x6bb mm/kasan/report.c:433 > kasan_report+0xa7/0x11b mm/kasan/report.c:495 > crc32_body lib/crc32.c:111 [inline] > crc32_le_generic lib/crc32.c:179 [inline] > crc32_le_base+0x58c/0x626 lib/crc32.c:197 > ubi_io_write_vid_hdr+0x1b7/0x472 drivers/mtd/ubi/io.c:1067 > create_vtbl+0x4d5/0x9c4 drivers/mtd/ubi/vtbl.c:317 > create_empty_lvol drivers/mtd/ubi/vtbl.c:500 [inline] > ubi_read_volume_table+0x67b/0x288a drivers/mtd/ubi/vtbl.c:812 > ubi_attach+0xf34/0x1603 drivers/mtd/ubi/attach.c:1601 > ubi_attach_mtd_dev+0x6f3/0x185e drivers/mtd/ubi/build.c:965 > ctrl_cdev_ioctl+0x2db/0x347 drivers/mtd/ubi/cdev.c:1043 > vfs_ioctl fs/ioctl.c:51 [inline] > __do_sys_ioctl fs/ioctl.c:870 [inline] > __se_sys_ioctl fs/ioctl.c:856 [inline] > __x64_sys_ioctl+0x193/0x213 fs/ioctl.c:856 > do_syscall_x64 arch/x86/entry/common.c:50 [inline] > do_syscall_64+0x3e/0x86 arch/x86/entry/common.c:80 > entry_SYSCALL_64_after_hwframe+0x63/0x0 > RIP: 0033:0x7f96d5cf753d > Code: > RSP: 002b:00007fffd72206f8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 > RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f96d5cf753d > RDX: 0000000020000080 RSI: 0000000040186f40 RDI: 0000000000000003 > RBP: 0000000000400cd0 R08: 0000000000000000 R09: 0000000000000000 > R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000400be0 > R13: 00007fffd72207e0 R14: 0000000000000000 R15: 0000000000000000 > >=20 > Allocated by task 1555: > kasan_save_stack+0x20/0x3d mm/kasan/common.c:38 > kasan_set_track mm/kasan/common.c:45 [inline] > set_alloc_info mm/kasan/common.c:437 [inline] > ____kasan_kmalloc mm/kasan/common.c:516 [inline] > __kasan_kmalloc+0x88/0xa3 mm/kasan/common.c:525 > kasan_kmalloc include/linux/kasan.h:234 [inline] > __kmalloc+0x138/0x257 mm/slub.c:4429 > kmalloc include/linux/slab.h:605 [inline] > ubi_alloc_vid_buf drivers/mtd/ubi/ubi.h:1093 [inline] > create_vtbl+0xcc/0x9c4 drivers/mtd/ubi/vtbl.c:295 > create_empty_lvol drivers/mtd/ubi/vtbl.c:500 [inline] > ubi_read_volume_table+0x67b/0x288a drivers/mtd/ubi/vtbl.c:812 > ubi_attach+0xf34/0x1603 drivers/mtd/ubi/attach.c:1601 > ubi_attach_mtd_dev+0x6f3/0x185e drivers/mtd/ubi/build.c:965 > ctrl_cdev_ioctl+0x2db/0x347 drivers/mtd/ubi/cdev.c:1043 > vfs_ioctl fs/ioctl.c:51 [inline] > __do_sys_ioctl fs/ioctl.c:870 [inline] > __se_sys_ioctl fs/ioctl.c:856 [inline] > __x64_sys_ioctl+0x193/0x213 fs/ioctl.c:856 > do_syscall_x64 arch/x86/entry/common.c:50 [inline] > do_syscall_64+0x3e/0x86 arch/x86/entry/common.c:80 > entry_SYSCALL_64_after_hwframe+0x63/0x0 >=20 > The buggy address belongs to the object at ffff88802bb36e00 > which belongs to the cache kmalloc-256 of size 256 > The buggy address is located 0 bytes to the right of > 256-byte region [ffff88802bb36e00, ffff88802bb36f00) >=20 > The buggy address belongs to the physical page: > page:00000000ea4d1263 refcount:1 mapcount:0 mapping:0000000000000000 > index:0x0 pfn:0x2bb36 > head:00000000ea4d1263 order:1 compound_mapcount:0 compound_pincount:0 > flags: 0xfffffc0010200(slab|head|node=3D0|zone=3D1|lastcpupid=3D0x1fffff) > raw: 000fffffc0010200 ffffea000066c300 dead000000000003 ffff888100042b40 > raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000 > page dumped because: kasan: bad access detected >=20 > Memory state around the buggy address: > ffff88802bb36e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > ffff88802bb36e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > ffff88802bb36f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > ^ > ffff88802bb36f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > ffff88802bb37000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >=20 > Fixes: 801c135ce73d ("UBI: Unsorted Block Images") > Reported-by: syzkaller > Signed-off-by: George Kennedy > --- > drivers/mtd/ubi/build.c | 6 ++++++ > 1 file changed, 6 insertions(+) >=20 > diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c > index a32050fecabf..53aa4de6b963 100644 > --- a/drivers/mtd/ubi/build.c > +++ b/drivers/mtd/ubi/build.c > @@ -663,6 +663,12 @@ static int io_init(struct ubi_device *ubi, int max_b= eb_per1024) > ubi->ec_hdr_alsize =3D ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); > ubi->vid_hdr_alsize =3D ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); > + if (ubi->vid_hdr_offset && ((ubi->vid_hdr_offset + UBI_VID_HDR_SIZE) > > + ubi->vid_hdr_alsize)) { > + ubi_err(ubi, "VID header offset %d too large.", ubi->vid_hdr_offset); > + return -EINVAL; > + } > + This patch is in mainline as 1b42b1a36fc946f0d7088425b90d491b4257ca3e, and backported to various stable releases. For me this breaks ubiattach -m 0 -O 2048 I think the check ubi->vid_hdr_offset + UBI_VID_HDR_SIZE > ubi->vid_hdr_alsize is wrong. Without -O passed to ubiattach (and dynamic debug enabled) I get: [ 5294.936762] UBI DBG gen (pid 9619): sizeof(struct ubi_ainf_peb) 56 [ 5294.936769] UBI DBG gen (pid 9619): sizeof(struct ubi_wl_entry) 32 [ 5294.936774] UBI DBG gen (pid 9619): min_io_size 2048 [ 5294.936779] UBI DBG gen (pid 9619): max_write_size 2048 [ 5294.936783] UBI DBG gen (pid 9619): hdrs_min_io_size 512 [ 5294.936787] UBI DBG gen (pid 9619): ec_hdr_alsize 512 [ 5294.936791] UBI DBG gen (pid 9619): vid_hdr_alsize 512 [ 5294.936796] UBI DBG gen (pid 9619): vid_hdr_offset 512 [ 5294.936800] UBI DBG gen (pid 9619): vid_hdr_aloffset 512 [ 5294.936804] UBI DBG gen (pid 9619): vid_hdr_shift 0 [ 5294.936808] UBI DBG gen (pid 9619): leb_start 2048 [ 5294.936812] UBI DBG gen (pid 9619): max_erroneous 409 So the check would only pass for vid_hdr_offset <=3D 512 - UBI_VID_HDR_SIZE; note that even specifying the default value 512 (i.e. ubiattach -m 0 -O 512 ) fails the check. A less strong check would be: diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index 0904eb40c95f..69c28a862430 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c @@ -666,8 +666,8 @@ static int io_init(struct ubi_device *ubi, int max_beb_= per1024) ubi->ec_hdr_alsize =3D ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); ubi->vid_hdr_alsize =3D ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); =20 - if (ubi->vid_hdr_offset && ((ubi->vid_hdr_offset + UBI_VID_HDR_SIZE) > - ubi->vid_hdr_alsize)) { + if (ubi->vid_hdr_offset && + ubi->vid_hdr_offset + UBI_VID_HDR_SIZE > ubi->peb_size) { ubi_err(ubi, "VID header offset %d too large.", ubi->vid_hdr_offset); return -EINVAL; } But I'm unsure if this would be too lax?! Best regards Uwe --=20 Pengutronix e.K. | Uwe Kleine-K=F6nig | Industrial Linux Solutions | https://www.pengutronix.de/ | --vrholj4gzneqir3b Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEP4GsaTp6HlmJrf7Tj4D7WH0S/k4FAmQ9bT0ACgkQj4D7WH0S /k4JbggAnl8YnX6+ci/263B7bektLKWsdvSkW23vvDgVKJIyWJLuIdg4oxTijyKw Zxk4521RSK6JDAr416vi6HsLcsF65tqNfwE6x9aTuFJmMdyxIpynfTOz/BTeHYAF 0MQ1TgLjbbHP7ihvJ7aPaOvsWOyYYdfS5aG7RW/IFm3Lv212YcbrORiW6tBAI2gA gF/G15fym4Z3DbTqVGXsSddBlvLntn1CJ7O4DBtwrGt/VjC79+M2SWRAgqkj/ynz VUgG/t2NtXVz0N2pQdmEd2Eyp9jCROsviiTt9gbFEWuneCB+X5KGR8MmbnLo/lAt +SPjo//mi2NMeppyPL5obOEycng4Yw== =YQU7 -----END PGP SIGNATURE----- --vrholj4gzneqir3b-- --===============5685837553804329234== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ --===============5685837553804329234==--