In the Linux kernel, the following vulnerability has been resolved:
amt: fix use-after-free in AMT delayed works
When an AMT device is removed, pending delayed works can still access the freed amt_dev structure, which may result in kernel crashes or memory corruption.
amtdevstop() cancels reqwq and discoverywq with canceldelayedworksync(), but these works can be scheduled again from eventwq after the cancellation. This allows delayed works to access the freed amt_dev structure after the netdev has been released.
The following is a simple race scenario:
CPU0 CPU1
amtdevstop() canceldelayedworksync() amteventwork() moddelayedwork(reqwq) free netdev reqwq accesses freed amtdev
Use disabledelayedworksync() in amtdevstop() to prevent reqwq and discovery_wq from being queued again and wait for running work items to complete.
The delayed works are disabled after initialization in amt_newlink() and enabled only when the device is successfully opened. This keeps the delayed work lifecycle synchronized with the lifetime of the AMT device.