Linux Bluetooth / L2CAP attack surface¶
Linux'un
net/bluetoothstack'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:
btmonya dahcidumpile 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.ciç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; sunuculardaCONFIG_BTtamamen kapatılabilir. - Runtime hardening: ihtiyaç yoksa
rfkill block bluetoothile adapter'ı kapat,btusb/bluetoothmodülleriniblacklistet; container'lardaAF_BLUETOOTHsocket 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()yerinesk_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¶
- BleedingTooth: Linux Bluetooth Zero-Click Remote Code Execution (Google security-research)
- Heap-Based Type Confusion in L2CAP — GHSA-h637-c88j-47wq (Google)
- CVE-2022-42896: use-after-free in l2cap_connect / l2cap_le_connect_req (Red Hat Bugzilla)
- CVE-2023-2002: HCI socket ioctl insufficient permission check (lrh2000)