В ядре Linux устранена следующая уязвимость:
mtd: избежать сбоя при загрузке в анализаторе таблицы разделов RedBoot. Учитывая CONFIG_FORTIFY_SOURCE=y и последний компилятор,
commit 439a1bcac648 («укрепить: используйте __builtin_dynamic_object_size(), когда
доступно") выдает предупреждение ниже и сообщение "Упс". Поиск таблицы разделов RedBoot в 50000000.flash по смещению 0x7e0000
------------[вырезать здесь]------------
ВНИМАНИЕ: lib/string_helpers.c:1035 по адресу 0xc029e04c, CPU#0: swapper/0/1.
memcmp: обнаружено переполнение буфера: чтение 15 байт из буфера размером 14
Модули, связанные с:
ЦП: 0 UID: 0 PID: 1 Связь: swapper/0 Не испорчен 6.19.0 #1 НЕТ
Как сказал Кис, «имена» указывают на конечное «намелен», состоящее из многих байтов.
о распределении... 'namelen' может иметь вообще любую длину.
Это предупреждение об укреплении кажется мне законным - раньше этот код читал
после окончания распределения». Поскольку размер динамического распределения рассчитывается с помощью strlen()
мы можем использовать strcmp() вместо memcmp() и оставаться в пределах границ.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: mtd: Avoid boot crash in RedBoot partition table parser Given CONFIG_FORTIFY_SOURCE=y and a recent compiler, commit 439a1bcac648 ("fortify: Use __builtin_dynamic_object_size() when available") produces the warning below and an oops. Searching for RedBoot partition table in 50000000.flash at offset 0x7e0000 ------------[ cut here ]------------ WARNING: lib/string_helpers.c:1035 at 0xc029e04c, CPU#0: swapper/0/1 memcmp: detected buffer overflow: 15 byte read of buffer size 14 Modules linked in: CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.19.0 #1 NONE As Kees said, "'names' is pointing to the final 'namelen' many bytes of the allocation ... 'namelen' could be basically any length at all. This fortify warning looks legit to me -- this code used to be reading beyond the end of the allocation." Since the size of the dynamic allocation is calculated with strlen() we can use strcmp() instead of memcmp() and remain within bounds.