CVE-2022-49149: rxrpc: Fix call timer start racing with call destruction
In the Linux kernel, the following vulnerability has been resolved:
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
debian/linuxto a version that resolves this vulnerability.Fixed in 6.1.176-1Fixed in 6.1.187-1Fixed in 6.12.107-1Fixed in 6.12.111-1Fixed in 7.2.9-1Fixed in 7.2.10-1 - Compensating control
Before starting the rxrpc_call timer, try to take a reference on the rxrpc_call struct and pass the reference to the timer; if the timer or work item is already queued or running, discard the extra reference. The timer completion routine should pass the reference to the call's work item when queueing it, and discard the reference if the timer is already running.
Event History
Frequently Asked Questions
What conditions are required for this issue to occur?
The race requires an incoming packet addressed to an RXRPC call while that call is being destroyed. Packet input runs in softirq context with only an RCU read lock, allowing a stopped call timer to be restarted concurrently with teardown.
What is the likely impact if the race is triggered?
The timer dispatch code may oops if the timer is restarted and later executes after its associated state has been deallocated. This can cause a kernel crash.
How does the fix prevent the race?
The fix attempts to acquire a reference to the rxrpc_call before starting its timer and transfers that reference through the timer and queued work item. References are discarded when the timer or work is already queued or running, preventing the call from being freed while those operations still use it.