linux/net/x25
Baul Lee 2195424c3d net/x25: fix use-after-free of the socket by its timers
The x25 timers are armed with mod_timer() and cancelled with
timer_delete(), so a pending timer holds no reference on the socket and a
cancel does not wait for a callback already running on another CPU.

x25_heartbeat_expiry() also rearms unconditionally, so it can reinstall
sk->sk_timer after __x25_destroy_socket() has passed its cancel point.
The following __sock_put() frees the socket while the timer is still
queued, and the next expiry uses freed memory.  KASAN reports a
slab-use-after-free on the kmalloc-2k object freed by close().

timer_delete_sync() cannot be used here: x25_heartbeat_expiry() and
x25_timer_expiry() both reach the cancels from inside the timer they
would wait on, through __x25_destroy_socket() and x25_disconnect().

Arm the timers with sk_reset_timer() and cancel them with sk_stop_timer()
so that an armed timer owns a reference, and release it in both expiry
handlers.  Rearm the heartbeat only while sk_hashed(sk) is still true,
since __x25_destroy_socket() unlinks the socket before dropping it.  Arm
the deferred destroy timer the same way and drop its reference in
x25_destroy_timer().

Reproduced on net with KASAN, with the heartbeat period shortened so the
window recurs.  With this patch the reproducer no longer triggers a
report and /proc/net/x25 drains.

Discovered by XBOW, triaged by Baul Lee <baul.lee@xbow.com>

Fixes: 1da177e4c3 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Baul Lee <baul.lee@xbow.com>
Link: https://patch.msgid.link/20260726220342.47245-1-baul.lee@xbow.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-07-30 18:46:45 -07:00
..
af_x25.c net/x25: fix use-after-free of the socket by its timers 2026-07-30 18:46:45 -07:00
Kconfig net: x25: remove dead links from Kconfig 2024-03-07 20:24:35 -08:00
Makefile
sysctl_net_x25.c ax.25: x.25: Remove the now superfluous sentinel elements from ctl_table array 2024-05-03 13:29:43 +01:00
x25_dev.c net/x25: Remove unused x25_terminate_link() 2025-07-14 17:19:13 -07:00
x25_facilities.c net: remove SOCK_DEBUG leftovers 2023-12-26 20:31:01 +00:00
x25_forward.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
x25_in.c net/x25: Fix overflow when accumulating packets 2026-04-02 13:36:08 +02:00
x25_link.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
x25_out.c net: remove SOCK_DEBUG leftovers 2023-12-26 20:31:01 +00:00
x25_proc.c treewide: change inode->i_ino from unsigned long to u64 2026-03-06 14:31:28 +01:00
x25_route.c treewide: Replace kmalloc with kmalloc_obj for non-scalar types 2026-02-21 01:02:28 -08:00
x25_subr.c net/x25: Fix overflow when accumulating packets 2026-04-02 13:36:08 +02:00
x25_timer.c net/x25: fix use-after-free of the socket by its timers 2026-07-30 18:46:45 -07:00