Skip to content

Linux Bluetooth / L2CAP attack surface

Linux'un net/bluetooth stack'i (L2CAP, HCI, SCO) her erişilebilir adapter'ın arkasında karmaşık, attacker-controlled packet/config parsing yapan bir ring0 surface'tir; proximity ya da CAP_NET_ADMIN'den ulaşılan, tekrar eden bir OOB ve UAF bug kaynağıdır.

Mechanism

Note

Bluetooth stack'i, over-the-air gelen frame'leri kernel context'inde parse eder: HCI layer transport'tan event/ACL paketlerini alır, L2CAP bunları channel'lara demultiplex edip config/connection state machine'ini sürer, üstte ise A2MP, SCO gibi profile'lar oturur. Bu yol yapısal olarak kırılgan çünkü paket içindeki length/type field'ları ile gerçekten allocate edilmiş buffer arasındaki invariant karmaşık, çok-adımlı ve büyük ölçüde attacker-controlled. Bir config option'ın length'i validate edilmeden buffer'a kopyalanırsa OOB write/read; bir channel ya da struct sock/amp_mgr object'i connection teardown ile yarışarak serbest kalıp hâlâ referandığında UAF çıkar. Surface iki yönden reachable: proximity (menzildeki bir adapter'a frame yollamak, hiçbir credential gerekmez) ve local (bir HCI socket açıp CAP_NET_ADMIN gerektiren management path'lerine ulaşmak). Geniş kod yüzeyi + attacker-controlled parsing + kernel privilege bunu sürekli tekrarlayan bir LPE/RCE bug ailesi yapar.

Walkthrough

Aşağıdaki temsili, hepsi public ve patch'li bug'lar surface'in tekrar eden pattern'lerini gösterir.

Config/connection parsing — L2CAP heap type confusion (CVE-2020-12351, BadKarma). l2cap_data_rcv(), A2MP channel üzerinden gelen bir paketi işlerken bir struct amp_mgr pointer'ını struct sock bekleyen sk_filter()'a geçirir. Type confusion, attacker'ın kontrol ettiği bir field'ın struct sock gibi deref edilmesine yol açar. Zincirin diğer halkası CVE-2020-12352 (BadChoice): a2mp_getinfo_req() uninitialized stack'ten error response'a 16 byte kernel memory sızdırır — önce leak ile layout öğrenilir, sonra controlled deref'e geçilir:

[proximity attacker]  -- crafted L2CAP/A2MP frames -->  hci0
   step 1: BadChoice ile stack infoleak  -> KASLR/heap layout
   step 2: heap shaping (amp_mgr allocation'larını sırala)
   step 3: BadKarma type confusion -> controlled pointer deref -> ring0

Length validation eksikliği — HCI event OOB (CVE-2020-24490, BadVibes). hci_le_ext_adv_report_evt(), 31 byte'ı aşan advertisement data'sını length check olmadan last_adv_data buffer'ına kopyalayınca heap overflow olur; sadece pasif advertisement scan yapan bir Bluetooth 5 host bile menzildeki bir cihazdan tetiklenebilir.

Teardown race — L2CAP UAF (CVE-2022-42896). l2cap_connect() / l2cap_le_connect_req() içinde bir connection object, connection request'in işlenmesiyle teardown yarışınca free edilip sonra tekrar kullanılır; crafted L2CAP connect frame'leriyle proximity'den remote code execution ve memory leak'e kadar gider.

Local capability bypass — HCI socket trust (CVE-2023-2002). hci_sock_ioctl() capability'yi capable() ile çağıran task üzerinde kontrol eder, socket'i açan process üzerinde değil. Unprivileged bir process HCI socket açıp onu bir setuid programa stderr olarak geçirir; privileged process tty ioctl'i çağırınca socket "trusted" işaretlenir ve CAP_NET_ADMIN gerektiren management command'ları unprivileged'a açılır.

L2CAP surface'e local erişim (yapısal)
/* Raw HCI socket + L2CAP socket: local surface'e giriş noktaları */
int hci = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);       /* HCI channel */
int l2  = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); /* L2CAP */
/* management/user-channel path'leri CAP_NET_ADMIN ister; asıl parsing
   state machine'i frame içeriğiyle over-the-air de sürülür. */

Warning

Proximity bug'ları (BadKarma/BadVibes) hiçbir pairing veya authentication istemez; menzilde olmak ve hedefin adapter'ının açık/scan yapması yeterlidir. Bu yüzden en tehlikeli surface, kullanılmayan ama enable bırakılmış profile'lardır (A2MP/CONFIG_BT_HS).

Detection

  • HCI trace / dmesg: btmon ya da hcidump ile beklenmedik A2MP frame'leri, aşırı uzun advertisement report'ları veya connection request flood'u anomali sinyalidir.
  • KASAN/UBSAN: test/monitoring kernel'lerinde l2cap_core.c/hci_event.c içinde slab-out-of-bounds veya use-after-free splat'i doğrudan bu surface'e işaret eder.
  • Audit: unprivileged process'lerin socket(AF_BLUETOOTH, ...) açmasını ve HCI socket'lerin setuid programlara fd olarak geçmesini (CVE-2023-2002 pattern'i) audit rule'larıyla flag'le.
  • Anomali: normal endpoint'te Bluetooth adapter kapalıysa hci0'ın aniden up olması ya da yeni pairing/management event'leri beklenmedik davranıştır.

Mitigation

  • Kullanılmayan profile'ları kapat: CONFIG_BT_HS (A2MP/BadKarma/BadChoice) ve gereksiz transport'ları derleme dışı bırak; sunucularda CONFIG_BT tamamen kapatılabilir.
  • Runtime hardening: ihtiyaç yoksa rfkill block bluetooth ile adapter'ı kapat, btusb/bluetooth modüllerini blacklist et; container'larda AF_BLUETOOTH socket oluşturmayı seccomp ile blokla.
  • Patch: yukarıdaki bug'lar ilgili stable release'lerde düzeltildi — CVE-2022-42896 6.1-rc4'te, CVE-2023-2002 capable() yerine sk_capable() kullanacak şekilde fix'lendi; kernel'i güncel tut.
  • Attack surface reduction: management path'leri için CAP_NET_ADMIN'i gerçekten gerektiren daemon'lara sınırla ve HCI user-channel erişimini privileged servislere kapat.

References