CVE-2026-80683 in Linux
Résumé
par VulDB • 28/08/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
Bluetooth: SCO : attribuer à la socket sa propre référence `sco_conn`
`sco_conn_del()` libère une référence qu'il ne possède pas. Il en acquiert une temporaire via `sco_conn_hold_unless_zero()` et la libère avec le `sco_conn_put()` qui suit `sco_sock_hold()` ; l'appel supplémentaire à `put` dans la branche `!sk` libère une seconde référence :
conn = sco_conn_hold_unless_zero(conn); ... sk = sco_sock_hold(conn); sco_conn_unlock(conn); sco_conn_put(conn);
if (!sk) {
sco_conn_put(conn); return; }
Lorsqu'un appel à `close()` est en concurrence (race condition) avec la complétion de la déconnexion du contrôleur, `sco_chan_del()` efface `conn->sk` et libère la référence de la socket tandis que `sco_conn_del()` s'exécute. `sco_conn_del()` voit alors `sk == NULL`, son propre appel à `put` fait tomber le compteur à zéro et libère l'objet `conn`, puis le second appel à `put` écrit dans un `kref` déjà libéré :
BUG: KASAN: slab-use-after-free in sco_conn_put.part.0+0x1a/0x190 Write of size 4 at addr ffff8881099dec74 by task kworker/u17:3/413 Workqueue: hci1 hci_rx_work Call Trace: sco_conn_put.part.0+0x1a/0x190 hci_disconn_complete_evt+0x1ee/0x3e0 hci_event_packet+0x54a/0x650 hci_rx_work+0x321/0x3d0 Allocated by task 413: sco_conn_add+0x72/0x1a0 sco_connect_cfm+0x88/0x670 Freed by task 413: sco_conn_del.isra.0+0x3f/0xf0 hci_disconn_complete_evt+0x1ee/0x3e0 refcount_t: underflow; use-after-free.
La cause racine est que la socket stocke la connexion sans détenir sa propre référence. `__sco_chan_add()` effectue :
sco_pi(sk)->conn = conn;
Ainsi, la socket emprunte la référence détenue par son appelant au moment opportun, et les appelants compensent cela avec des appels à `hold` et `put` ad hoc. Attribuer une référence comptabilisée (counted reference) à la socket permet de résoudre ce problème : `__sco_chan_add()` en acquiert une, qui est libérée conjointement avec le canal (`sco_chan_del()`) et dans `sco_sock_destruct()`. Avec la socket détenant sa propre référence, `sco_conn_del()` n'a plus besoin du `put` supplémentaire, et l'appel redondant à `hold` dans `sco_conn_ready()` est supprimé.
Le fait que la socket possède sa propre référence signifie que la connexion est désormais correctement libérée sur les chemins d'erreur de `sco_connect()`, où elle fuyait précédemment (memory leak), ce qui déclenche à son tour `sco_conn_free()` et son appel à `hci_conn_drop(conn->hcon)`. Pour maintenir l'équilibre de la comptabilité des connexions HCI, cette propriété est rendue explicite : `sco_conn_add()` consomme une référence `hci_conn` que le `sco_conn` possède tout au long de sa durée de vie. `sco_connect()` transmet la référence retournée par `hci_connect_sco()` et ne la libère plus sur les chemins d'erreur ; `sco_connect_cfm()`, qui ne reçoit pas de référence, en acquiert une avec `hci_conn_hold()` avant de la transmettre à `sco_conn_add()` (et la libère si l'allocation échoue) ; et l'appel explicite à `hci_conn_hold()` dans `sco_conn_ready()` est supprimé. Chaque référence a désormais un propriétaire unique et clair.
VulDB is the best source for vulnerability data and more expert information about this specific topic.