CVE-2026-23450
Official description Straight from the sourceThe vendor's or NVD's own wording, published unedited. Authoritative, but often terse — it says what broke, rarely what to do.
NVD · uneditedIn the Linux kernel, the following vulnerability has been resolved: net/smc: fix NULL dereference and UAF in smc_tcp_syn_recv_sock() Syzkaller reported a panic in smc_tcp_syn_recv_sock() [1]. smc_tcp_syn_recv_sock() is called in the TCP receive path (softirq) via icsk_af_ops->syn_recv_sock on the clcsock (TCP listening socket). It reads sk_user_data to get the smc_sock pointer. However, when the SMC listen socket is being closed concurrently, smc_close_active() sets clcsock->sk_user_data to NULL under sk_callback_lock, and then the smc_sock itself can be freed via sock_put() in smc_release(). This leads to two issues: 1) NULL pointer dereference: sk_user_data is NULL when accessed. 2) Use-after-free: sk_user_data is read as non-NULL, but the smc_sock is freed before its fields (e.g., queued_smc_hs, ori_af_ops) are accessed. The race window looks like this (the syzkaller crash [1] triggers via the SYN cookie path: tcp_get_cookie_sock() -> smc_tcp_syn_recv_sock(), but the normal tcp_check_req() path has the same race): CPU A (softirq) CPU B (process ctx) tcp_v4_rcv() TCP_NEW_SYN_RECV: sk = req->rsk_listener sock_hold(sk) /* No lock on listener */ smc_close_active(): write_lock_bh(cb_lock) sk_user_data = NULL write_unlock_bh(cb_lock) ... smc_clcsock_release() sock_put(smc->sk) x2 -> smc_sock freed! tcp_check_req() smc_tcp_syn_recv_sock(): smc = user_data(sk) -> NULL or dangling smc->queued_smc_hs -> crash! Note that the clcsock and smc_sock are two independent objects with separate refcounts. TCP stack holds a reference on the clcsock, which keeps it alive, but this does NOT prevent the smc_sock from being freed. Fix this by using RCU and refcount_inc_not_zero() to safely access smc_sock. Since smc_tcp_syn_recv_sock() is called in the TCP three-way handshake path, taking read_lock_bh on sk_callback_lock is too heavy and would not survive a SYN flood attack. Using rcu_read_lock() is much more lightweight. - Set SOCK_RCU_FREE on the SMC listen socket so that smc_sock freeing is deferred until after the RCU grace period. This guarantees the memory is still valid when accessed inside rcu_read_lock(). - Use rcu_read_lock() to protect reading sk_user_data. - Use refcount_inc_not_zero(&smc->sk.sk_refcnt) to pin the smc_sock. If the refcount has already reached zero (close path completed), it returns false and we bail out safely. Note: smc_hs_congested() has a similar lockless read of sk_user_data without rcu_read_lock(), but it only checks for NULL and accesses the global smc_hs_wq, never dereferencing any smc_sock field, so it is not affected. Reproducer was verified with mdelay injection and smc_run, the issue no longer occurs with this patch applied. [1] https://syzkaller.appspot.com/bug?extid=827ae2bfb3a3529333e9
Technical summary Written by usOur analysis, written from the advisory, the CVSS vector and the affected-version data. It adds context the advisory leaves out, and never invents facts that are not in the source.
dbcve analysis · high confidenceA race condition in the Linux kernel's SMC (Shared Memory Communications) module allows concurrent access to sk_user_data without proper synchronization. When smc_close_active() sets clcsock->sk_user_data to NULL while smc_tcp_syn_recv_sock() reads it in the TCP receive path (softirq), this causes either a NULL pointer dereference or a use-after-free of the smc_sock object.
Verify against the referenced sources before acting — the references below are authoritative for this CVE, this summary is not.
Affected products & versions What the vendor confirmedThe version ranges the vendor confirmed as vulnerable. If your version sits inside a range here, treat yourself as exposed until you have upgraded.
NVD · CPE data>= 5.15.174, < 5.15.203>= 5.18, < 6.1.167>= 6.2, < 6.6.130>= 6.7, < 6.12.78>= 6.13, < 6.18.20>= 6.19, < 6.19.10= 7.0CVSS breakdown How the score is builtThe industry scoring standard. It rates how the flaw is reached, what it takes to exploit, and what an attacker gains — the score is derived from those, not the other way round.
From the vector- Attack vector
- Network
- Complexity
- Low
- Privileges
- None
- User interaction
- None
- Scope
- Unchanged
- Confidentiality
- High
- Integrity
- High
- Availability
- High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Am I affected? How to checkSteps we derive from the advisory and the affected-version data, so you can decide whether this CVE reaches your setup. They are a guide, not a scan — your own configuration is the authority.
dbcve checksWork through these to decide whether this CVE applies to you.
-
Check kernel versionRun `uname -r` to get the running kernel versionAffected if The version falls within any of these ranges: 5.15.174 to 5.15.202, 5.18 to 6.1.166, 6.2 to 6.6.129, 6.7 to 6.12.77, 6.13 to 6.18.19, 6.19 to 6.19.9, or 7.0
-
Verify SMC kernel support is presentCheck if the SMC (Socket Memory Classification) module or built-in support exists: `grep -i smc /boot/config-$(uname -r)` or look for `CONFIG_SMC` in kernel configAffected if SMC support is compiled into the kernel (CONFIG_SMC=y or module loaded)
-
Check if SMC is actively in useInspect for active SMC sockets: `ls -la /proc/net/smc/` or `cat /proc/net/smc/smc`Affected if The system has active SMC connections or the smc kernel module is loaded (`lsmod | grep smc`)
-
Confirm vulnerability window existsThis is a race condition occurring during concurrent socket close while TCP connection is in SYN receive state. The vulnerability exists in the smc_tcp_syn_recv_sock() code path.Affected if Kernel version is vulnerable AND SMC is enabled and in use
You are affected only if your kernel version is in the affected ranges AND the SMC (Socket Memory Classification) feature is enabled and actively handling connections on your system.
Generated from the published advisory. Verify against your own configuration.
Remediation Closing itWhat it takes to close this. Where a vendor fix exists we point at it; where none exists we say so plainly, and can build one. Effort estimates are scoped from the advisory, not from your codebase.
dbcve · scoped5.15.2036.1.1676.6.130
Apply the kernel patch which adds RCU protection (SOCK_RCU_FREE flag, rcu_read_lock(), and refcount_inc_not_zero()) to safely access smc_sock from the TCP handshake path without taking heavy locks.
Linux Kernel 5.15.203, 6.1.167, 6.6.130, or 6.12.78 (depending on which branch you are on)
- Identify the currently running Linux kernel version using `uname -r`
- Determine which version range your current kernel falls into based on the affected versions: 5.15.174-5.15.202, 5.18-6.1.166, 6.2-6.6.129, or 6.7-6.12.77
- Obtain a kernel upgrade to a version that includes the fix: upgrade to kernel 5.15.203 or later for the 5.15.x branch, 6.1.167 or later for the 6.1.x branch, 6.6.130 or later for the 6.6.x branch, or 6.12.78 or later for the 6.7.x/6.12.x branch
- Apply the upgrade via your distribution's standard kernel update process (e.g., `apt-get dist-upgrade`, `yum update`, or distribution-specific package manager)
- Reboot the system to load the patched kernel
- Verify the running kernel version with `uname -r` to confirm the fix is active
Generated from the published advisory — verify against the referenced sources before acting.
- Consultation4.0 h
- Implementation8.0 h
- Testing12.0 h
- Review / QA4.0 h
An estimate, not a bill — we confirm scope with you before any work starts. Need it this week? Rush from $7,616.
Scan for this in your stack
Free · runs locallyCheck whether your project pulls in CVE-2026-23450 — or any other known-vulnerable package — straight from your lock files. Free and open source; it runs locally and uploads nothing.
References Go to the primary sourcePrimary sources — vendor advisories, patches and trackers. Where our summary and a reference disagree, the reference wins.
Primary sourcesPractitioner notes
ContributedPeer-ranked notes from engineers who’ve handled CVE-2026-23450 in production — separate from our analysis above.
The advisory tells you what broke. It rarely tells you what actually worked. If you’ve dealt with this one, that detail is what the next engineer is searching for.
- The version that genuinely resolved it — not the one the vendor claimed
- A config change or rule that shut the vector down
- A gotcha in the upgrade path that cost you an afternoon
No notes yet
Be the first to add a field note for this CVE — a mitigation you’ve verified, a version caveat, or a link to a working fix. Sign in above to contribute.
A place for practitioners to share what actually worked: a mitigation you’ve tested, a configuration change, a version- or environment-specific caveat, or a link to a verified patch. The most useful notes rise to the top as peers upvote them, so the signal stays high.
- Verified mitigations, workarounds, and config changes
- Version or environment caveats, and links to real fixes
- No weaponised exploit code, or anything meant to cause harm
- No spam, self-promotion, credentials, or personal data