public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
* [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
@ 2025-01-23 11:41 Shubham Pushpkar
  2025-01-23 13:08 ` Daniel Walker (danielwa)
  0 siblings, 1 reply; 4+ messages in thread
From: Shubham Pushpkar @ 2025-01-23 11:41 UTC (permalink / raw)
  To: xe-linux-external; +Cc: Zhihao Cheng, stable, David Sterba, Shubham Pushpkar

From: Zhihao Cheng <chengzhihao1@huawei.com>

commit aec8e6bf839101784f3ef037dcdb9432c3f32343 ("btrfs:
fix use-after-free of block device file in __btrfs_free_extra_devids()")

Mounting btrfs from two images (which have the same one fsid and two
different dev_uuids) in certain executing order may trigger an UAF for
variable 'device->bdev_file' in __btrfs_free_extra_devids(). And
following are the details:

1. Attach image_1 to loop0, attach image_2 to loop1, and scan btrfs
   devices by ioctl(BTRFS_IOC_SCAN_DEV):

             /  btrfs_device_1 → loop0
   fs_device
             \  btrfs_device_2 → loop1
2. mount /dev/loop0 /mnt
   btrfs_open_devices
    btrfs_device_1->bdev_file = btrfs_get_bdev_and_sb(loop0)
    btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
   btrfs_fill_super
    open_ctree
     fail: btrfs_close_devices // -ENOMEM
	    btrfs_close_bdev(btrfs_device_1)
             fput(btrfs_device_1->bdev_file)
	      // btrfs_device_1->bdev_file is freed
	    btrfs_close_bdev(btrfs_device_2)
             fput(btrfs_device_2->bdev_file)

3. mount /dev/loop1 /mnt
   btrfs_open_devices
    btrfs_get_bdev_and_sb(&bdev_file)
     // EIO, btrfs_device_1->bdev_file is not assigned,
     // which points to a freed memory area
    btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
   btrfs_fill_super
    open_ctree
     btrfs_free_extra_devids
      if (btrfs_device_1->bdev_file)
       fput(btrfs_device_1->bdev_file) // UAF !

Fix it by setting 'device->bdev_file' as 'NULL' after closing the
btrfs_device in btrfs_close_one_device().

Fixes: CVE-2024-50217
Fixes: 142388194191 ("btrfs: do not background blkdev_put()")
CC: stable@vger.kernel.org # 4.19+
Link: https://bugzilla.kernel.org/show_bug.cgi?id=219408
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
(cherry picked from commit aec8e6bf839101784f3ef037dcdb9432c3f32343)
Signed-off-by: Shubham Pushpkar <spushpka@cisco.com>
---
 fs/btrfs/volumes.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index b9a0b26d08e1..ab2412542ce5 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1176,6 +1176,7 @@ static void btrfs_close_one_device(struct btrfs_device *device)
 	if (device->bdev) {
 		fs_devices->open_devices--;
 		device->bdev = NULL;
+		device->bdev_file = NULL;
 	}
 	clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
 	btrfs_destroy_dev_zone_info(device);
-- 
2.35.6


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
  2025-01-23 11:41 [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids() Shubham Pushpkar
@ 2025-01-23 13:08 ` Daniel Walker (danielwa)
  2025-01-23 13:56   ` Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel Walker (danielwa) @ 2025-01-23 13:08 UTC (permalink / raw)
  To: Shubham Pushpkar -X (spushpka - E INFOCHIPS PRIVATE LIMITED at Cisco)
  Cc: xe-linux-external(mailer list), Zhihao Cheng,
	stable@vger.kernel.org, David Sterba


Looks fine for release to me.


On Thu, Jan 23, 2025 at 03:41:41AM -0800, Shubham Pushpkar wrote:
> From: Zhihao Cheng <chengzhihao1@huawei.com>
> 
> commit aec8e6bf839101784f3ef037dcdb9432c3f32343 ("btrfs:
> fix use-after-free of block device file in __btrfs_free_extra_devids()")
> 
> Mounting btrfs from two images (which have the same one fsid and two
> different dev_uuids) in certain executing order may trigger an UAF for
> variable 'device->bdev_file' in __btrfs_free_extra_devids(). And
> following are the details:
> 
> 1. Attach image_1 to loop0, attach image_2 to loop1, and scan btrfs
>    devices by ioctl(BTRFS_IOC_SCAN_DEV):
> 
>              /  btrfs_device_1 → loop0
>    fs_device
>              \  btrfs_device_2 → loop1
> 2. mount /dev/loop0 /mnt
>    btrfs_open_devices
>     btrfs_device_1->bdev_file = btrfs_get_bdev_and_sb(loop0)
>     btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
>    btrfs_fill_super
>     open_ctree
>      fail: btrfs_close_devices // -ENOMEM
> 	    btrfs_close_bdev(btrfs_device_1)
>              fput(btrfs_device_1->bdev_file)
> 	      // btrfs_device_1->bdev_file is freed
> 	    btrfs_close_bdev(btrfs_device_2)
>              fput(btrfs_device_2->bdev_file)
> 
> 3. mount /dev/loop1 /mnt
>    btrfs_open_devices
>     btrfs_get_bdev_and_sb(&bdev_file)
>      // EIO, btrfs_device_1->bdev_file is not assigned,
>      // which points to a freed memory area
>     btrfs_device_2->bdev_file = btrfs_get_bdev_and_sb(loop1)
>    btrfs_fill_super
>     open_ctree
>      btrfs_free_extra_devids
>       if (btrfs_device_1->bdev_file)
>        fput(btrfs_device_1->bdev_file) // UAF !
> 
> Fix it by setting 'device->bdev_file' as 'NULL' after closing the
> btrfs_device in btrfs_close_one_device().
> 
> Fixes: CVE-2024-50217
> Fixes: 142388194191 ("btrfs: do not background blkdev_put()")
> CC: stable@vger.kernel.org # 4.19+
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=219408
> Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
> Reviewed-by: David Sterba <dsterba@suse.com>
> Signed-off-by: David Sterba <dsterba@suse.com>
> (cherry picked from commit aec8e6bf839101784f3ef037dcdb9432c3f32343)
> Signed-off-by: Shubham Pushpkar <spushpka@cisco.com>
> ---
>  fs/btrfs/volumes.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index b9a0b26d08e1..ab2412542ce5 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1176,6 +1176,7 @@ static void btrfs_close_one_device(struct btrfs_device *device)
>  	if (device->bdev) {
>  		fs_devices->open_devices--;
>  		device->bdev = NULL;
> +		device->bdev_file = NULL;
>  	}
>  	clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
>  	btrfs_destroy_dev_zone_info(device);
> -- 
> 2.35.6
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
  2025-01-23 13:08 ` Daniel Walker (danielwa)
@ 2025-01-23 13:56   ` Greg KH
  2025-01-23 14:20     ` Daniel Walker (danielwa)
  0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2025-01-23 13:56 UTC (permalink / raw)
  To: Daniel Walker (danielwa)
  Cc: Shubham Pushpkar -X (spushpka - E INFOCHIPS PRIVATE LIMITED at Cisco),
	xe-linux-external(mailer list), Zhihao Cheng,
	stable@vger.kernel.org, David Sterba

On Thu, Jan 23, 2025 at 01:08:52PM +0000, Daniel Walker (danielwa) wrote:
> 
> Looks fine for release to me.

Released to where?  This is already in the 6.12 release, what other
stable tree should it be added to?

confused,

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids()
  2025-01-23 13:56   ` Greg KH
@ 2025-01-23 14:20     ` Daniel Walker (danielwa)
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel Walker (danielwa) @ 2025-01-23 14:20 UTC (permalink / raw)
  To: Greg KH
  Cc: Shubham Pushpkar -X (spushpka - E INFOCHIPS PRIVATE LIMITED at Cisco),
	xe-linux-external(mailer list), Zhihao Cheng,
	stable@vger.kernel.org, David Sterba

On Thu, Jan 23, 2025 at 02:56:08PM +0100, Greg KH wrote:
> On Thu, Jan 23, 2025 at 01:08:52PM +0000, Daniel Walker (danielwa) wrote:
> > 
> > Looks fine for release to me.
> 
> Released to where?  This is already in the 6.12 release, what other
> stable tree should it be added to?
> 
> confused,

Don't worry, it was suppose to be internal to Ciscp but looks like the CC's were not correct.

Daniel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-01-23 14:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-23 11:41 [Internal Review] [Patch] btrfs: fix use-after-free of block device file in __btrfs_free_extra_devids() Shubham Pushpkar
2025-01-23 13:08 ` Daniel Walker (danielwa)
2025-01-23 13:56   ` Greg KH
2025-01-23 14:20     ` Daniel Walker (danielwa)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox