В ядре Linux устранена следующая уязвимость:
светодиоды:led-class: Добавляйте светодиод вleds_list только тогда, когда он полностью готов
До этого изменения светодиод добавлялся вleds_list передled_init_core().
вызывается и добавляется в список до того, как будет полученled_classdev.set_brightness_work
инициализирован. Это оставляет окно, в которомled_trigger_register() светодиода по умолчанию.
триггер вызоветled_trigger_set(), который вызываетled_set_brightness()
что, в свою очередь, поставит в очередь *неинициализированные*
led_classdev.set_brightness_work. В этой гонке участвует драйвер EC lenovo-thinkpad-t14s, который регистрируется
2 светодиода с триггером по умолчанию, предоставленным snd_ctl_led.ko вкратце.
преемственность.
Первый методled_classdev_register() вызывает асинхронный модзонд
snd_ctl_led запускается, и этот async modprobe удается точно попасть
окно, в котором второй светодиод находится в спискеleds_list безled_init_core()
к этому призывают, что приводит к:
------------[вырезать здесь]------------
ВНИМАНИЕ: ЦП: 11 PID: 5608 в kernel/workqueue.c:4234 __flush_work+0x344/0x390
Название оборудования: LENOVO 21N2S01F0B/21N2S01F0B, BIOS N42ET93W (2.23) 01.09.2025
... Трассировка звонков:
__flush_work+0x344/0x390 (П)
flash_work+0x2c/0x50
led_trigger_set+0x1c8/0x340
led_trigger_register+0x17c/0x1c0
led_trigger_register_simple+0x84/0xe8
snd_ctl_led_init+0x40/0xf88 [snd_ctl_led]
do_one_initcall+0x5c/0x318
do_init_module+0x9c/0x2b8
load_module+0x7e0/0x998
Закройте окно гонки, переместив добавление светодиода вleds_list в
после вызоваled_init_core().
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: leds: led-class: Only Add LED to leds_list when it is fully ready Before this change the LED was added to leds_list before led_init_core() gets called adding it the list before led_classdev.set_brightness_work gets initialized. This leaves a window where led_trigger_register() of a LED's default trigger will call led_trigger_set() which calls led_set_brightness() which in turn will end up queueing the *uninitialized* led_classdev.set_brightness_work. This race gets hit by the lenovo-thinkpad-t14s EC driver which registers 2 LEDs with a default trigger provided by snd_ctl_led.ko in quick succession. The first led_classdev_register() causes an async modprobe of snd_ctl_led to run and that async modprobe manages to exactly hit the window where the second LED is on the leds_list without led_init_core() being called for it, resulting in: ------------[ cut here ]------------ WARNING: CPU: 11 PID: 5608 at kernel/workqueue.c:4234 __flush_work+0x344/0x390 Hardware name: LENOVO 21N2S01F0B/21N2S01F0B, BIOS N42ET93W (2.23 ) 09/01/2025 ... Call trace: __flush_work+0x344/0x390 (P) flush_work+0x2c/0x50 led_trigger_set+0x1c8/0x340 led_trigger_register+0x17c/0x1c0 led_trigger_register_simple+0x84/0xe8 snd_ctl_led_init+0x40/0xf88 [snd_ctl_led] do_one_initcall+0x5c/0x318 do_init_module+0x9c/0x2b8 load_module+0x7e0/0x998 Close the race window by moving the adding of the LED to leds_list to after the led_init_core() call.