CVE-2025-39995
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
15/10/2025
Last modified:
16/10/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
media: i2c: tc358743: Fix use-after-free bugs caused by orphan timer in probe<br />
<br />
The state->timer is a cyclic timer that schedules work_i2c_poll and<br />
delayed_work_enable_hotplug, while rearming itself. Using timer_delete()<br />
fails to guarantee the timer isn&#39;t still running when destroyed, similarly<br />
cancel_delayed_work() cannot ensure delayed_work_enable_hotplug has<br />
terminated if already executing. During probe failure after timer<br />
initialization, these may continue running as orphans and reference the<br />
already-freed tc358743_state object through tc358743_irq_poll_timer.<br />
<br />
The following is the trace captured by KASAN.<br />
<br />
BUG: KASAN: slab-use-after-free in __run_timer_base.part.0+0x7d7/0x8c0<br />
Write of size 8 at addr ffff88800ded83c8 by task swapper/1/0<br />
...<br />
Call Trace:<br />
<br />
dump_stack_lvl+0x55/0x70<br />
print_report+0xcf/0x610<br />
? __pfx_sched_balance_find_src_group+0x10/0x10<br />
? __run_timer_base.part.0+0x7d7/0x8c0<br />
kasan_report+0xb8/0xf0<br />
? __run_timer_base.part.0+0x7d7/0x8c0<br />
__run_timer_base.part.0+0x7d7/0x8c0<br />
? rcu_sched_clock_irq+0xb06/0x27d0<br />
? __pfx___run_timer_base.part.0+0x10/0x10<br />
? try_to_wake_up+0xb15/0x1960<br />
? tmigr_update_events+0x280/0x740<br />
? _raw_spin_lock_irq+0x80/0xe0<br />
? __pfx__raw_spin_lock_irq+0x10/0x10<br />
tmigr_handle_remote_up+0x603/0x7e0<br />
? __pfx_tmigr_handle_remote_up+0x10/0x10<br />
? sched_balance_trigger+0x98/0x9f0<br />
? sched_tick+0x221/0x5a0<br />
? _raw_spin_lock_irq+0x80/0xe0<br />
? __pfx__raw_spin_lock_irq+0x10/0x10<br />
? tick_nohz_handler+0x339/0x440<br />
? __pfx_tmigr_handle_remote_up+0x10/0x10<br />
__walk_groups.isra.0+0x42/0x150<br />
tmigr_handle_remote+0x1f4/0x2e0<br />
? __pfx_tmigr_handle_remote+0x10/0x10<br />
? ktime_get+0x60/0x140<br />
? lapic_next_event+0x11/0x20<br />
? clockevents_program_event+0x1d4/0x2a0<br />
? hrtimer_interrupt+0x322/0x780<br />
handle_softirqs+0x16a/0x550<br />
irq_exit_rcu+0xaf/0xe0<br />
sysvec_apic_timer_interrupt+0x70/0x80<br />
<br />
...<br />
<br />
Allocated by task 141:<br />
kasan_save_stack+0x24/0x50<br />
kasan_save_track+0x14/0x30<br />
__kasan_kmalloc+0x7f/0x90<br />
__kmalloc_node_track_caller_noprof+0x198/0x430<br />
devm_kmalloc+0x7b/0x1e0<br />
tc358743_probe+0xb7/0x610 i2c_device_probe+0x51d/0x880<br />
really_probe+0x1ca/0x5c0<br />
__driver_probe_device+0x248/0x310<br />
driver_probe_device+0x44/0x120<br />
__device_attach_driver+0x174/0x220<br />
bus_for_each_drv+0x100/0x190<br />
__device_attach+0x206/0x370<br />
bus_probe_device+0x123/0x170<br />
device_add+0xd25/0x1470<br />
i2c_new_client_device+0x7a0/0xcd0<br />
do_one_initcall+0x89/0x300<br />
do_init_module+0x29d/0x7f0<br />
load_module+0x4f48/0x69e0<br />
init_module_from_file+0xe4/0x150<br />
idempotent_init_module+0x320/0x670<br />
__x64_sys_finit_module+0xbd/0x120<br />
do_syscall_64+0xac/0x280<br />
entry_SYSCALL_64_after_hwframe+0x77/0x7f<br />
<br />
Freed by task 141:<br />
kasan_save_stack+0x24/0x50<br />
kasan_save_track+0x14/0x30<br />
kasan_save_free_info+0x3a/0x60<br />
__kasan_slab_free+0x3f/0x50<br />
kfree+0x137/0x370<br />
release_nodes+0xa4/0x100<br />
devres_release_group+0x1b2/0x380<br />
i2c_device_probe+0x694/0x880<br />
really_probe+0x1ca/0x5c0<br />
__driver_probe_device+0x248/0x310<br />
driver_probe_device+0x44/0x120<br />
__device_attach_driver+0x174/0x220<br />
bus_for_each_drv+0x100/0x190<br />
__device_attach+0x206/0x370<br />
bus_probe_device+0x123/0x170<br />
device_add+0xd25/0x1470<br />
i2c_new_client_device+0x7a0/0xcd0<br />
do_one_initcall+0x89/0x300<br />
do_init_module+0x29d/0x7f0<br />
load_module+0x4f48/0x69e0<br />
init_module_from_file+0xe4/0x150<br />
idempotent_init_module+0x320/0x670<br />
__x64_sys_finit_module+0xbd/0x120<br />
do_syscall_64+0xac/0x280<br />
entry_SYSCALL_64_after_hwframe+0x77/0x7f<br />
...<br />
<br />
Replace timer_delete() with timer_delete_sync() and cancel_delayed_work()<br />
with cancel_delayed_work_sync() to ensure proper termination of timer and<br />
work items before resource cleanup.<br />
<br />
This bug was initially identified through static analysis. For reproduction<br />
and testing, I created a functional emulation of the tc358743 device via a<br />
kernel module and introduced faults through the debugfs interface.
Impact
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/228d06c4cbfc750f1216a3fd91b4693b0766d2f6
- https://git.kernel.org/stable/c/2610617effb4454d2f1c434c011ccb5cc7140711
- https://git.kernel.org/stable/c/3d17701c156579969470e58b3a906511f8bc018d
- https://git.kernel.org/stable/c/79d10f4f21a92e459b2276a77be62c59c1502c9d
- https://git.kernel.org/stable/c/f3f3f00bcabbd2ce0a77a2ac7a6797b8646bfd8b
- https://git.kernel.org/stable/c/f92181c0e13cad9671d07b15be695a97fc2534a3