Skip to main content
← All vulnerabilities
CVE-2026-74692

net/smc: fix TOCTOU race between smc_listen_out() and listener close

Published
Last modified
published
Not listed in CISA KEV
Fix
Fixed in 4.20, 5.15.216, 6.1.183, 6.6.152, 6.12.104, and 2 more
None on Exploit-DB, Metasploit or GitHub
  • Exploitation: none
  • Automatable: yes
  • Technical impact: partial

Summary

In the Linux kernel, the following vulnerability has been resolved: net/smc: fix TOCTOU race between smc_listen_out() and listener close smc_listen_out() reads lsmc->sk.sk_state without the listener lock, then acquires lock_sock_nested() only after the check passes. This opens a window where smc_close_active() can transition the listener to SMC_CLOSED, call smc_close_cleanup_listen() to drain the accept queue, and release the lock, all between the lockless read and the delayed lock acquisition: 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) /* child enqueued on dead listener */ smc_close_active() flushes only tcp_listen_work. Work items already dispatched onto smc_hs_wq for the CLC handshake continue running unguarded. smc_accept_enqueue() takes a sock_hold() on the child that is never released, so the child smc_sock, its clcsock, and the reference all leak. A remote peer that opens TCP connections while the server calls close() can exhaust kernel memory. Move lock_sock_nested() to before the sk_state check so that the test and the enqueue are atomic under the listener lock.

Timeline

  1. CVE published
  2. CISA SSVC assessment

    Exploitation: none · Automatable: yes · Technical impact: partial

  3. Record last updated

Affected versions

  • Linux Linux

    From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in 53c7938d8bcfde3296ec1a347ba2a9393c1fdcfa; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in feb71634bb1abab3e8fb5cde874b27001cc1282e; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in 01865e1ddb126b25ac9eba5cdd7ec49e11183a64; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in 00f89433777236ced4771211047fb5d4cd581cea; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in 78e5ebcd1c10ed7c8bda0a99e0abd5b62da86d67; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in ff5bcd804b5bc5c64736b7d318c20e12ea9506b8; From fd57770dd198f5b2ddd5b9e6bf282cf98d63adb9 · fixed in 185a4caeecabc150106deda1da170b09f2ad803f; From 4.19.299 · fixed in 4.20

  • Linux Linux

    5.1

  • KernelLinux

    From 5.1.0 · fixed in 5.15.216; From 5.16.0 · fixed in 6.1.183; From 6.2.0 · fixed in 6.6.152; From 6.7.0 · fixed in 6.12.104; From 6.13.0 · fixed in 6.18.45; From 6.19.0 · fixed in 7.1.9

References 7

git.kernel.org