В ядре Linux устранена следующая уязвимость:
ACPI: CPPC: подавление предупреждений UBSAN, вызванных неправильным использованием полей. Определение reg->access_width меняется в зависимости от
reg->тип space_id. Тип ACPI_ADR_SPACE_PLATFORM_COMM использует
access_width для указания региона PCC, что может привести к UBSAN
если значение больше 4.
Например:
UBSAN: сдвиг за пределы в драйверах/acpi/cppc_acpi.c:1090:9
показатель сдвига 32 слишком велик для 32-битного типа int
ЦП: 61 UID: 0 PID: 1220 Связь: (udev-worker) Не испорчено 7.0.10-201.fc44.aarch64 #1 PREEMPT(ленивый)
Имя оборудования: Заполняется OEM-производителем. Трассировка звонков:
...(обрезка)
ubsan_epilogue+0x10/0x48
__ubsan_handle_shift_out_of_bounds+0xdc/0x1e0
cpc_write+0x4d0/0x670
cppc_set_perf+0x18c/0x490
cppc_cpufreq_cpu_init+0x1c8/0x380 [cppc_cpufreq]
... (обрезка)
Давайте исправим это, проверив тип региона, а также
access_width имеет значение. Тогда, поскольку мы возвращаем битовую ширину
непосредственно для ACPI_ADR_SPACE_PLATFORM_COMM, скиньте корректирующий код
размер.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ACPI: CPPC: Suppress UBSAN warning caused by field misuse The definition of reg->access_width changes depending on the reg->space_id type. Type ACPI_ADR_SPACE_PLATFORM_COMM uses access_width to indicate the PCC region, which can result in a UBSAN if the value is greater than 4. For example: UBSAN: shift-out-of-bounds in drivers/acpi/cppc_acpi.c:1090:9 shift exponent 32 is too large for 32-bit type 'int' CPU: 61 UID: 0 PID: 1220 Comm: (udev-worker) Not tainted 7.0.10-201.fc44.aarch64 #1 PREEMPT(lazy) Hardware name: To be filled by O.E.M. Call trace: ...(trimming) ubsan_epilogue+0x10/0x48 __ubsan_handle_shift_out_of_bounds+0xdc/0x1e0 cpc_write+0x4d0/0x670 cppc_set_perf+0x18c/0x490 cppc_cpufreq_cpu_init+0x1c8/0x380 [cppc_cpufreq] ... (trimming) Lets fix this by validating the region type, as well as whether access_width has a value. Then since we are returning bit_width directly for ACPI_ADR_SPACE_PLATFORM_COMM, drop the code correcting the size.