CVE-2026-46275: Bluetooth hci_uart teardown races cause kernel UAF

Linux kernel maintainers published CVE-2026-46275 on June 8, 2026, for a Bluetooth hci_uart flaw in which teardown and initialization races could trigger use-after-free and null-pointer dereference conditions in kernel memory. The bug is not a Windows vulnerability, but it matters to WindowsForum readers because it lands in the shared operating-system terrain where Bluetooth, serial transports, embedded controllers, and kernel lifecycle rules routinely decide whether a device is merely flaky or genuinely exploitable. The practical story is less “Bluetooth is broken” than “driver teardown is still one of the hardest places to write safe kernel code.” CVE-2026-46275 is a small, surgical fix with a large lesson: asynchronous work does not stop just because a device object looks logically closed.

Diagram showing a Bluetooth module interface and a kernel driver lifecycle with async teardown race-condition protections.A Bluetooth Bug That Is Really About Time​

The affected code sits in the Linux kernel’s Bluetooth HCI UART layer, the plumbing used when Bluetooth controllers communicate over UART-style serial links rather than appearing as a simple USB dongle. That makes the flaw more relevant to laptops, development boards, embedded systems, industrial devices, and custom hardware than to the average desktop with a commodity USB Bluetooth adapter.
The vulnerability description points to use-after-free and null-pointer dereference conditions during the lifetime of hci_uart, particularly when close, hangup, setup, and error paths collide. In plain English, the kernel could free the structure representing the UART-backed Bluetooth device while delayed work still held enough context to come back later and touch it. That is the classic shape of a use-after-free: the object is gone, but the pointer remembers where it used to live.
The interesting part is not that Linux had a bug in a driver subsystem. Every general-purpose operating system has driver bugs. The interesting part is how familiar the pattern is: a device is initialized in pieces, work is scheduled asynchronously, state flags are used as informal traffic lights, and teardown assumes those lights still describe the road accurately. Then a hangup or failed init path arrives at the wrong moment, and the neat lifecycle diagram turns into a race.
For defenders, that distinction matters. A crashable Bluetooth stack is operationally annoying. A use-after-free in kernel space is categorically more serious because it touches memory safety in privileged code. Even without a public exploit or an NVD severity score at publication time, the class of bug deserves attention from anyone responsible for Linux endpoints, appliances, or embedded devices with UART-attached Bluetooth hardware.

The Flag Was Treated Like a Lock Until It Wasn’t​

The core failure described in the CVE is deceptively simple. The hci_uart close path only flushed or cancelled certain workqueues when the HCI_UART_PROTO_READY flag was set. If a TTY hangup occurred before setup completed, the close routine could skip that cleanup and free the hu structure while work such as init_ready or write_work remained scheduled.
That is a dangerous bargain. A readiness flag tells the code whether a protocol finished enough of its initialization to be considered active. It is not automatically proof that no asynchronous worker exists, no callback can fire, and no timer can requeue activity. The bug happened in the gap between logical readiness and actual scheduled execution.
This is why lifecycle bugs in kernel drivers are so persistent. Developers are often not fighting one obvious path but a matrix of almost-paths: normal probe, failed probe, partial setup, hangup, close, suspend, resume, removal, retry, and vendor-specific cleanup. The code that works perfectly when every step happens in order can fail when a user unplugs something, a line discipline changes, a controller misbehaves, or a setup callback returns late.
The fix described by kernel.org moves the close path toward a stricter ordering. It clears HCI_UART_PROTO_READY first, then immediately cancels write_work synchronously. That order is the important part. Clearing the flag prevents concurrent protocol timers from successfully waking the transmit path again, while cancel_work_sync() waits for any currently queued work to finish or be cancelled before the freed object can become a trap.
This is the kind of patch that looks boring until you have debugged one of these failures. It is not adding a mitigation banner or a new security boundary. It is teaching the kernel to stop pretending that “not ready” and “not scheduled” are the same state.

Use-After-Free Is a Symptom, Not the Whole Disease​

The CVE description lists several related defects, and they all point to one disease: ownership of the hci_uart and hci_dev state was not consistently serialized across the close and error paths. In one case, hci_uart_flush() could race with write_work, leading to a possible double-free of hu->tx_skb. In another, hci_free_dev(hdev) could run before the protocol-specific close callback, even though vendor close routines might still dereference hu->hdev.
That second point is particularly important because hardware support code often depends on vendor-specific close callbacks to clean up controller state. A generic core may believe the HCI device is finished, while a vendor backend still expects to inspect or touch it during shutdown. If the free happens before the close, the kernel has created a use-after-free opportunity inside a path that was supposed to be cleaning up safely.
The repair is conceptually straightforward: call hu->proto->close(hu) before freeing the HCI device, and do it consistently across close and error paths. But consistency is precisely what kernel lifecycle code tends to lose over time. A fast fix for one failure path becomes a special case; a vendor callback grows assumptions; another error path returns early; years later, the codebase contains two subtly different shutdown sequences for the same object graph.
The CVE also notes races around proto_lock and receive handling. In particular, hci_uart_tty_receive() was accessing hu->hdev outside the read-side critical section, which could become unsafe if an initialization error path freed the device concurrently. The fix moves the receive byte accounting into the locked region, a tiny change with an outsized correctness meaning: if the pointer’s lifetime is protected by a lock, the dereference belongs inside that protection.
Taken together, these fixes are less about one missing line and more about enforcing a rule. Work must be cancelled before the object it touches is freed. Vendor callbacks must run before the shared state they may inspect is destroyed. Readers must dereference lifetime-protected pointers while the lifetime protection is actually held. None of that is glamorous, but it is what keeps kernel subsystems from becoming timing-dependent roulette wheels.

The Security Score Is Missing, but the Risk Shape Is Visible​

At the time the record entered the NVD dataset, NVD had not provided CVSS 4.0, CVSS 3.x, or CVSS 2.0 scoring. That absence will frustrate scanners and dashboards that want a neat number to sort by. It should not prevent administrators from understanding the exposure.
The likely risk is not uniform across Linux systems. A server with no Bluetooth hardware, no UART-attached controller, and no relevant module loaded has a very different exposure profile from a fleet of embedded Linux gateways using serial-connected Bluetooth modules in the field. A developer board, IoT device, robot, medical peripheral, kiosk, or industrial controller may be much closer to the affected code path than a rack server.
The vulnerability description does not, by itself, establish remote exploitability. Bluetooth-adjacent bugs invite people to imagine drive-by attacks from across the room, but this flaw is in lifecycle management around TTY close, initialization, transmit work, and protocol callbacks. Exploitability would depend on whether an attacker can influence the timing, device state, hangup path, traffic, or controller behavior enough to hit the race in a useful way. That is a higher bar than simply being within radio range.
Still, security teams should resist the opposite mistake: treating all kernel UAFs without a CVSS score as harmless until proven otherwise. A local attacker, a malicious or compromised peripheral, a hostile test environment, or an exposed embedded management path can change the calculation. Kernel memory corruption is rarely good news, even when the first observed symptom is a crash.
The operationally honest posture is to treat CVE-2026-46275 as a kernel stability and hardening update with security implications. It may not be the kind of vulnerability that forces an emergency reboot across every Linux VM in a data center. It is very much the kind of bug that should disappear quickly from systems that actually use the affected Bluetooth transport.

The Patch Teaches the Same Lesson Windows Driver Developers Already Know​

WindowsForum readers live mostly in the Windows world, but this Linux CVE echoes problems Microsoft driver developers have battled for decades. Windows kernel drivers face the same fundamental hazards: pending work items, reference counts, plug-and-play removal, surprise removal, IRP cancellation, delayed callbacks, and device extensions that outlive or fail to outlive the code that expects them.
The operating systems differ, but the physics are similar. A driver schedules work because it cannot complete everything synchronously. Later, the device is removed, suspended, reset, or partially initialized. If teardown does not wait for the worker, or if the worker does not hold a valid reference, a stale pointer becomes a memory-corruption bug.
That is why the Linux fix is worth reading as a cross-platform parable rather than a Linux-only footnote. Modern hardware stacks are full of code that lives between clean abstractions: serial transports masquerading as Bluetooth controllers, vendor firmware protocols hidden below standard HCI layers, kernel workqueues, timers, line disciplines, and userspace retry behavior. Each layer has its own idea of when a device exists.
Windows has spent years pushing driver authors toward frameworks and verifier tooling precisely because teardown bugs are easy to write and hard to test. Linux, with its vast driver surface and enormous hardware reach, faces the same problem under different names. CVE-2026-46275 is another reminder that device cleanup paths are not boring housekeeping. They are security-critical control flow.
There is also a practical Windows angle for mixed environments. Many IT shops now manage Windows desktops, Linux servers, Linux-based appliances, WSL-adjacent workflows, Android-derived devices, and vendor black boxes under one asset umbrella. A vulnerability in Linux Bluetooth may not touch Windows 11 directly, but it can absolutely matter to the Bluetooth barcode scanners, conference-room controllers, building-access panels, lab instruments, or edge gateways sitting on the same network and procurement spreadsheet.

NVD’s Silence Leaves Patch Management to Do the Hard Thinking​

The NVD entry’s lack of an assessment at publication time is not unusual in the current vulnerability ecosystem, where CVE publication often outruns enrichment. But it creates a real workflow problem. Security tools that depend heavily on NVD scoring may initially show CVE-2026-46275 as an unscored item, a low-priority unknown, or an informational record despite the underlying memory-safety language.
That gap is where mature vulnerability management separates itself from compliance theater. The presence of “use-after-free,” “double-free,” “kernel,” and “race condition” should trigger a human review even before a score arrives. The affected subsystem and reachable hardware determine urgency, not the mere availability of a CVSS vector.
For Linux distributions, the key question is when the stable backport lands in the kernels they ship. The CVE record references multiple stable commits, which suggests the fix has been propagated across supported kernel branches rather than left only in a development tree. Administrators should watch their distribution advisories, package changelogs, and kernel update channels rather than attempting to apply upstream commits manually unless they already maintain custom kernels.
For appliance vendors, the question is less comfortable. Many embedded Linux products ship kernels that lag upstream by months or years, with out-of-tree Bluetooth and UART code layered on top. If the product uses a UART-connected Bluetooth controller, the vendor needs to verify whether its kernel includes the relevant fix or an equivalent backport. “Based on Linux” is not a patch status.
This is also where SBOMs and asset inventories either earn their keep or reveal themselves as paperwork. Knowing that a product contains Linux is not enough. Knowing the kernel branch, the Bluetooth transport, the controller attachment method, and the vendor’s update path is what turns a CVE from a news item into an actionable maintenance decision.

The Most Exposed Systems May Be the Least Visible​

The systems most likely to care about hci_uart are not necessarily the systems with the best patch discipline. A corporate Linux laptop may receive kernel updates quickly. A headless embedded controller bolted behind a display or mounted inside a piece of equipment may not.
That asymmetry is the old curse of embedded security. The more specialized the hardware, the more likely it is to rely on exactly the sort of low-level driver path implicated here, and the less likely it is to be maintained with the urgency of a mainstream OS. Bluetooth over UART is common in the embedded world because it is simple, cheap, and electrically convenient. Those are virtues for hardware designers and complications for security teams.
The vulnerability’s race-heavy nature also makes field diagnosis difficult. A use-after-free triggered during hangup or failed initialization may look like random Bluetooth instability, a kernel oops, an intermittent boot failure, or an unexplained device reset. Unless logs are collected and symbolized, the security-relevant pattern can be buried under what appears to be reliability noise.
That is one reason this patch should matter even if nobody publishes an exploit. Reliability bugs in privileged code are often security bugs wearing work clothes. If a device occasionally crashes under Bluetooth churn, repeated pairing attempts, suspend/resume cycles, or controller resets, the difference between “annoying” and “attackable” may be smaller than the support ticket suggests.
Administrators should also remember that attackers do not need every device to be vulnerable. They need the forgotten one: the kiosk, the lab controller, the smart locker, the medical cart, the gateway that nobody reboots because it is always in use. Bluetooth and serial subsystems are especially prone to disappearing from central IT’s mental model because they are experienced as peripherals, not as kernel attack surface.

The Fix Preserves Retry Behavior, and That Detail Matters​

One subtle point in the CVE description is the choice of cancel_work_sync() rather than disable_work_sync(). That may sound like implementation trivia, but it reveals a careful tradeoff. The goal was to drain scheduled work safely without permanently breaking user-space retry behavior.
That distinction matters because kernel fixes can easily overshoot. A defensive patch that prevents a race by disabling a work item forever might eliminate the UAF while leaving users unable to recover from failed initialization without a reboot or module reload. Security fixes that degrade normal recovery paths often return as regressions, and regressions pressure maintainers to revert or complicate the patch.
Here, the fix aims to preserve the ability of user space to try again while still making cancellation meaningful in the close path. Clearing the readiness flag first prevents new transmit wakeups from protocol timers, then synchronous cancellation drains the existing worker. It is a narrower correction than a blanket shutdown of the mechanism.
The CVE also notes that clearing PROTO_READY early causes hci_uart_close() to skip hu->proto->flush() in the TTY close path, and argues that this is safe because hu->proto->close() follows shortly after and purges the protocol queues. That is the kind of reasoning maintainers have to get exactly right. A security fix that changes call ordering must not quietly leak buffers, skip hardware cleanup, or leave a protocol half-alive.
This is why kernel security work often looks slower and more meticulous than outsiders expect. The patch is not merely “cancel work before free.” It must consider timers that can requeue work, flush routines that can race with workers, vendor close callbacks that depend on device pointers, initialization errors that run under different locks, and user-space behavior after failure. The vulnerability may be summarized in one CVE paragraph, but the fix lives in a web of invariants.

Enterprises Should Patch by Exposure, Not by Panic​

For enterprise IT, the first decision is scoping. If your Linux estate is almost entirely virtual servers with Bluetooth disabled or absent, CVE-2026-46275 belongs in the normal kernel patch cadence unless your distribution says otherwise. If your estate includes Linux endpoints, edge devices, development kits, embedded gateways, or appliances with Bluetooth controllers, it deserves faster triage.
The second decision is evidence gathering. Security teams should ask which systems load the relevant Bluetooth UART components, which products use serial-connected Bluetooth modules, and which kernels have received the stable backport. That may require coordination with hardware vendors, not just package managers.
The third decision is update timing. Kernel updates frequently require reboots, and reboot scheduling is where many “medium-looking” vulnerabilities linger for months. If a system has reachable Bluetooth hardware and uses the affected path, delaying the update should be a conscious risk acceptance rather than an accident caused by missing CVSS metadata.
There is also a monitoring angle. Kernel logs showing Bluetooth HCI UART errors, TTY hangups during initialization, general protection faults, null-pointer dereferences, or crashes in related receive and close paths should be reviewed with this CVE in mind. Absence of logs is not proof of safety, but the presence of these symptoms can help prioritize systems that are not merely theoretically exposed.
For developers and maintainers of custom kernels, the answer is more direct: review the upstream stable commits referenced by the CVE and ensure the same ordering and locking semantics exist in your tree. Cherry-picking without understanding adjacent vendor modifications is risky, particularly in Bluetooth stacks where out-of-tree protocol glue is common.

The Kernel’s Bluetooth Surface Keeps Looking Bigger Than Users Think​

Bluetooth is often treated as a convenience feature: headphones, keyboards, mice, controllers, and the occasional file transfer. Under the hood, it is a complex radio, transport, protocol, and driver ecosystem running partly in firmware and partly in the host OS. The HCI boundary is supposed to standardize that relationship, but standardization does not eliminate lifecycle complexity.
The UART variant adds another layer of historical and embedded-world reality. Not every Bluetooth controller appears as a neat USB device with a modern driver stack. Many are attached over serial links, with protocol shims such as H4 or H5 and vendor-specific setup sequences. That design is efficient and widespread, but it means ordinary TTY events can become part of Bluetooth device security.
The result is a subsystem where bugs can emerge from interactions rather than from a single obviously unsafe function. A timer requeues transmit work. A TTY hangup arrives before setup finishes. A protocol-ready flag gates one cleanup path but not another. A vendor close callback assumes the HCI device still exists. A receive routine increments a counter just outside the lock that protects the pointer. None of those facts alone sounds dramatic; together, they become CVE-2026-46275.
This is why memory-safe language debates, while important, do not replace lifecycle discipline in today’s kernels. Linux is still overwhelmingly C in its driver core, and Windows still carries a vast legacy driver ecosystem. Even as Rust enters more kernel conversations, most deployed device support remains governed by reference counts, locks, flags, queues, callbacks, and human care.
The hopeful reading is that the fix is clear, targeted, and already moving through stable channels. The less comforting reading is that this class of bug is never going away entirely as long as hardware stacks rely on asynchronous teardown across multiple ownership domains. Security teams should plan accordingly.

The Patch Notes Are the Risk Model​

The useful details in CVE-2026-46275 are not the absent severity score but the mechanics of the patch. They tell administrators where to look, developers what pattern to avoid, and vendors what they must backport. The vulnerability is narrow in subsystem scope, but broad in the lesson it carries.
  • Systems without Bluetooth hardware, without the affected UART transport, or without the relevant kernel code loaded are unlikely to face the same practical exposure as embedded or endpoint devices that use serial-attached Bluetooth controllers.
  • The record was published on June 8, 2026, with NVD scoring still unavailable, so teams should not wait for a CVSS number before triaging reachable Linux Bluetooth deployments.
  • The fix centers on ordering: clear the protocol-ready flag, synchronously cancel transmit work, close vendor protocol state before freeing the HCI device, and keep receive-side dereferences inside the lock that protects them.
  • Distribution kernels should be patched through vendor update channels where possible, while custom and embedded kernels need direct verification that the stable fixes or equivalent backports are present.
  • Crash reports involving Bluetooth HCI UART close, initialization, receive, or transmit paths should be treated as potentially relevant signals rather than dismissed as ordinary peripheral instability.
CVE-2026-46275 will probably not become the week’s loudest vulnerability, and for many Windows-centric environments it will remain an item in the Linux and appliance column rather than a desktop emergency. But it is exactly the kind of kernel flaw that rewards disciplined maintenance: small race, privileged code, uneven exposure, and a fix whose value depends on actually reaching the devices that need it. The next security story in Bluetooth may involve a flashier exploit chain, but this one is a reminder that the quietest bugs often live where hardware is half-initialized, software is half-shut-down, and the workqueue has not yet received the news.

References​

  1. Primary source: NVD / Linux Kernel
    Published: 2026-06-10T01:03:52-07:00
  2. Security advisory: MSRC
    Published: 2026-06-10T01:03:52-07:00
    Original feed URL
  3. Official source: nist.gov
  4. Related coverage: vuldb.com
  5. Related coverage: cve.imfht.com
  6. Related coverage: spinics.net
 

Back
Top