{"id":41166,"date":"2026-10-19T00:32:26","date_gmt":"2026-10-18T16:32:26","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98694"},"modified":"2026-10-19T00:32:26","modified_gmt":"2026-10-18T16:32:26","slug":"cve-2026-98694","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98694","title":{"rendered":"CVE-2026-98694 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nthunderbolt: Fix KASA"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>thunderbolt: Fix KASAN reported use-after-free when request is canceled<\/p>\n<p>Alan reported that when doing stress testing sometimes KASAN notices<br \/>\nuse-after-free during control channel operation (stripped down keeping<br \/>\nthe relevant parts):<\/p>\n<p> BUG: KASAN: slab-use-after-free in tb_cfg_request_sync+0x240\/0x250 [thunderbolt]<br \/>\n Read of size 24 at addr ffff88811067f290 by task kworker\/u40:2\/1760<\/p>\n<p>  tb_cfg_request_sync+0x240\/0x250 [thunderbolt]<br \/>\n  tb_cfg_read_raw+0x367\/0x510 [thunderbolt]<br \/>\n  tb_cfg_read+0xec\/0x240 [thunderbolt]<br \/>\n  tb_port_get_link_generation+0x258\/0x420 [thunderbolt]<br \/>\n  tb_usb3_consumed_bandwidth+0x1c1\/0x2c0 [thunderbolt]<br \/>\n  tb_tunnel_consumed_bandwidth+0xfd\/0x910 [thunderbolt]<br \/>\n  tb_available_bandwidth+0x5f2\/0xeb0 [thunderbolt]<br \/>\n  tb_recalc_estimated_bandwidth+0x2a0\/0x1bc0 [thunderbolt]<br \/>\n  tb_handle_dp_bandwidth_request+0x1897\/0x5e20 [thunderbolt]<br \/>\n  process_one_work+0x675\/0x1230<br \/>\n  worker_thread+0x5e6\/0xf70<br \/>\n  kthread+0x365\/0x470<br \/>\n  ret_from_fork+0x54d\/0x710<br \/>\n  ret_from_fork_asm+0x1a\/0x30<\/p>\n<p> Allocated by task 1760:<br \/>\n  __kmalloc_cache_noprof+0x1ee\/0x550<br \/>\n  tb_cfg_read_raw+0x1d3\/0x510 [thunderbolt]<br \/>\n  tb_cfg_read+0xec\/0x240 [thunderbolt]<br \/>\n  tb_port_get_link_generation+0x258\/0x420 [thunderbolt]<br \/>\n  tb_usb3_consumed_bandwidth+0x1c1\/0x2c0 [thunderbolt]<br \/>\n  tb_tunnel_consumed_bandwidth+0xfd\/0x910 [thunderbolt]<br \/>\n  tb_available_bandwidth+0x5f2\/0xeb0 [thunderbolt]<br \/>\n  tb_recalc_estimated_bandwidth+0x2a0\/0x1bc0 [thunderbolt]<br \/>\n  tb_handle_dp_bandwidth_request+0x1897\/0x5e20 [thunderbolt]<br \/>\n  process_one_work+0x675\/0x1230<br \/>\n  worker_thread+0x5e6\/0xf70<br \/>\n  kthread+0x365\/0x470<br \/>\n  ret_from_fork+0x54d\/0x710<br \/>\n  ret_from_fork_asm+0x1a\/0x30<\/p>\n<p> Freed by task 926:<br \/>\n  kfree+0x18f\/0x4a0<br \/>\n  tb_cfg_request_put+0xb7\/0xe0 [thunderbolt]<br \/>\n  tb_cfg_request_work+0x82\/0x120 [thunderbolt]<br \/>\n  process_one_work+0x675\/0x1230<br \/>\n  worker_thread+0x5e6\/0xf70<br \/>\n  kthread+0x365\/0x470<br \/>\n  ret_from_fork+0x54d\/0x710<br \/>\n  ret_from_fork_asm+0x1a\/0x30<\/p>\n<p> Second to last potentially related work creation:<br \/>\n  __queue_work+0x575\/0xd00<br \/>\n  queue_work_on+0x77\/0x80<br \/>\n  tb_cfg_request_cancel+0xc7\/0x260 [thunderbolt]<br \/>\n  tb_cfg_request_sync+0x1f6\/0x250 [thunderbolt]<br \/>\n  tb_cfg_read_raw+0x367\/0x510 [thunderbolt]<br \/>\n  tb_cfg_read+0xec\/0x240 [thunderbolt]<br \/>\n  tb_port_get_link_generation+0x258\/0x420 [thunderbolt]<br \/>\n  tb_usb3_consumed_bandwidth+0x1c1\/0x2c0 [thunderbolt]<br \/>\n  tb_tunnel_consumed_bandwidth+0xfd\/0x910 [thunderbolt]<br \/>\n  tb_available_bandwidth+0x5f2\/0xeb0 [thunderbolt]<br \/>\n  tb_recalc_estimated_bandwidth+0x2a0\/0x1bc0 [thunderbolt]<br \/>\n  tb_handle_dp_bandwidth_request+0x1897\/0x5e20 [thunderbolt]<br \/>\n  process_one_work+0x675\/0x1230<br \/>\n  worker_thread+0x5e6\/0xf70<br \/>\n  kthread+0x365\/0x470<br \/>\n  ret_from_fork+0x54d\/0x710<br \/>\n  ret_from_fork_asm+0x1a\/0x30<\/p>\n<p>The last stack trace is helpful because it shows that we are cancelling<br \/>\na request and looking at tb_cfg_request_cancel() what might happen is<br \/>\nthat tb_cfg_request_work() completes right before tb_cfg_request_cancel()<br \/>\nstarts and because of this it will call schedule_work() queueing the<br \/>\nsame work to run again. However, it is already removed from the<br \/>\nrequest_queue and reference count is dropped so when<br \/>\ntb_cfg_request_work() triggers again it will access memory that is<br \/>\nalready released.<\/p>\n<p>Fix this so that we first make sure a cancelled request is not handed<br \/>\naway from tb_cfg_request_find() or scheduled to run. Then instead of<br \/>\nrelying on the worker to clean up the request we will do it in<br \/>\ntb_cfg_request_cancel() after the work is canceled from running. Make<br \/>\ntb_cfg_request_dequeue() release the request only if it was actually<br \/>\nremoved from the queue.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>thunderbolt: Fix KASAN reported use-after-free when request is canceled<\/p>\n<p>Alan reported that when doing stress testing sometimes KAS<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41166","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}