CVE-2026-45640 — Windows Bluetooth Port Driver Elevation of Privilege Vulnerability
Executive Summary
Use after free in Windows Bluetooth Port Driver allows an authorized attacker to elevate privileges locally.
Overview
CVSS Vector
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
EPSS Score
Affected Products
| Product | KB Article | Severity | Impact | Restart Required |
|---|---|---|---|---|
| Windows 10 Version 21H2 for 32-bit Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 21H2 for ARM64-based Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 21H2 for x64-based Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for 32-bit Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for ARM64-based Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 10 Version 22H2 for x64-based Systems | 5094127 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 23H2 for ARM64-based Systems | 5093998 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 23H2 for x64-based Systems | 5093998 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 24H2 for ARM64-based Systems | 5094126 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 24H2 for x64-based Systems | 5094126 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 25H2 for ARM64-based Systems | 5094126 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 25H2 for x64-based Systems | 5094126 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 Version 26H1 for ARM64-based Systems | 5095051 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows 11 version 26H1 for x64-based Systems | 5095051 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2022 | 5094128 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2022 (Server Core installation) | 5094128 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2025 | 5094125 (Security Update) |
Important | Elevation of Privilege | Yes |
| Windows Server 2025 (Server Core installation) | 5094125 (Security Update) |
Important | Elevation of Privilege | Yes |
Patches
| Article | Type | Restart |
|---|---|---|
5094127 |
Security Update | Yes |
5093998 |
Security Update | Yes |
5094126 |
Security Update | Yes |
5095051 |
Security Update | Yes |
5094128 |
Security Update | Yes |
5094125 |
Security Update | Yes |
Patch Diff
Use-after-free / double-free race (CWE-416) in the Windows Bluetooth port driver bthport.sys, local EoP. HciLELegacyAdvertisingRequestCoordinator::MarkAllAdvertisingRequestAsNew iterates pending LE legacy advertising requests and re-sets each IRP's cancellation routine (ClearRequestCancellationRoutine then SetRequestCancellationRoutine). ClearRequestCancellationRoutine fails when the IRP's cancellation is already in progress (the cancel callback is already completing/freeing that IRP). PRE: on a Clear failure the code fell through to LAB_0 and set the per-request error flag (*(lVar1+8) |= 4), marking the IRP as MarkAll's own cleanup/error-handling target even though the cancel callback owns it - so a single IRP could be completed and freed on two paths at once (double free / UAF). IN-HOUSE ghidriff of bthport.sys 10.0.26100.8524 -> .8655 (Jun 9 2026, KB5094126) confirms the fix: MarkAllAdvertisingRequestAsNew is the only code-changed function; gated behind CFR flag Feature_697033018, a Clear failure now sets no error flag and exits (the cancel callback alone owns the IRP), and only the Clear-succeeded-but-Set-failed case sets the error flag for genuine cleanup. Removes the race between the cancellation callback and MarkAll. Note: our x64 24H2 diff shows flag Feature_697033018, differing from the circulated screenshots' Feature_965468474 (build/arch difference); we ship what our diff shows.
| Function | Address | Change | Note |
|---|---|---|---|
HciLELegacyAdvertisingRequestCoordinator::MarkAllAdvertisingRequestAsNew |
code change |
code (stop error-flagging IRPs whose cancellation is in progress, CFR-gated) | Pre: `ClearRequestCancellationRoutine` fail -> LAB_0 -> `*(lVar1+8) |= 4` (error flag) -> IRP marked for MarkAll cleanup while the cancel callback also frees it -> double free/UAF. Post (Feature_697033018 enabled): Clear-fail sets no flag and exits (callback owns the IRP); only Clear-OK + Set-fail sets `| 4`. The in-progress flag `| 1` and the operation_guard acquire around the section are unchanged. |
Feature_697033018 |
new flag |
added (CFR gate) | New Controlled Feature Rollout flag introduced by this patch (Feature_697033018__private_IsEnabledDeviceUsageNoInline / _IsEnabledFallback) gating the fixed handling; the original racy path (iVar4==0) still ships in .8655. |
Attack Path
MarkAllAdvertisingRequestAsNew error-flags an IRP whose cancellation is already in flight, so both paths free it
Derived from the patch delta: the checks added by the vendor identify which fields crossed a trust boundary unvalidated. Reachability and privilege are taken from the call chain in the RCA report.
Known Exploits
Acknowledgments
hazard