net: airoha: npu: cancel wdt_work after releasing the WDT IRQ
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 6.18.55, 7.2.9
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
Summary
In the Linux kernel, the following vulnerability has been resolved: net: airoha: npu: cancel wdt_work after releasing the WDT IRQ airoha_npu_remove() calls cancel_work_sync() on each core's wdt_work, but the watchdog IRQ that queues it is requested with devm_request_irq() and is freed only after .remove() returns. airoha_npu_wdt_handler() can therefore schedule_work() again once the cancel has returned. struct airoha_npu, which contains the work, is devm_kzalloc()'d and is freed in that same unwind, so the late work dereferences freed memory. Register the work with devm_work_autocancel() before devm_request_irq() and drop .remove(). Devres runs in reverse order, so the IRQ is freed before cancel_work_sync(), including when probe fails. A cancel left in .remove() cannot get that order. Initializing the work first also stops a pending watchdog interrupt from queuing an uninitialized work item. Probe currently calls INIT_WORK() only after devm_request_irq(). This issue was identified during our ongoing static-analysis research while reviewing kernel code.
Timeline
- CVE published
- Record last updated
Affected versions
- Linux Linux
From 23290c7bc190def4e1ca61610992d9b7c32e33f3 · fixed in aca91d8fa0ecbc990ebf9a688c684dda78a43c00; From 23290c7bc190def4e1ca61610992d9b7c32e33f3 · fixed in da9d42531f3a6dfea2e9c775b62a46185dbf280a; From 23290c7bc190def4e1ca61610992d9b7c32e33f3 · fixed in 4bdee8060d1e4581624e68fbd369b1afb14df4bc
- Linux Linux
6.15
- KernelLinux
From 6.15.0 · fixed in 6.18.55; From 6.19.0 · fixed in 7.2.9