В ядре Linux устранена следующая уязвимость:
i3c: mipi-i3c-hci: исправлена гонка в i3c_hci_addr_to_dev().
i3c_hci_addr_to_dev() проходит по шине->devs.i3c, который защищен
автобус.блокировка (rwsem). Однако он вызывается из MIPI I3C HCI IRQ.
обработчик, который не может принимать bus.lock. Это позволяет одновременному устройству
добавление/удаление в ядре I3C для изменения списка во время его создания.
пройдены, что потенциально может привести к использованию после освобождения или сбоям.
Удалите зависимость от списка устройств шины и введите выделенный
таблица поиска. Добавьте массив ibi_devs[], индексированный записью DAT, поддерживаемый
под hci->lock. Обновите массив, когда IBI включены или отключены,
так что он всегда отражает набор устройств, которым разрешено генерировать IBI.
Также обновляйте информацию при освобождении IBI, чтобы охватить крайний случай, когда IBI освобождается.
освобождается без предварительного отключения (например, oldedev в
i3c_master_add_i3c_dev_locked()). Переместите i3c_hci_addr_to_dev() в core.c, переопределите его, используя новый
массив и добавьте утверждение lockdep, чтобы обеспечить удержание hci->lock.
по звонящим. Понизить уровень сообщения в обработке PIO и DMA IBI от ошибки до отладки
сообщение, потому что существует окно гонки, когда может возникнуть условие
нормально.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: i3c: mipi-i3c-hci: Fix race in i3c_hci_addr_to_dev() i3c_hci_addr_to_dev() walks bus->devs.i3c, which is protected by bus.lock (rwsem). However, it is invoked from the MIPI I3C HCI IRQ handler, which cannot take bus.lock. This allows concurrent device addition/removal in the I3C core to modify the list while it is being traversed, potentially leading to use-after-free or crashes. Remove the dependency on the bus device list and introduce a dedicated lookup table. Add an ibi_devs[] array indexed by DAT entry, maintained under hci->lock. Update the array when IBIs are enabled or disabled, so that it always reflects the set of devices allowed to generate IBIs. Also update when IBIs are freed, to cover the corner case when an IBI is freed without first being disabled (e.g. oldedev in i3c_master_add_i3c_dev_locked()). Move i3c_hci_addr_to_dev() into core.c, reimplement it using the new array, and add a lockdep assertion to enforce that hci->lock is held by callers. Demote a message in PIO and DMA IBI handling, from an error to a debug message, because there is a race window when the condition can arise normally.
Характеристики атаки
Последствия
Строка CVSS v3.1