In the Linux kernel, the following vulnerability has been resolved:
af_unix: Initialise scc_index in unix_add_edge().
Quang Le reported that the AF_UNIX GC could garbage-collect a receive queue of an alive in-flight socket, with a nice repro.
The repro consists of three stages.
1) 1-a. Create a single cyclic reference with many sockets 1-b. close() all sockets 1-c. Trigger GC
2) 2-a. Pass sk-A to an embryo sk-B 2-b. Pass sk-X to sk-X 2-c. Trigger GC
3) 3-a. accept() the embryo sk-B 3-b. Pass sk-B to sk-C 3-c. close() the in-flight sk-A 3-d. Trigger GC
As of 2-c, sk-A and sk-X are linked to unix_unvisited_vertices, and unix_walk_scc() groups them into two different SCCs:
unix_sk(sk-A)->vertex->scc_index = 2 (UNIX_VERTEX_INDEX_START) unix_sk(sk-X)->vertex->scc_index = 3
Once GC completes, unix_graph_grouped is set to true. Also, unix_graph_maybe_cyclic is set to true due to sk-X's cyclic self-reference, which makes close() trigger GC.
At 3-b, unix_add_edge() allocates unix_sk(sk-B)->vertex and links it to unix_unvisited_vertices.
unix_update_graph() is called at 3-a. and 3-b., but neither unix_graph_grouped nor unix_graph_maybe_cyclic is changed because both sk-B's listener and sk-C are not in-flight.
3-c decrements sk-A's file refcnt to 1.
Since unix_graph_grouped is true at 3-d, unix_walk_scc_fast() is finally called and iterates 3 sockets sk-A, sk-B, and sk-X:
sk-A -> sk-B (-> sk-C) sk-X -> sk-X
This is totally fine. All of them are not yet close()d and should be grouped into different SCCs.
However, unix_vertex_dead() misjudges that sk-A and sk-B are in the same SCC and sk-A is dead.
unix_sk(sk-A)->scc_index == unix_sk(sk-B)->scc_index <-- Wrong! && sk-A's file refcnt == unix_sk(sk-A)->vertex->out_degree ^-- 1 in-flight count for sk-B -> sk-A is dead !?
The problem is that unix_add_edge() does not initialise scc_index.
Stage 1) is used for heap spraying, making a newly allocated vertex have vertex->scc_index == 2 (UNIX_VERTEX_INDEX_START) set by unix_walk_scc() at 1-c.
Let's track the max SCC index from the previous unix_walk_scc() call and assign the max + 1 to a new vertex's scc_index.
This way, we can continue to avoid Tarjan's algorithm while preventing misjudgments.
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Amazon_linux_2023 | — | Upgrade kernel6.12-libbpf-debuginfoUpgrade bpftool6.12Upgrade bpftool6.12-debuginfoUpgrade kernel-libbpfUpgrade kernel-livepatch-6.1.159-181.297Upgrade kernel6.12-debuginfo-common-aarch64Upgrade kernel6.12-debuginfo-common-x86_64Upgrade kernel6.12-libbpf-staticUpgrade kernel6.12Upgrade python3-perf6.12Upgrade kernel-libbpf-debuginfoUpgrade kernel6.12-develUpgrade kernel6.12-modules-extraUpgrade perf-debuginfoUpgrade python3-perfUpgrade perfUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-tools-develUpgrade kernel-toolsUpgrade perf6.12-debuginfoUpgrade kernel-develUpgrade kernel6.12-libbpfUpgrade kernel6.12-libbpf-develUpgrade kernel6.12-modules-extra-commonUpgrade kernel-libbpf-staticUpgrade kernel6.12-tools-develUpgrade kernel-modules-extraUpgrade kernel6.12-debuginfoUpgrade kernel-tools-debuginfoUpgrade kernel-livepatch-6.12.63-84.121Upgrade kernel-debuginfo-common-x86_64Upgrade perf6.12Upgrade kernel6.12-toolsUpgrade kernel-libbpf-develUpgrade kernel-debuginfoUpgrade bpftoolUpgrade kernelUpgrade kernel6.12-tools-debuginfoUpgrade kernel6.12-headersUpgrade python3-perf-debuginfoUpgrade bpftool-debuginfoUpgrade python3-perf6.12-debuginfoUpgrade kernel-modules-extra-commonUpgrade kernel-headers | Jan 12, 2026 | Dec 4, 2025 |
| Debian | — | Upgrade linux-6.1Upgrade linux | Jan 12, 2026 | Jan 12, 2026 |
| Oracle_linux | — | Upgrade kernel-uek | Jan 15, 2026 | Dec 4, 2025 |
| Redhat_linux | — | No solution exists | Jul 17, 2026 | Dec 4, 2025 |
| Ubuntu | — | Upgrade linux-image-raspiUpgrade linux-image-raspi-6.17Upgrade linux-image-genericUpgrade linux-image-gcpUpgrade linux-image-generic-64k-6.17Upgrade linux-image-gcp-64kUpgrade linux-image-aws-6.17Upgrade linux-image-virtual-6.17Upgrade linux-image-6.17.0-1006-gcp-64kUpgrade linux-image-6.17.0-1005-realtimeUpgrade linux-image-realtime-6.17Upgrade linux-image-6.17.0-1006-oracle-64kUpgrade linux-image-6.17.0-1006-awsUpgrade linux-image-aws-64k-6.17Upgrade linux-image-aws-64kUpgrade linux-image-6.17.0-1006-gcpUpgrade linux-image-oracle-64kUpgrade linux-image-generic-64kUpgrade linux-image-6.17.0-1007-raspiUpgrade linux-image-azureUpgrade linux-image-azure-6.17Upgrade linux-image-oem-24.04dUpgrade linux-image-6.17.0-1006-oracleUpgrade linux-image-6.17.0-12-genericUpgrade linux-image-oem-6.17Upgrade linux-image-generic-6.17Upgrade linux-image-virtualUpgrade linux-image-6.17.0-1010-oemUpgrade linux-image-6.17.0-12-generic-64kUpgrade linux-image-6.17.0-1006-aws-64kUpgrade linux-image-oracle-64k-6.17Upgrade linux-image-gcp-64k-6.17Upgrade linux-image-6.17.0-1007-azureUpgrade linux-image-oracle-6.17Upgrade linux-image-realtimeUpgrade linux-image-gcp-6.17Upgrade linux-image-awsUpgrade linux-image-oracle | Feb 5, 2026 | Dec 4, 2025 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Feb 9, 2026 | Dec 4, 2025 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub