CVE-2026-23394: af_unix: Give up GC if MSG_PEEK intervened.
In the Linux kernel, the following vulnerability has been resolved:
af_unix: Give up GC if MSG_PEEK intervened.
Igor Ushakov reported that GC purged the receive queue of
an alive socket due to a race with MSG_PEEK with a nice repro.
This is the exact same issue previously fixed by commit
cbcf01128d0a ("af_unix: fix garbage collect vs MSG_PEEK").
After GC was replaced with the current algorithm, the cited
commit removed the locking dance in unix_peek_fds() and
reintroduced the same issue.
The problem is that MSG_PEEK bumps a file refcount without
interacting with GC.
Consider an SCC containing sk-A and sk-B, where sk-A is
close()d but can be recv()ed via sk-B.
The bad thing happens if sk-A is recv()ed with MSG_PEEK from
sk-B and sk-B is close()d while GC is checking unix_vertex_dead()
for sk-A and sk-B.
GC thread User thread
--------- -----------
unix_vertex_dead(sk-A)
-> true <------.
\
`------ recv(sk-B, MSG_PEEK)
invalidate !! -> sk-A's file refcount : 1 -> 2
close(sk-B)
-> sk-B's file refcount : 2 -> 1
unix_vertex_dead(sk-B)
-> true
Initially, sk-A's file refcount is 1 by the inflight fd in sk-B
recvq. GC thinks sk-A is dead because the file refcount is the
same as the number of its inflight fds.
However, sk-A's file refcount is bumped silently by MSG_PEEK,
which invalidates the previous evaluation.
At this moment, sk-B's file refcount is 2; one by the open fd,
and one by the inflight fd in sk-A. The subsequent close()
releases one refcount by the former.
Finally, GC incorrectly concludes that both sk-A and sk-B are dead.
One option is to restore the locking dance in unix_peek_fds(),
but we can resolve this more elegantly thanks to the new algorithm.
The point is that the issue does not occur without the subsequent
close() and we actually do not need to synchronise MSG_PEEK with
the dead SCC detection.
When the issue occurs, close() and GC touch the same file refcount.
If GC sees the refcount being decremented by close(), it can just
give up garbage-collecting the SCC.
Therefore, we only need to signal the race during MSG_PEEK with
a proper memory barrier to make it visible to the GC.
Let's use seqcount_t to notify GC when MSG_PEEK occurs and let
it defer the SCC to the next run.
This way no locking is needed on the MSG_PEEK side, and we can
avoid imposing a penalty on every MSG_PEEK unnecessarily.
Note that we can retry within unix_scc_dead() if MSG_PEEK is
detected, but we do not do so to avoid hung task splat from
abusive MSG_PEEK calls.
Security readout for executives and security teams
Plain-English summary
Linux can mistakenly discard a live UNIX-domain socket receive queue during a narrowly timed interaction between garbage collection, MSG_PEEK, and socket closure. This may disrupt software using local sockets and passed file descriptors. Available evidence does not quantify severity or demonstrate privilege escalation, memory corruption, remote compromise, or data disclosure.
Executive priority
Schedule accelerated kernel validation and maintenance, especially for multi-tenant or untrusted-workload hosts. The evidence does not support emergency internet-wide incident handling, but the demonstrated kernel race warrants remediation. Reassess priority if a distribution publishes a high severity rating, broader impact, or exploitation evidence.
Technical view
A race in Linux AF_UNIX garbage collection can invalidate liveness checks. MSG_PEEK increments a file reference while GC evaluates a strongly connected socket component; a concurrent close can make GC misclassify live sockets as dead and purge a live receive queue. The fix uses a sequence counter so GC detects interference and defers collection.
Likely exposure
The condition requires an affected Linux kernel and workloads able to exercise AF_UNIX descriptor passing, MSG_PEEK, socket closure, and garbage collection concurrently. Hosts running complex or untrusted local workloads may deserve earlier review. The bundle mixes commit hashes and release identifiers, so exact affected ranges require vendor confirmation.
Exploitation context
The bundle reports a reproducer demonstrating the race, but provides no evidence of malicious exploitation. CVE-2026-23394 is not identified as KEV. Trigger feasibility does not establish a practical security exploit, and the sources do not define required privileges or effects beyond incorrect receive-queue purging.
Researcher notes
This is described as a regression of the issue previously fixed by commit cbcf01128d0a after replacement of the garbage-collection algorithm. The new fix signals MSG_PEEK interference and defers collection. Missing evidence includes CVSS, CWE, normalized affected ranges, privilege requirements, and security impact beyond receive-queue purging.
Mitigation direction
Upgrade to a vendor-supported kernel package containing the applicable AF_UNIX stable fix.
Consult the Linux distribution's advisory or changelog to resolve the bundle's ambiguous version information.
Prioritize multi-tenant systems and hosts permitting untrusted local workloads.
Do not treat workload restrictions as a substitute for installing the vendor-confirmed fix.
Validation and detection
Inventory running kernel releases and package builds across Linux systems.
Check vendor advisories or package changelogs for CVE-2026-23394 and the listed stable commits.
After updating and rebooting, confirm the running kernel is the remediated build.
Regression-test legitimate AF_UNIX descriptor-passing and MSG_PEEK workloads after updating.
Generated from the cited source records. This long-tail analysis has not been individually reviewed by a named human.
Potential ATT&CK relevance
Conservative CVE-to-ATT&CK context
These mappings and lookup hints may be relevant to the vulnerability behavior, CWE, affected product, or exposure path. Glexia-inferred context is not an official MITRE, ATT&CK, CWE, or CVE Program mapping.
ATT&CK lookup starting points
Use these exact CWE pages and searches to review the Glexia ATT&CK library from this CVE's weakness and description context.
cve · low confidence lookup
CVE-2026-23394 mapping review
Open the CVE-to-ATT&CK bridge for reviewed, inferred, or future official mappings tied to this CVE.
These fields come from the CVE record and ADP containers, not from Glexia's Take. They preserve time-varying source decisions such as CISA SSVC, KEV status, CVSS metrics, and provider references.
0CVSS vectors
3Timeline events
0ADP providers
7Source links
Vulnerability timeline
Timeline events are normalized from CVE metadata, CNA source timelines, ADP timelines, and KEV metadata when present.
CVE reservedCVE Program
The CVE ID was reserved by the assigning CNA.
CVE publishedCVE Program
The CVE record was published.
Mar 25, 2026, 10:33 UTC (UTC+00:00)
CVE updatedCVE Program
The CVE record metadata indicates this as the latest update time.