Bluetooth: RFCOMM: free the skb when the DLC has no owner
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 6.6.160, 6.12.113, 6.18.57, 7.2.11
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
Summary
In the Linux kernel, the following vulnerability has been resolved: Bluetooth: RFCOMM: free the skb when the DLC has no owner rfcomm_recv_data() hands the skb to d->data_ready() and returns 0 without freeing it, so the callback owns the skb from that point on. The tty implementation frees it when the DLC has been detached from its device: static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb) { struct rfcomm_dev *dev = dlc->owner; if (!dev) { kfree_skb(skb); return; } The socket implementation returns without freeing it, and the skb is leaked. A connected DLC can have no owner: rfcomm_sock_destruct() clears d->owner, while the DLC itself stays on the session until it is closed. Data frames that arrive in that window still find d->state == BT_CONNECTED in rfcomm_recv_data() and are handed to the callback, one leaked skb each. The leak does not stop on its own either. The remote runs out of credits only once RFCOMM_RX_THROTTLED is set, and for a socket the only place that sets it is rfcomm_sk_data_ready() itself, below the return. rfcomm_process_dlcs() keeps granting credits, so the remote keeps sending and the leak keeps growing. Free the skb, as the tty side does.
Timeline
- CVE published
- First seen by cve.now
Affected versions
- Linux Linux
From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 · fixed in a54ce160e3ef7e50ec94e0ac4131c3d0f9f739b9; From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 · fixed in c3f76b025cbbb0ab47310dbe7de18092d89f2a99; From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 · fixed in 4f46de658ce61968aef5ea7ae809d1c180330544; From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 · fixed in b8814161b14c610b7a09527433301d8ad8180aef; From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 · fixed in 9d1afbf60ed53c5b051cd124153e0ae3078c8b93
- Linux Linux
2.6.12
- KernelLinux
From 2.6.12 · fixed in 6.6.160; From 6.7.0 · fixed in 6.12.113; From 6.13.0 · fixed in 6.18.57; From 6.19.0 · fixed in 7.2.11