In the Linux kernel, the following vulnerability has been resolved:
sh: push-switch: Reorder cleanup operations to avoid use-after-free bug
The original code puts flush_work() before timer_shutdown_sync()
in switch_drv_remove(). Although we use flush_work() to stop
the worker, it could be rescheduled in switch_timer(). As a result,
a use-after-free bug can occur. The details are shown below:
(cpu 0) | (cpu 1)
switch_drv_remove() |
flush_work() |
… | switch_timer // timer
| schedule_work(&psw->work)
timer_shutdown_sync() |
… | switch_work_handler // worker
kfree(psw) // free |
| psw->state = 0 // use
This patch puts timer_shutdown_sync() before flush_work() to
mitigate the bugs. As a result, the worker and timer will be
stopped safely before the deallocate operations.
[
{
"cpes": [
"cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:*"
],
"vendor": "linux",
"product": "linux_kernel",
"versions": [
{
"status": "affected",
"version": "9f5e8eee5cfe",
"lessThan": "610dbd8ac271",
"versionType": "custom"
},
{
"status": "affected",
"version": "9f5e8eee5cfe",
"lessThan": "246f80a0b17f",
"versionType": "custom"
},
{
"status": "affected",
"version": "2.6.20"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "2.6.20",
"versionType": "custom"
},
{
"status": "unaffected",
"version": "6.54",
"versionType": "custom",
"lessThanOrEqual": "6.6"
},
{
"status": "unaffected",
"version": "0",
"versionType": "custom",
"lessThanOrEqual": "6.6"
}
],
"defaultStatus": "unknown"
}
]