CVE-2026-64428 in Linux
Сводка
по VulDB • 28.07.2026
В ядре Linux устранена следующая уязвимость:
gpio: sch: использовать raw_spinlock_t в пути запуска прерывания (irq startup path)
Функция sch_irq_unmask() включает GPIO IRQ, а затем обновляет состояние контроллера через sch_irq_mask_unmask(), которая захватывает sch->lock с помощью spin_lock_irqsave(). Этот колбэк может быть вызван из irq_startup() при настройке запрошенного прерывания. Данный путь не является спящим (non-sleepable), но в конфигурации PREEMPT_RT обычный spinlock_t превращается в блокирующий сон lock (sleeping lock).
Эта проблема была обнаружена нашим инструментом статического анализа, а затем проверена вручную по текущему дереву исходного кода.
Рабочий пример эксплуатации (PoC) сохранил цепочку вызовов request_threaded_irq() -> __setup_irq() -> irq_startup() -> sch_irq_unmask() -> sch_irq_mask_unmask() и использовал крайний случай с оригинальным spin_lock_irqsave(&sch->lock). Lockdep сообщил:
BUG: sleeping function called from invalid context hardirqs last disabled at ... __setup_irq.constprop.0 ... [vuln_msv]
sch_rt_spin_lock_irqsave+0x1c/0x30 [vuln_msv]
sch_irq_mask_unmask.constprop.0+0x31/0x70 [vuln_msv]
__setup_irq.constprop.0+0xd/0x30 [vuln_msv]
Преобразовать блокировку контроллера SCH в raw_spinlock_t. Эта же блокировка также используется колбэками направления и значения GPIO, но эти критические секции только обновляют регистры GPIO с поддержкой MMIO и не содержат операций, допускающих сон (sleepable operations). Поэтому сохранение этой блокировки регистров несонящей является правильным для колбэков irqchip и не изменяет контракт блокировки на стороне GPIO.
If you want to get best quality of vulnerability data, you may have to visit VulDB.