你的蓝牙耳机,每秒在向全世界喊40次”我在这儿”

前两天国安部发了篇文章,标题挺吓人——《谨防蓝牙成”獠牙”》。评论区一片”又来了又来了”的敷衍,大家觉得这不过是又一轮安全科普KPI。

但我这个写了十年代码的人,看完之后反而出了一身冷汗。

不是因为文章写得多好,而是因为我太清楚蓝牙协议栈底下藏着什么。我低头看了一眼自己:AirPods Pro挂在耳朵上,Apple Watch贴在手腕上,蓝牙键盘连着MacBook,车钥匙在口袋里——四个蓝牙设备,每个都在以每秒20-40次的频率,向周围所有人广播:”我在这里,我在这里,我在这里。”

不需要任何黑客工具。一部手机装个nRF Connect,你就能看到方圆30米内所有蓝牙设备的广播包。 试试看,结果会让你不太舒服。

蓝牙的”原罪”:想被连接,就必须先暴露自己

要理解蓝牙为什么天然不安全,得先明白它的工作原理。

蓝牙设备要想被发现、被连接,就必须不停地发送广播包(Advertising Packets)。这是BLE(低功耗蓝牙)协议的底层设计——你的耳机要让手机找到它,唯一的办法就是反复喊”我在这里”。

这和WiFi不一样。WiFi路由器虽然也广播SSID,但你的手机作为客户端不需要主动暴露自己。蓝牙反过来——每一个想被连接的设备,都必须主动把自己的存在告诉全世界。

广播包里有什么?设备名称、MAC地址、支持的服务UUID、信号强度……这些信息组合在一起,就是一个精确的设备指纹。哪怕你的设备用了随机MAC地址(很多便宜设备根本没做这个),UUID和设备特征的组合依然可以唯一标识你。

这就是蓝牙安全的”原罪”——便捷和隐私是天然矛盾的。你享受无线的便利,就必须承受无线的暴露。

“已配对”不等于”已加密”——你的设备可能在裸奔

很多人觉得,设备配对了就安全了。这是一个危险的误解。

蓝牙有四种配对方式:Numeric Comparison(数字比对)、Passkey Entry(密码输入)、Out of Band(带外传输)、以及Just Works。

前三种都还凑合,至少有人工确认的环节。但问题是——你的蓝牙耳机、手环、鼠标、键盘,绝大多数用的是Just Works模式。

Just Works是什么?翻译过来就是”不用管,直接连”。听着方便,技术上的意思是:配对过程中没有任何身份验证。两个设备互相说”你好”“你好”,然后就算认识了。没有密码,没有确认,没有任何防止中间人的机制。

这就像你在咖啡馆里大喊”谁是张三”,一个陌生人站起来说”我是”,你就直接把机密文件递过去了——连身份证都没看一眼。

用程序员的话说,Just Works的密钥协商等价于在明文信道上做Diffie-Hellman交换,没有任何认证保护。任何能监听广播的人都可以发起中间人攻击(MITM)。

蓝牙攻击面四层模型

四层攻击面:从广播到应用,层层有坑

蓝牙的攻击面不是一个点,而是一个面。我把它拆成四层来说。

第一层:广播层——你走到哪,它追到哪。

每个蓝牙设备的广播包都携带MAC地址。虽然BLE 4.2之后引入了随机地址轮换机制,但大量设备要么不支持,要么实现有缺陷。2019年波士顿大学的研究团队证明,即使使用随机MAC地址,通过分析广播包的时序特征和附加数据,依然可以追踪Windows和iOS设备。

更实际的威胁是AirTag式追踪。苹果的Find My网络让全球数亿iPhone变成了蓝牙追踪基站。虽然苹果做了反追踪提醒,但第三方追踪器(某些几十块钱的山寨AirTag)未必会遵守这些规则。

第二层:配对层——降级攻击,把你的铁门变纸门。

即使设备支持安全配对,攻击者也可以通过降级攻击(Downgrade Attack)逼迫设备回退到Just Works模式。BLE协议栈在设计上允许配对方式的”协商”,攻击者只需要伪装成一个只支持Just Works的设备,你的手机就会乖乖降级。

2020年披露的BLURtooth漏洞(CVE-2020-15802)就是这类问题——它允许攻击者覆盖已有的配对密钥,强制降级加密等级。

第三层:传输层——密钥长度,可以被”谈判”缩短。

2019年的KNOB攻击(Key Negotiation of Bluetooth,CVE-2019-9506)展示了一个精巧的攻击方式:蓝牙协议允许两端”协商”加密密钥的长度,攻击者可以在中间把密钥长度压缩到1字节——也就是256种可能。暴力破解只需要不到一秒。

这个漏洞影响了几乎所有蓝牙设备,因为它存在于蓝牙规范本身,不是某个厂商的实现问题。

第四层:应用层——固件是最后一道防线,也往往是最薄弱的。

蓝牙设备的固件更新(OTA)如果没做好签名验证,攻击者可以推送恶意固件。2020年Purdue大学披露的BLESA攻击(BLE Spoofing Attacks)证明,攻击者可以在重连阶段绕过认证,冒充已配对设备。

更常见的情况是:很多蓝牙设备压根没有固件更新机制。你三年前买的那个蓝牙音箱,出厂时的漏洞会陪你用到报废。

程序员蓝牙安全Checklist

程序员的蓝牙安全5步Checklist

说了这么多攻击面,不给解法就是耍流氓。以下是我自己在用的五条规则,不需要安全专家背景,程序员的基本素养就够了。

第一,不用的蓝牙,关掉。 这是最简单也最有效的措施。你的手机蓝牙24小时开着,意味着24小时在广播。不用蓝牙耳机的时候,关掉耳机的电源——不是断开连接,是关掉电源。很多耳机断开连接后会进入广播模式寻找新设备,比连着的时候还”话多”。

第二,定期清理配对列表。 打开手机的蓝牙设置,看看里面有多少”已配对”的设备。那个两年前试了一次的蓝牙音箱,那个朋友的车载蓝牙,那个商场试听时配对的耳机——每一个都是潜在的攻击入口。配对记录意味着你的设备会自动信任对方,攻击者如果能伪造其中一个设备的身份,就能绕过配对直接连接。

第三,公共场所拒绝一切配对请求。 咖啡馆、机场、地铁里突然弹出的蓝牙配对请求,100%是可疑的。正常情况下,你的已知设备不会重新请求配对。收到未知配对请求,直接拒绝,不用犹豫。

第四,检查固件版本,能更新就更新。 打开耳机、手表、键盘的官方App,看看有没有固件更新。蓝牙芯片厂商(高通、博通、Nordic)每年都会修复若干安全漏洞,但这些修复需要通过设备厂商的固件更新才能到达你手上。固件版本越老,裸奔面积越大。

第五,优先选择支持LE Secure Connections的设备。 这是BLE 4.2引入的安全配对模式,使用椭圆曲线Diffie-Hellman(ECDH)密钥交换,能有效防止被动窃听和MITM攻击。怎么判断?查设备规格里的蓝牙版本——至少要5.0以上,并且明确标注支持LE Secure Connections。几十块钱的不知名品牌蓝牙设备,大概率不支持。

蓝牙安全加固要点

无线便捷的代价

我写这篇文章的时候,AirPods还挂在耳朵上。写完之后我做的第一件事,不是摘掉耳机,而是去蓝牙设置里清理了一遍配对列表——删掉了七个我都记不得是什么的设备。

蓝牙不安全,不是因为它设计得烂,而是因为它在设计时做了一个取舍:用暴露换便捷。 这个取舍在万物互联的时代被无限放大——你身上的蓝牙设备越多,你的无线”足迹”就越清晰。

你不需要因此拔掉所有蓝牙设备回到有线时代。但你至少应该知道,每次打开蓝牙的时候,你在空气中广播了什么,谁可能在听,以及你能做什么来把音量调低一点。

无线的世界里,沉默是一种安全策略。