В ядре Linux устранена следующая уязвимость:
платформа/x86: hp-bioscfg: исправлено чтение OOB кучи в sk_store() и kek_store()
sk_store() и kek_store() удаляют конечную новую строку из sysfs
напишите перед выделением ключевого буфера:
длина = количество;
если (buf[длина - 1] == '\n')
длина--;
bioscfg_drv.spm_data.signing_key = kmemdup(buf, length, GFP_KERNEL);
но затем передайте исходное «количество» (а не «длину») в качестве размера копии
hp_wmi_perform_query(), который memcpy() извлекает столько байтов из
Выделение размером «длина», считывание одного байта после него всякий раз, когда выполняется запись.
заканчивается на новую строку, что является обычным случаем, когда оболочка «эхо» передает в sysfs. КАСАН подтверждает это прямо:
ОШИБКА: KASAN: плита выходит за пределы границ в hp_wmi_perform_query+0x1e9/0x460 [hp_bioscfg]
Чтение размера 28 по адресу ffff88813c8e2b80 с помощью задачи python3/16022.
...
sk_store+0xa7/0x240 [hp_bioscfg]
kernfs_fop_write_iter+0x3e1/0x5d0
... Адрес ошибки находится в 0 байтах внутри
выделенная 27-байтовая область [ffff88813c8e2b80, ffff88813c8e2b9b)
Воспроизводится одинаково для kek_store и с разными размерами записи.
(28, 57, 201 байт), каждый раз считывая ровно один байт после
kmemdup() выделяет на один байт меньше, чем записывает.
Исправьте, передав «длину» вместо «счета» в hp_wmi_perform_query().
в обеих функциях.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: platform/x86: hp-bioscfg: fix heap OOB read in sk_store() and kek_store() sk_store() and kek_store() strip a trailing newline from the sysfs write before allocating the key buffer: length = count; if (buf[length - 1] == '\n') length--; bioscfg_drv.spm_data.signing_key = kmemdup(buf, length, GFP_KERNEL); but then pass the original "count" (not "length") as the copy size to hp_wmi_perform_query(), which memcpy()s that many bytes out of the "length"-sized allocation, reading one byte past it whenever the write ends in a newline, the normal case for a shell "echo" into sysfs. KASAN confirms this directly: BUG: KASAN: slab-out-of-bounds in hp_wmi_perform_query+0x1e9/0x460 [hp_bioscfg] Read of size 28 at addr ffff88813c8e2b80 by task python3/16022 ... sk_store+0xa7/0x240 [hp_bioscfg] kernfs_fop_write_iter+0x3e1/0x5d0 ... The buggy address is located 0 bytes inside of allocated 27-byte region [ffff88813c8e2b80, ffff88813c8e2b9b) Reproduced identically for kek_store, and at multiple write sizes (28, 57, 201 bytes), each time reading exactly one byte past a kmemdup() allocation one byte smaller than the write. Fix by passing "length" instead of "count" to hp_wmi_perform_query() in both functions.