Overview
About vulnerability
In the Linux kernel, the following vulnerability has been resolved:
wifi: ath9k: hif_usb: don’t dereference hif_dev after re-arming firmware request
ath9k_hif_request_firmware() re-arms an asynchronous firmware load via request_firmware_nowait(), passing hif_dev as the completion context, and then still dereferences hif_dev:
dev_info(&hif_dev->udev->dev, “ath9k_htc: Firmware %s requested\n”, hif_dev->fw_name);
The re-armed callback ath9k_hif_usb_firmware_cb() runs on the “events” workqueue and, when the firmware is missing, walks the retry chain into ath9k_hif_usb_firmware_fail() -> complete_all(&hif_dev->fw_done). That releases the wait_for_completion(&hif_dev->fw_done) in a concurrent ath9k_hif_usb_disconnect(), which then kfree()s hif_dev. The trailing dev_info() in the frame that re-armed the request can therefore read freed memory (hif_dev->udev, the first field of struct hif_device_usb):
BUG: KASAN: slab-use-after-free in ath9k_hif_request_firmware Read of size 8 … by task kworker/… ath9k_hif_request_firmware ath9k_hif_usb_firmware_cb drivers/net/wireless/ath/ath9k/hif_usb.c:1247 request_firmware_work_func Allocated by …: ath9k_hif_usb_probe drivers/net/wireless/ath/ath9k/hif_usb.c Freed by …: ath9k_hif_usb_disconnect -> kfree drivers/net/wireless/ath/ath9k/hif_usb.c
The fw_done barrier only makes disconnect wait for the firmware chain to terminate; it does not protect the outer ath9k_hif_request_firmware() frame that re-armed the request and keeps touching hif_dev afterwards.
Drop the post-request dev_info(): it is the only use of hif_dev after the async request is armed, and it is purely informational (the dev_err() on the failure path runs only when request_firmware_nowait() did not arm a callback, so hif_dev is still alive there).
This was first reported by syzbot as a single, non-reproduced crash that was later auto-obsoleted, and was independently rediscovered by the reFuzz fuzzer, which produced a C reproducer (USB-gadget connect/disconnect of an ath9k_htc device whose firmware download fails). The vulnerable code is unchanged and still present in v7.1-rc6, where the slab-use-after-free reproduces under KASAN once the (sub-microsecond) race window is widened.
Details
- Affected product:
- AlmaLinux 9.2 ESU , Amazon Linux 2 ELS , CentOS 8.4 ELS , CentOS 8.5 ELS , CentOS Stream 8 ELS , Debian 10 ELS , Debian 11 ELS , Oracle Linux 7 ELS , TuxCare 9.6 ESU , TuxCare 9.8 ESU , Ubuntu 16.04 ELS , Ubuntu 18.04 ELS , Ubuntu 20.04 ELS
- Affected packages:
- linux @ 4.19.0 (+13 more)
Fixes
KernelCare state
Live-patch status from KernelCare for each operating system.
| Operating system | Status | Covered kernels |
|---|---|---|
| AlmaLinux 10 | Released |
66 kernels
|
| AlmaLinux 8 | Released |
132 kernels
|
| AlmaLinux 9 | Released |
133 kernels
|
| AlmaLinux 9.2 ESU | Released |
34 kernels
|
| AlmaLinux 9.6 ESU | Released |
18 kernels
|
| CentOS 8 | Released |
33 kernels
|
| CloudLinux OS 7h | Released |
119 kernels
|
| CloudLinux OS 8 | Released |
114 kernels
|
| Debian 12 | Released |
43 kernels
|
| Debian 13 | Planned | — |
| Oracle Linux 10 | Released |
52 kernels
|
| Oracle Linux 8 | Released |
150 kernels
|
| Oracle Linux 8 UEK 7 | Released |
112 kernels
|
| Oracle Linux 9 | Released |
132 kernels
|
| Oracle Linux 9 UEK 7 | Released |
112 kernels
|
| Proxmox VE 7 5.15 | Released |
47 kernels
|
| RHEL 10 | Released |
67 kernels
|
| RHEL 8 | Released |
148 kernels
|
| RHEL 9 | Released |
131 kernels
|
| Rocky Linux 10 | Released |
50 kernels
|
| Rocky Linux 8 | Released |
109 kernels
|
| Rocky Linux 9 | Released |
108 kernels
|
| Ubuntu 20.04 HWE AWS | Released |
57 kernels
|
| Ubuntu 22.04 | Released |
102 kernels
|
| Ubuntu 22.04 AWS | Released |
93 kernels
|
| Ubuntu 22.04 Azure | Will Not Fix |
83 kernels
|
| Ubuntu 24.04 | Planned | — |
| Ubuntu 24.04 AWS | Planned | — |
| Ubuntu 26.04 | In Rollout |
2 kernels
|