CVE-2026-64428 in Linux
Tóm tắt
Bởi VulDB • 25/07/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
gpio: sch: sử dụng raw_spinlock_t trong đường dẫn khởi tạo ngắt (irq startup path)
sch_irq_unmask() kích hoạt GPIO IRQ và sau đó cập nhật trạng thái bộ điều khiển thông qua sch_irq_mask_unmask(), hàm này lấy sch->lock bằng cách sử dụng spin_lock_irqsave(). Callback có thể được gọi từ irq_startup() khi đang thiết lập một IRQ đã yêu cầu. Đường dẫn này không cho phép ngủ (non-sleepable), nhưng trên PREEMPT_RT, một spinlock_t thông thường sẽ trở thành sleeping lock.
Vấn đề này được phát hiện bởi công cụ phân tích tĩnh của chúng tôi và sau đó được xem xét thủ công đối với cây mã nguồn hiện tại.
PoC đã kiểm thử giữ nguyên chuỗi gọi request_threaded_irq() -> __setup_irq() -> irq_startup() -> sch_irq_unmask() -> sch_irq_mask_unmask() và sử dụng cạnh (edge) spin_lock_irqsave(&sch->lock) ban đầu. Lockdep báo cáo:
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]
Chuyển đổi khóa của bộ điều khiển SCH thành raw_spinlock_t. Khóa này cũng được sử dụng bởi các callback hướng (direction) và giá trị (value) của GPIO, nhưng các đoạn mã quan trọng đó chỉ cập nhật các thanh ghi GPIO dựa trên MMIO và không chứa các thao tác cho phép ngủ. Do đó, việc giữ khóa đăng ký này ở trạng thái non-sleeping là phù hợp đối với các callback irqchip và không làm thay đổi hợp đồng khóa (locking contract) phía GPIO.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.