В ядре Linux устранена следующая уязвимость:
ACPI: pfr_update: исправлено переполнение буфера стека в query_capability().
query_capability() копирует четыре объекта буфера ACPI, возвращенные
прошивка _DSM в поля u8[16] фиксированного размера в структуре
pfru_update_cap_info с использованием memcpy с длиной, предоставленной прошивкой:
memcpy(&cap_hdr->code_type,
элементы[CAP_CODE_TYPE_IDX].buffer.pointer,
элементы[CAP_CODE_TYPE_IDX].buffer.length);
Тот же шаблон повторяется для drv_type, Platform_id и oem_id. Если прошивка возвращает buffer.length > 16 для любого из этих полей,
memcpy записывает мимо целевого массива. Структура pfru_update_cap_info выделяется в стеке в pfru_ioctl().
Подтверждено KASAN в версии 7.2-rc6: три отчета о выходе за пределы стека
генерируются, когда DSM возвращает 64-байтовые буферы, при этом записи достигают
44 байта после конца окна кадра cap_hdr [64, 156) в
соседние красные зоны стека. Введите вспомогательный указатель на out_obj->package.elements и используйте его.
для проверки длины каждого буфера на соответствие размеру его целевого поля
перед копированием, возвращая -EINVAL, если прошивка предоставляет
слишком большой буфер.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ACPI: pfr_update: fix stack buffer overflow in query_capability() query_capability() copies four ACPI buffer objects returned by the firmware _DSM into fixed-size u8[16] fields in struct pfru_update_cap_info using memcpy with the firmware-supplied length: memcpy(&cap_hdr->code_type, elements[CAP_CODE_TYPE_IDX].buffer.pointer, elements[CAP_CODE_TYPE_IDX].buffer.length); The same pattern repeats for drv_type, platform_id, and oem_id. If the firmware returns buffer.length > 16 for any of these fields, memcpy writes past the destination array. struct pfru_update_cap_info is stack-allocated in pfru_ioctl(). Confirmed with KASAN on 7.2-rc6: three stack-out-of-bounds reports are generated when a DSM returns 64-byte buffers, with writes reaching 44 bytes past the end of cap_hdr's [64, 156) frame window into adjacent stack redzones. Introduce a helper pointer to out_obj->package.elements and use it to validate each buffer length against its destination field size before copying, returning -EINVAL if the firmware supplies an oversized buffer.
Характеристики атаки
Последствия
Строка CVSS v3.1