关键漏洞信息 漏洞类型: rxrpc: Fix recv-recv race of completed call 描述: - 当一个调用接收到事件(如传入数据)时,该调用会被放置在套接字的队列中,并且在recvmsg中的线程可以被唤醒去处理它。一旦线程从队列中拾取了调用,进一步的事件将导致它被重新排队,一旦套接字锁被释放(recvmsg使用call->user_mutex允许套接字并行使用),第二个线程可以进入并再次从套接字队列中弹出调用。 - 在这种情况下,第一个线程将从调用中接收数据,而第二个线程将被阻塞在call->user_mutex上。第一个线程此时可以处理它为调用选择的事件和第二个线程选择调用的事件,并可能看到调用终止,在这种情况下,调用将被“释放”,解耦分配给它的用户调用ID(RXRPC_USER_CALL_ID在控制消息中)。 - 第一个线程将正常返回,但第二个线程将在持有user_mutex的情况下唤醒,并且如果它看到调用已被第一个线程释放,它将引发BUG。 修复措施: - 通过仅取消排队调用并在已释放时忽略它来修复此问题。我们无法以任何方式告诉用户空间,因为用户调用ID已过期。 相关提交: - Fixes: 248f219cb8bc ("rxrpc: Rewrite the data and ack handling code") - Reported-by: Junvyyang, Tencent Zhuque Lab - Signed-off-by: David Howells - Reviewed-by: Jeffrey Altman 链接: - https://patchwork.kernel.org/patch/17074350.3767366-3-dhowells@redhat.com