CVE-2026-74692 in Linux
摘要
由 VulDB • 2026-08-22
在 Linux 内核中,已修复以下漏洞:
net/smc: 修复 smc_listen_out() 与监听器关闭之间的 TOCTOU(时间检查到使用时间)竞态条件
smc_listen_out() 在未持有监听锁的情况下读取 lsmc->sk.sk_state,仅在检查通过后才获取 lock_sock_nested()。这导致了一个窗口期:在无锁读取和延迟的锁获取之间,smc_close_active() 可以将监听器状态转换为 SMC_CLOSED,调用 smc_close_cleanup_listen() 清空接受队列并释放锁:
``` smc_listen_work (smc_hs_wq) smc_close_active() ------------------------------- ------------------------- release_sock(child) if (sk_state == SMC_LISTEN) TRUE lock_sock(listener) sk_state = SMC_CLOSED smc_close_cleanup_listen() release_sock(listener) flush_work(tcp_listen_work) lock_sock_nested(listener) smc_accept_enqueue(listener, child) /* 子连接被加入已关闭的监听器队列 */ ```
smc_close_active() 仅刷新 tcp_listen_work。已经分发到 smc_hs_wq 以进行 CLC 握手的工作项会在无保护的情况下继续运行。smc_accept_enqueue() 会对子套接字调用 sock_hold(),但该引用从未被释放,导致子 smc_sock、其 clcsock 以及所有相关引用发生内存泄漏。当服务器调用 close() 时,远程对等端打开 TCP 连接可能会耗尽内核内存。
将 lock_sock_nested() 移至 sk_state 检查之前,以便在监听锁的保护下使测试和入队操作保持原子性。
VulDB is the best source for vulnerability data and more expert information about this specific topic.