CVE-2021-47441
Severity CVSS v4.0:
Pending analysis
Type:
CWE-787
Out-of-bounds Write
Publication date:
22/05/2024
Last modified:
02/04/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
mlxsw: thermal: Fix out-of-bounds memory accesses<br />
<br />
Currently, mlxsw allows cooling states to be set above the maximum<br />
cooling state supported by the driver:<br />
<br />
# cat /sys/class/thermal/thermal_zone2/cdev0/type<br />
mlxsw_fan<br />
# cat /sys/class/thermal/thermal_zone2/cdev0/max_state<br />
10<br />
# echo 18 > /sys/class/thermal/thermal_zone2/cdev0/cur_state<br />
# echo $?<br />
0<br />
<br />
This results in out-of-bounds memory accesses when thermal state<br />
transition statistics are enabled (CONFIG_THERMAL_STATISTICS=y), as the<br />
transition table is accessed with a too large index (state) [1].<br />
<br />
According to the thermal maintainer, it is the responsibility of the<br />
driver to reject such operations [2].<br />
<br />
Therefore, return an error when the state to be set exceeds the maximum<br />
cooling state supported by the driver.<br />
<br />
To avoid dead code, as suggested by the thermal maintainer [3],<br />
partially revert commit a421ce088ac8 ("mlxsw: core: Extend cooling<br />
device with cooling levels") that tried to interpret these invalid<br />
cooling states (above the maximum) in a special way. The cooling levels<br />
array is not removed in order to prevent the fans going below 20% PWM,<br />
which would cause them to get stuck at 0% PWM.<br />
<br />
[1]<br />
BUG: KASAN: slab-out-of-bounds in thermal_cooling_device_stats_update+0x271/0x290<br />
Read of size 4 at addr ffff8881052f7bf8 by task kworker/0:0/5<br />
<br />
CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.15.0-rc3-custom-45935-gce1adf704b14 #122<br />
Hardware name: Mellanox Technologies Ltd. "MSN2410-CB2FO"/"SA000874", BIOS 4.6.5 03/08/2016<br />
Workqueue: events_freezable_power_ thermal_zone_device_check<br />
Call Trace:<br />
dump_stack_lvl+0x8b/0xb3<br />
print_address_description.constprop.0+0x1f/0x140<br />
kasan_report.cold+0x7f/0x11b<br />
thermal_cooling_device_stats_update+0x271/0x290<br />
__thermal_cdev_update+0x15e/0x4e0<br />
thermal_cdev_update+0x9f/0xe0<br />
step_wise_throttle+0x770/0xee0<br />
thermal_zone_device_update+0x3f6/0xdf0<br />
process_one_work+0xa42/0x1770<br />
worker_thread+0x62f/0x13e0<br />
kthread+0x3ee/0x4e0<br />
ret_from_fork+0x1f/0x30<br />
<br />
Allocated by task 1:<br />
kasan_save_stack+0x1b/0x40<br />
__kasan_kmalloc+0x7c/0x90<br />
thermal_cooling_device_setup_sysfs+0x153/0x2c0<br />
__thermal_cooling_device_register.part.0+0x25b/0x9c0<br />
thermal_cooling_device_register+0xb3/0x100<br />
mlxsw_thermal_init+0x5c5/0x7e0<br />
__mlxsw_core_bus_device_register+0xcb3/0x19c0<br />
mlxsw_core_bus_device_register+0x56/0xb0<br />
mlxsw_pci_probe+0x54f/0x710<br />
local_pci_probe+0xc6/0x170<br />
pci_device_probe+0x2b2/0x4d0<br />
really_probe+0x293/0xd10<br />
__driver_probe_device+0x2af/0x440<br />
driver_probe_device+0x51/0x1e0<br />
__driver_attach+0x21b/0x530<br />
bus_for_each_dev+0x14c/0x1d0<br />
bus_add_driver+0x3ac/0x650<br />
driver_register+0x241/0x3d0<br />
mlxsw_sp_module_init+0xa2/0x174<br />
do_one_initcall+0xee/0x5f0<br />
kernel_init_freeable+0x45a/0x4de<br />
kernel_init+0x1f/0x210<br />
ret_from_fork+0x1f/0x30<br />
<br />
The buggy address belongs to the object at ffff8881052f7800<br />
which belongs to the cache kmalloc-1k of size 1024<br />
The buggy address is located 1016 bytes inside of<br />
1024-byte region [ffff8881052f7800, ffff8881052f7c00)<br />
The buggy address belongs to the page:<br />
page:0000000052355272 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1052f0<br />
head:0000000052355272 order:3 compound_mapcount:0 compound_pincount:0<br />
flags: 0x200000000010200(slab|head|node=0|zone=2)<br />
raw: 0200000000010200 ffffea0005034800 0000000300000003 ffff888100041dc0<br />
raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000<br />
page dumped because: kasan: bad access detected<br />
<br />
Memory state around the buggy address:<br />
ffff8881052f7a80: 00 00 00 00 00 00 04 fc fc fc fc fc fc fc fc fc<br />
ffff8881052f7b00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc<br />
>ffff8881052f7b80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc<br />
^<br />
ffff8881052f7c00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc<br />
ffff8881052f7c80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc<br />
<br />
[2] https://lore.kernel.org/linux-pm/9aca37cb-1629-5c67-<br />
---truncated---
Impact
Base Score 3.x
7.30
Severity 3.x
HIGH
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (including) | 5.4.155 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.75 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.14.14 (excluding) |
| cpe:2.3:o:linux:linux_kernel:5.15:rc1:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.15:rc2:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.15:rc3:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.15:rc4:*:*:*:*:*:* | ||
| cpe:2.3:o:linux:linux_kernel:5.15:rc5:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/332fdf951df8b870e3da86b122ae304e2aabe88c
- https://git.kernel.org/stable/c/ae0993739e14a102d506aa09e11b0065f3144f10
- https://git.kernel.org/stable/c/df8e58716afb3bee2b59de66b1ba1033f2e26303
- https://git.kernel.org/stable/c/e59d839743b50cb1d3f42a786bea48cc5621d254
- https://git.kernel.org/stable/c/332fdf951df8b870e3da86b122ae304e2aabe88c
- https://git.kernel.org/stable/c/ae0993739e14a102d506aa09e11b0065f3144f10
- https://git.kernel.org/stable/c/df8e58716afb3bee2b59de66b1ba1033f2e26303
- https://git.kernel.org/stable/c/e59d839743b50cb1d3f42a786bea48cc5621d254



