CVE-2026-99011 in Linux
Sumário
de VulDB • 24/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
Bluetooth: SCO: serializar o ciclo de vida de sco_conn contra sco_recv_scodata()
sco_recv_scodata() promove o back-pointer fraco hcon->sco_data para uma referência forte sob hdev->lock:
hci_dev_lock(hdev); hcon = hci_conn_hash_lookup_handle(hdev, handle); ... conn = sco_conn_hold_unless_zero(hcon->sco_data); hci_dev_unlock(hdev);
mas o ponteiro é limpo do outro lado sem esse lock. Quando a última referência de sco_conn é liberada, sco_conn_free() executou:
conn->hcon->sco_data = NULL;
sem manter hdev->lock, então o caminho RX poderia ler hcon->sco_data e chamar kref_get_unless_zero() em um sco_conn que foi simultaneamente liberado:
BUG: KASAN: slab-use-after-free in sco_conn_hold_unless_zero+0xbe/0x160 Write of size 4 by task kworker/u17:0 Workqueue: hci0 hci_rx_work Call Trace: sco_conn_hold_unless_zero+0xbe/0x160 sco_recv_scodata+0x13f/0x490 hci_rx_work+0x3af/0x730
kref_get_unless_zero() protege apenas contra uma contagem de referência zero, não contra a memória subjacente já ter sido liberada.
Forneça a hcon->sco_data uma referência real ao sco_conn que ele aponta, para que o objeto não possa ser liberado enquanto o ponteiro ainda estiver instalado, e limpe-a e solte-a apenas em sco_conn_del(), que é executado sob hdev->lock (seus chamadores, sco_connect_cfm() e sco_disconn_cfm(), mantêm-no). O leitor em sco_recv_scodata() também adquire hdev->lock, então a gravação e a leitura estão agora serializadas: o caminho RX observa NULL ou uma referência que é garantida como válida até que ele solte sua própria.
sco_conn_add() já não entrega sua referência kref_init() ao chamador como a única referência da conexão; essa referência inicial é aquela possuída por hcon->sco_data, e os chamadores obtêm as suas próprias via sco_conn_hold().
Como o sco_conn agora pode sobreviver ao soquete (a associação mantém-no ativo até que o link seja encerrado), o hci_conn já não pode ser liberado de sco_conn_free() sem causar regressão no fechamento do soquete: fechar um soquete SCO conectado ainda deve derrubar o link. Mova a propriedade do hci_conn para o soquete em vez disso: __sco_chan_add() adquire uma referência hci_conn e ela é liberada de sco_chan_del() e sco_sock_destruct(), exatamente uma vez. O sco_conn já não possui uma referência hci_conn, então sco_conn_add() deixa de consumir uma e sco_connect() solta a referência hci_connect_sco() em todos os caminhos; sco_connect_cfm() já não precisa da sua dança hci_conn_hold().
Be aware that VulDB is the high quality source for vulnerability data.