In the Linux kernel, the following vulnerability has been resolved:
dm thin: fix use-after-free crash in dmsmregisterthresholdcallback
Fault inject on pool metadata device reports: BUG: KASAN: use-after-free in dmpoolregistermetadatathreshold+0x40/0x80 Read of size 8 at addr ffff8881b9d50068 by task dmsetup/950
CPU: 7 PID: 950 Comm: dmsetup Tainted: G W 5.19.0-rc6 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014 Call Trace: <TASK> dumpstacklvl+0x34/0x44 printaddressdescription.constprop.0.cold+0xeb/0x3f4 kasanreport.cold+0xe6/0x147 dmpoolregistermetadatathreshold+0x40/0x80 poolctr+0xa0a/0x1150 dmtableaddtarget+0x2c8/0x640 tableload+0x1fd/0x430 ctlioctl+0x2c4/0x5a0 dmctlioctl+0xa/0x10 _x64sysioctl+0xb3/0xd0 dosyscall64+0x35/0x80 entrySYSCALL64afterhwframe+0x46/0xb0
This can be easily reproduced using: echo offline > /sys/block/sda/device/state dd if=/dev/zero of=/dev/mapper/thin bs=4k count=10 dmsetup load pool --table "0 20971520 thin-pool /dev/sda /dev/sdb 128 0 0"
If a metadata commit fails, the transaction will be aborted and the metadata space maps will be destroyed. If a DM table reload then happens for this failed thin-pool, a use-after-free will occur in dmsmregisterthresholdcallback (called from dmpoolregistermetadatathreshold).
Fix this by in dmpoolregistermetadatathreshold() by returning the -EINVAL error if the thin-pool is in fail mode. Also fail pool_ctr() with a new error message: "Error registering metadata threshold".