In the Linux kernel, the following vulnerability has been resolved:
net: qrtr: Fix a refcount bug in qrtr_recvmsg()
Syzbot reported a bug as following:
refcountt: addition on 0; use-after-free. ... RIP: 0010:refcountwarn_saturate+0x17c/0x1f0 lib/refcount.c:25 ... Call Trace: <TASK> __refcount_add include/linux/refcount.h:199 [inline] _refcountinc include/linux/refcount.h:250 [inline] refcountinc include/linux/refcount.h:267 [inline] krefget include/linux/kref.h:45 [inline] qrtrnodeacquire net/qrtr/afqrtr.c:202 [inline] qrtrnodelookup net/qrtr/afqrtr.c:398 [inline] qrtrsendresumetx net/qrtr/afqrtr.c:1003 [inline] qrtrrecvmsg+0x85f/0x990 net/qrtr/afqrtr.c:1070 sockrecvmsgnosec net/socket.c:1017 [inline] sockrecvmsg+0xe2/0x160 net/socket.c:1038 qrtrnsworker+0x170/0x1700 net/qrtr/ns.c:688 processonework+0x991/0x15c0 kernel/workqueue.c:2390 workerthread+0x669/0x1090 kernel/workqueue.c:2537
It occurs in the concurrent scenario of qrtrrecvmsg() and qrtrendpoint_unregister() as following:
cpu0 cpu1
qrtrrecvmsg qrtrendpointunregister qrtrsendresumetx qrtrnoderelease qrtrnodelookup mutexlock(&qrtrnodelock) spinlockirqsave(&qrtrnodeslock, ) refcountdecandtest(&node->ref) [node->ref == 0] radixtreelookup [node != NULL] __qrtrnoderelease qrtrnodeacquire spinlockirqsave(&qrtrnodeslock, ) krefget(&node->ref) [WARNING] ... mutexunlock(&qrtrnodelock)
Use qrtrnodelock to protect qrtrnodelookup() implementation, this is actually improving the protection of node reference.
{
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/53xxx/CVE-2023-53445.json",
"cna_assigner": "Linux"
}