CVE-2022-49900 in Linux
Сводка
по VulDB • 14.06.2026
В ядре Linux устранена следующая уязвимость:
i2c: piix4: Исправлено отсутствие удаления адаптера в функции piix4_remove()
При выполнении инициализации через функцию piix4_probe(), адаптер piix4 регистрируется следующим образом:
piix4_probe() piix4_add_adapters_sb800() / piix4_add_adapter() i2c_add_adapter()
В зависимости от типа обнаруженного устройства вызывается либо функция piix4_add_adapters_sb800(), либо одиночная функция piix4_add_adapter(). Для первого случая переменная piix4_adapter_count устанавливается равной количеству адаптеров, тогда как для второго она не устанавливается и остается по умолчанию *нулевой*.
При удалении модуля piix4 функция piix4_remove() удаляет адаптеры, добавленные в функции piix4_probe(), опираясь на значение переменной piix4_adapter_count. Поскольку при наличии одиночного адаптера счетчик равен нулю, сам адаптер не удаляется, что приводит к утечке ресурсов, выделенных для этого адаптера, таких как клиент i2c и устройство.
Эти ресурсы могут по-прежнему использоваться подсистемой i2c или шиной, вызывая проблемы. Легко воспроизводимый сценарий заключается в том, что если регистрируется новый адаптер, подсистема i2c получает доступ к утеченному адаптеру и пытается вызвать функцию smbus_algorithm, которая уже была освобождена:
Вызывается командой: rmmod i2c_piix4 && modprobe max31730
BUG: unable to handle page fault for address: ffffffffc053d860 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page Oops: 0000 [#1] PREEMPT SMP KASAN
CPU: 0 PID: 3752 Comm: modprobe Tainted: G Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) RIP: 0010:i2c_default_probe (drivers/i2c/i2c-core-base.c:2259) i2c_core RSP: 0018:ffff888107477710 EFLAGS: 00000246 ... <TASK> i2c_detect (drivers/i2c/i2c-core-base.c:2302) i2c_core __process_new_driver (drivers/i2c/i2c-core-base.c:1336) i2c_core bus_for_each_dev (drivers/base/bus.c:301) i2c_for_each_dev (drivers/i2c/i2c-core-base.c:1823) i2c_core i2c_register_driver (drivers/i2c/i2c-core-base.c:1861) i2c_core do_one_initcall (init/main.c:1296) do_init_module (kernel/module/main.c:2455) ... </TASK> ---[ end trace 0000000000000000 ]---
Для устранения этой проблемы корректно устанавливается значение piix4_adapter_count равным 1 для случая одиночного адаптера, чтобы его можно было нормально удалить.
If you want to get best quality of vulnerability data, you may have to visit VulDB.