Subject: CVE-2021-47343: dm btree remove: assign new_root only when removal succeeds

From: Greg Kroah-Hartman <[email-masked]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

dm btree remove: assign new_root only when removal succeeds

remove_raw() in dm_btree_remove() may fail due to IO read error
(e.g. read the content of origin block fails during shadowing),
and the value of shadow_spine::root is uninitialized, but
the uninitialized value is still assign to new_root in the
end of dm_btree_remove().

For dm-thin, the value of pmd->details_root or pmd->root will become
an uninitialized value, so if trying to read details_info tree again
out-of-bound memory may occur as showed below:

  general protection fault, probably for non-canonical address 0x3fdcb14c8d7520
  CPU: 4 PID: 515 Comm: dmsetup Not tainted 5.13.0-rc6
  Hardware name: QEMU Standard PC
  RIP: 0010:metadata_ll_load_ie+0x14/0x30
  Call Trace:
   sm_metadata_count_is_more_than_one+0xb9/0xe0
   dm_tm_shadow_block+0x52/0x1c0
   shadow_step+0x59/0xf0
   remove_raw+0xb2/0x170
   dm_btree_remove+0xf4/0x1c0
   dm_pool_delete_thin_device+0xc3/0x140
   pool_message+0x218/0x2b0
   target_message+0x251/0x290
   ctl_ioctl+0x1c4/0x4d0
   dm_ctl_ioctl+0xe/0x20
   __x64_sys_ioctl+0x7b/0xb0
   do_syscall_64+0x40/0xb0
   entry_SYSCALL_64_after_hwframe+0x44/0xae

Fixing it by only assign new_root when removal succeeds

The Linux kernel CVE team has assigned CVE-2021-47343 to this issue.

Affected and fixed versions
===========================

	Fixed in 4.4.276 with commit 4c84b3e0728f
	Fixed in 4.9.276 with commit c15477561918
	Fixed in 4.14.240 with commit 73f27adaa73e
	Fixed in 4.19.198 with commit 8fbae4a1bdb5
	Fixed in 5.4.133 with commit 964d57d1962d
	Fixed in 5.10.51 with commit ba47e65a5de3
	Fixed in 5.12.18 with commit 89bf942314b7
	Fixed in 5.13.3 with commit ad365e9351ac
	Fixed in 5.14 with commit b6e58b5466b2

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2021-47343
will be updated if fixes are backported, please check that for the most
up to date information about this issue.

Affected files
==============

The file(s) affected by this issue are:
	drivers/md/persistent-data/dm-btree-remove.c

Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/4c84b3e0728ffe10d89c633694c35a02b5c477dc
	https://git.kernel.org/stable/c/c154775619186781aaf8a99333ac07437a1768d5
	https://git.kernel.org/stable/c/73f27adaa73e3057a9ec464e33c4f54d34ea5de3
	https://git.kernel.org/stable/c/8fbae4a1bdb5b889490cdee929e68540151536e5
	https://git.kernel.org/stable/c/964d57d1962d7e68f0f578f05d9ae4a104d74851
	https://git.kernel.org/stable/c/ba47e65a5de3e0e8270301a409fc63d3129fdb9e
	https://git.kernel.org/stable/c/89bf942314b78d454db92427201421b5dec132d9
	https://git.kernel.org/stable/c/ad365e9351ac2b450e7e79932ff6abf59342d91a
	https://git.kernel.org/stable/c/b6e58b5466b2959f83034bead2e2e1395cca8aeb