CVE-2026-74609

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

State
Published
Severity
7.8 High
Published
Aug 22, 2026
Updated
Oct 16, 2026
Reserved
Aug 15, 2026

Read the record on cve.org

Description

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

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

tipc_node_link_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: tipc_rcv() on TIPC_LINK_DOWN_EVT, or the link supervision timer via tipc_node_timeout(), reads l unlocked and then dereferences it under n->lock; - CPU B, delete=true: netlink TIPC_NL_BEARER_DISABLE -> bearer_disable() -> tipc_node_delete_links() -> tipc_node_link_down(n, bearer_id, true) -> kfree(l).

The link is freed with plain kfree(), not kfree_rcu(), and for UDP bearers disable_media() only schedules the asynchronous cleanup_bearer() work, so its synchronize_net() 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 tipc_link_is_establishing(), and a use-after-free write via tipc_link_reset() on the establishing branch.

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

BUG: KASAN: slab-use-after-free in tipc_link_is_establishing (net/tipc/link.c:285) Read of size 4 at addr ffff88802e2aa068 by task swapper/2/0 tipc_link_is_establishing (net/tipc/link.c:285) tipc_node_link_down (net/tipc/node.c:1076) tipc_node_timeout (net/tipc/node.c:843) Allocated by task 9549: tipc_link_create (net/tipc/link.c:490) tipc_node_check_dest (net/tipc/node.c:1279) tipc_disc_rcv (net/tipc/discover.c:252) tipc_udp_recv (net/tipc/udp_media.c:389) Freed by task 9549: tipc_node_link_down (net/tipc/node.c:1084) tipc_node_delete_links (net/tipc/node.c:1320) bearer_disable (net/tipc/bearer.c:414) __tipc_nl_bearer_disable (net/tipc/bearer.c:992)

Move the le->link read inside tipc_node_write_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.

Scores

CVSSScoreVectorSource
3.17.8 HighCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HLinux

Weaknesses

The record names no weakness.

Affected Products

ProductVersions
LinuxLinux
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before 2be741ad565c610871a6a95062c12c39da7168fdAffected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before 69d209461c110388710e483a130caf051e4fd09aAffected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before de017c22135f545ca4e65d1eada22887b64958ebAffected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before 47ba70891b10b2feb52462086b7fcd2ad75d3ce3Affected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before a714d62513befef37f71f4ae89bb1fe173b65f2eAffected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before c3f2347a47754eac690967cfd82cb6d559817b07Affected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before 5558a8312452ddb21eff22b1cbd84302ad951944Affected
  • 73f646cec35477b5099d7e952297cb9e1855be45 to before cba9ccb47e9fa4cc77692fb896cc5ab57a667882Affected
LinuxLinux
  • 4.4Affected
  • before 4.4Not affected
  • 5.10.265 through 5.10.*Not affected
  • 5.15.216 through 5.15.*Not affected
  • 6.1.183 through 6.1.*Not affected
  • 6.6.152 through 6.6.*Not affected
  • 6.12.104 through 6.12.*Not affected
  • 6.18.45 through 6.18.*Not affected
  • 7.1.9 through 7.1.*Not affected
  • 7.2 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.