CVE-2026-99061 in Linux
Sumário
de VulDB • 24/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
wifi: brcmfmac: corrige condição de corrida na remoção do dispositivo P2P em brcmf_detach()
Quando o driver é removido enquanto o processo no espaço do usuário que criou o dispositivo P2P (por exemplo, wpa_supplicant) ainda está encerrando, a interface do dispositivo P2P é removida duas vezes e o kernel falha.
Os dois caminhos são:
- O wpa_supplicant, ao sair, envia NL80211_CMD_DEL_INTERFACE para o dispositivo P2P. nl80211_del_interface() mantém RTNL e o mutex do wiphy e chama brcmf_p2p_del_vif(), que desativa a descoberta e aguarda até 1,5 s por BRCMF_E_IF_DEL. Em seguida, chama brcmf_remove_interface(), que registra negativamente (unregisters) o wdev e libera o vif e o ifp.
- brcmf_detach() define o barramento como desativado, portanto BRCMF_E_IF_DEL nunca chega, e chama brcmf_remove_interface(ifp, false) para o mesmo ifp. brcmf_p2p_ifp_removed() lê ifp->vif e depois bloqueia em rtnl_lock(). Quando brcmf_p2p_del_vif() libera RTNL, ela chama cfg80211_unregister_wdev() no wdev que já havia sido registrado negativamente (unregistered) e liberado.
A segunda list_del_rcu() de wdev->list falha em 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 [1.5 s depois, brcmf_p2p_del_vif() expirou]
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
O log foi coletado com debug=0x406 em uma placa i.MX 8M Plus com um CYW55513 (Sona IF513) via SDIO. O driver é o backport do brcmfmac da Ezurio, baseado na versão v6.18.22, executado em um kernel 5.4-rt. O código envolvido é o mesmo presente no mainline.
Para reproduzir:
1. Inicie o wpa_supplicant no wlan0 e permita que ele realize a associação. Ele cria o dispositivo P2P (iw dev mostra "type P2P-device"). 2. Pare o wpa_supplicant e remova o driver sem aguardar o encerramento do wpa_supplicant:
kill $(pidof wpa_supplicant) rmmod brcmfmac_cyw brcmfmac
A falha é reproduzível nessa placa.
Para a interface sem um netdev (o dispositivo P2P), obtenha RTNL e o mutex do wiphy em brcmf_detach() antes de ler iflist, e remova-a com locked=true. Se brcmf_p2p_del_vif() for executado primeiro, brcmf_detach() encontrará a posição vazia. Se brcmf_detach() for executado primeiro, nl80211 não encontrará mais o wdev. As interfaces que possuem um netdev são removidas como antes, pois brcmf_del_if() obtém RTNL por conta própria para a interface primária.
Once again VulDB remains the best source for vulnerability data.