CVE-2026-99061 in Linux
Riassunto
di VulDB • 23/10/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
wifi: brcmfmac: correzione della race condition nella rimozione del dispositivo P2P in brcmf_detach()
Quando il driver viene rimosso mentre il processo user space che ha creato il dispositivo P2P (ad esempio wpa_supplicant) è ancora in fase di chiusura, l'interfaccia del dispositivo P2P viene rimossa due volte e il kernel va in crash.
I due percorsi sono:
- wpa_supplicant, all'uscita, invia NL80211_CMD_DEL_INTERFACE per il dispositivo P2P. nl80211_del_interface() acquisisce RTNL e il mutex wiphy ed esegue brcmf_p2p_del_vif(), che disabilita la discovery e attende fino a 1,5 s per BRCMF_E_IF_DEL. Successivamente chiama brcmf_remove_interface(), che deregistra il wdev e libera vif e ifp.
- brcmf_detach() imposta bus down, quindi BRCMF_E_IF_DEL non arriva mai, ed esegue brcmf_remove_interface(ifp, false) per lo stesso ifp. brcmf_p2p_ifp_removed() legge ifp->vif e poi si blocca su rtnl_lock(). Quando brcmf_p2p_del_vif() rilascia RTNL, chiama cfg80211_unregister_wdev() sul wdev che era già stato deregistrato e liberato.
La seconda list_del_rcu() di wdev->list genera un fault su LIST_POISON2:
brcmfmac: brcmf_p2p_del_vif delete P2P vif brcmfmac: brcmf_p2p_deinit_discovery enter brcmfmac: brcmf_p2p_del_vif P2P: GO_NEG_PHASE status cleared brcmfmac: brcmf_detach Enter brcmfmac: brcmf_bus_change_state 1 -> 0 brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0 brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0 brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed [dopo 1.5 s, timeout di brcmf_p2p_del_vif()]
brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0 brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0 brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed Unable to handle kernel paging request at virtual address dead000000000122 Internal error: Oops: 96000044 [#1] PREEMPT_RT SMP
pc : _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
Call trace: _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
cfg80211_unregister_wdev+0x10/0x1c [cfg80211]
brcmf_p2p_ifp_removed+0x84/0xb0 [brcmfmac]
brcmf_remove_interface+0x1f4/0x254 [brcmfmac]
brcmf_detach+0x88/0x180 [brcmfmac]
brcmf_sdio_remove+0x90/0x7b0 [brcmfmac]
brcmf_sdiod_remove+0x20/0xa0 [brcmfmac]
brcmf_ops_sdio_remove+0xbc/0x12c [brcmfmac]
sdio_bus_remove+0x38/0x144 device_release_driver_internal+0x1e8/0x2c0 device_release_driver+0x14/0x20 brcmf_sdio_bus_remove+0x2c/0x40 [brcmfmac]
brcmf_fwvid_unregister_vendor+0xd8/0x170 [brcmfmac]
__exit_compat+0x18/0x418 [brcmfmac_cyw]
__arm64_sys_delete_module+0x1ac/0x244
Il log è stato acquisito con debug=0x406 su una scheda i.MX 8M Plus con un CYW55513 (Sona IF513) su SDIO. Il driver è il backport di brcmfmac fornito da Ezurio dalla versione v6.18.22 su un kernel 5.4-rt. Il codice coinvolto è lo stesso presente nel mainline.
Per riprodurre:
1. Avviare wpa_supplicant su wlan0 e lasciarlo associare. Crea il dispositivo P2P (iw dev mostra "type P2P-device"). 2. Arrestare wpa_supplicant e rimuovere il driver senza attendere che wpa_supplicant esca:
kill $(pidof wpa_supplicant) rmmod brcmfmac_cyw brcmfmac
Il crash è riproducibile su quella scheda.
Per l'interfaccia priva di netdev (il dispositivo P2P), acquisire RTNL e il mutex wiphy in brcmf_detach() prima di leggere iflist, ed eliminarla con locked=true. Se viene eseguito per primo brcmf_p2p_del_vif(), brcmf_detach() trova lo slot vuoto. Se viene eseguito per primo brcmf_detach(), nl80211 non trova più il wdev. Le interfacce dotate di netdev vengono rimosse come in precedenza, poiché brcmf_del_if() acquisisce RTNL autonomamente per l'interfaccia primaria.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.