{"id":15963,"date":"2026-09-04T19:04:37","date_gmt":"2026-09-04T11:04:37","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-46275"},"modified":"2026-09-04T19:04:37","modified_gmt":"2026-09-04T11:04:37","slug":"cve-2026-46275","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-46275","title":{"rendered":"CVE-2026-46275 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nBluetooth: hci_uart:"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>Bluetooth: hci_uart: fix UAFs and race conditions in close and init paths<\/p>\n<p>Vulnerabilities leading to Use-After-Free (UAF) and Null Pointer<br \/>\nDereference (NPD) conditions were observed in the lifecycle management<br \/>\nof hci_uart.<\/p>\n<p>The primary issue arises because the workqueues (init_ready and<br \/>\nwrite_work) are only flushed\/cancelled if the HCI_UART_PROTO_READY<br \/>\nflag is set during TTY close. If a hangup occurs before setup completes,<br \/>\nhci_uart_tty_close() skips the teardown of these workqueues and<br \/>\nproceeds to free the `hu` struct. When the scheduled work executes<br \/>\nlater, it blindly dereferences the freed `hu` struct.<\/p>\n<p>Furthermore, several data races and UAFs were identified in the teardown<br \/>\nsequence:<br \/>\n1. Calling hci_uart_flush() from hci_uart_close() without effectively<br \/>\n   disabling write_work causes a race condition where both can concurrently<br \/>\n   double-free hu-&gt;tx_skb. This happens because protocol timers can<br \/>\n   concurrently invoke hci_uart_tx_wakeup() and requeue write_work.<br \/>\n2. Calling hci_free_dev(hdev) before hu-&gt;proto-&gt;close(hu) causes a UAF<br \/>\n   when vendor specific protocol close callbacks dereference hu-&gt;hdev.<br \/>\n3. In the initialization error paths, failing to take the proto_lock<br \/>\n   write lock before clearing PROTO_READY leads to races with active<br \/>\n   readers. Additionally, hci_uart_tty_receive() accesses hu-&gt;hdev<br \/>\n   outside the read lock, leading to UAFs if the initialization error<br \/>\n   path frees hdev concurrently.<\/p>\n<p>Fix these synchronization and lifecycle issues by:<br \/>\n1. Re-ordering hci_uart_tty_close() to clear HCI_UART_PROTO_READY first,<br \/>\n   followed immediately by a cancel_work_sync(&amp;hu-&gt;write_work). Clearing<br \/>\n   the flag locks out concurrent protocol timers from successfully invoking<br \/>\n   hci_uart_tx_wakeup(), effectively rendering the cancellation permanent<br \/>\n   and preventing the tx_skb double-free.<br \/>\n2. Note: Clearing PROTO_READY early causes hci_uart_close() to skip<br \/>\n   hu-&gt;proto-&gt;flush(). This is perfectly safe in the tty_close path<br \/>\n   because hu-&gt;proto-&gt;close() executes shortly after, which intrinsically<br \/>\n   purges all protocol SKB queues and tears down the state.<br \/>\n3. Relocating hu-&gt;proto-&gt;close(hu) strictly prior to hci_free_dev(hdev)<br \/>\n   across all close and error paths to prevent vendor-level UAFs.<br \/>\n4. Moving the hdev-&gt;stat.byte_rx increment in hci_uart_tty_receive()<br \/>\n   inside the proto_lock read-side critical section to safely synchronize<br \/>\n   with device unregistration.<br \/>\n5. Adding cancel_work_sync(&amp;hu-&gt;write_work) to hci_uart_close() to safely<br \/>\n   flush the workqueue before hci_uart_flush() is invoked via the HCI core.<br \/>\n6. Utilizing cancel_work_sync() instead of disable_work_sync() across<br \/>\n   all paths to prevent permanently breaking user-space retry capabilities.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>Bluetooth: hci_uart: fix UAFs and race conditions in close and init paths<\/p>\n<p>Vulnerabilities leading to Use-After-Free (UAF) and Null<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-15963","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/15963","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=15963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}