On Mon, Feb 03, 2025 at 02:42:54AM -0800, Shubham Pushpkar wrote: > From: Zhihao Cheng <chengzhihao1@xxxxxxxxxx> > > 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 Nit, as we assign CVEs _after_ a commit happens, there's no need to add this to a commit here as it is implied by the assignment database of cves-to-commits. Also, any specific reason you didn't cc: everyone involved in this commit for your backport as well? thanks, greg k-h