CVE-2026-74609

Source
https://cve.org/CVERecord?id=CVE-2026-74609
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-74609.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2026-74609
Downstream
Published
2026-08-22T15:31:56.054Z
Modified
2026-08-24T11:47:08.978296006Z
Summary
tipc: read le->link under the node lock in tipc_node_link_down()
Details

In the Linux kernel, the following vulnerability has been resolved:

tipc: read le->link under the node lock in tipcnodelink_down()

tipcnodelink_down() caches the link pointer before taking n->lock:

struct tipc_link *l = le->link;     /* unlocked */

if (!l)
    return;
tipc_node_write_lock(n);
if (!tipc_link_is_establishing(l)) {    /* deref l */
...
    tipc_link_reset(l);     /* write into l */
if (delete) {
    kfree(l);
    le->link = NULL;

The delete=true caller frees that very object under n->lock, so the lock does not protect the cached pointer against it:

  • CPU A, delete=false: tipcrcv() on TIPCLINKDOWNEVT, or the link supervision timer via tipcnodetimeout(), reads l unlocked and then dereferences it under n->lock;
  • CPU B, delete=true: netlink TIPCNLBEARERDISABLE -> bearerdisable() -> tipcnodedeletelinks() -> tipcnodelinkdown(n, bearer_id, true) -> kfree(l).

The link is freed with plain kfree(), not kfreercu(), and for UDP bearers disablemedia() only schedules the asynchronous cleanupbearer() work, so its synchronizenet() runs after the links are already gone. An in-flight CPU A that has read l therefore dereferences freed memory once B frees it: a use-after-free read in tipclinkisestablishing(), and a use-after-free write via tipclink_reset() on the establishing branch.

The following trace was captured on 7.2.0-rc5-00284-gaf39eb111ce6:

BUG: KASAN: slab-use-after-free in tipclinkisestablishing (net/tipc/link.c:285) Read of size 4 at addr ffff88802e2aa068 by task swapper/2/0 tipclinkisestablishing (net/tipc/link.c:285) tipcnodelinkdown (net/tipc/node.c:1076) tipcnodetimeout (net/tipc/node.c:843) Allocated by task 9549: tipclinkcreate (net/tipc/link.c:490) tipcnodecheckdest (net/tipc/node.c:1279) tipcdiscrcv (net/tipc/discover.c:252) tipcudprecv (net/tipc/udpmedia.c:389) Freed by task 9549: tipcnodelinkdown (net/tipc/node.c:1084) tipcnodedeletelinks (net/tipc/node.c:1320) bearerdisable (net/tipc/bearer.c:414) _tipcnlbearerdisable (net/tipc/bearer.c:992)

Move the le->link read inside tipcnodewrite_lock(), so it is serialised against the kfree() in the delete path. A racing teardown now either has not run yet, and we see a valid link, or has already run, and we see NULL.

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/74xxx/CVE-2026-74609.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
73f646cec35477b5099d7e952297cb9e1855be45
Fixed
2be741ad565c610871a6a95062c12c39da7168fd
Fixed
69d209461c110388710e483a130caf051e4fd09a
Fixed
de017c22135f545ca4e65d1eada22887b64958eb
Fixed
47ba70891b10b2feb52462086b7fcd2ad75d3ce3
Fixed
a714d62513befef37f71f4ae89bb1fe173b65f2e
Fixed
c3f2347a47754eac690967cfd82cb6d559817b07
Fixed
5558a8312452ddb21eff22b1cbd84302ad951944
Fixed
cba9ccb47e9fa4cc77692fb896cc5ab57a667882

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-74609.json"

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
4.4.0
Fixed
5.10.265
Type
ECOSYSTEM
Events
Introduced
5.11.0
Fixed
5.15.216
Type
ECOSYSTEM
Events
Introduced
5.16.0
Fixed
6.1.183
Type
ECOSYSTEM
Events
Introduced
6.2.0
Fixed
6.6.152
Type
ECOSYSTEM
Events
Introduced
6.7.0
Fixed
6.12.104
Type
ECOSYSTEM
Events
Introduced
6.13.0
Fixed
6.18.45
Type
ECOSYSTEM
Events
Introduced
6.19.0
Fixed
7.1.9

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-74609.json"