今天聊点有意思的,之前我们聊过了造假的《AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?》大家应该都还记得吧,那个属于注水的「国王的新衣」,但是今天这个蓝牙的,却是实实在在已经被广泛应用过的。
相信在日常生活里,你的手机蓝牙应该都是常开的,特别是有无线耳机、手表、AI 眼镜 等穿戴设备的场景下,大部分人日常的蓝牙和 BLE 肯定都是常开,但是这其实很可能会泄露你的一些隐私信息 (不需要连接),比如这次要聊的 Bluetooth 漏洞(WhisperPair) 就让很多设备存在可能容易被劫持、远程监听和定位跟踪的风险。
所以,你以为你看到的广告是手机监控,但是很可能只是因为你开着蓝牙逛了几次商场。

Bluehood 这个展示蓝牙风险的演示和教育 项目,也就是我们不连接任何设备,只是开启了蓝牙功能,这时候设备(手机、耳机、手表等)也会向周围环境泄露隐私个人隐私。
虽然日常里我们一直把蓝牙当作一个日常小功能,但它是持续广播信号,而 Bluehood 作为一个蓝牙被动扫描器(Passive Scanner)和分析工具,它只"听"不"说",也就是不会尝试连接设备,主要功能是收集和分析蓝牙低功耗(BLE)广播数据:
-
设备指纹识别 : 哪怕不知道具体是谁,它也能识别出设备的类型,例如它能区分出"这是一部 iPhone"、"这是一个 Bose 耳机"、"这是一块 Garmin 手表"或者"这是一个智能灯泡",这是通过分析设备广播的 BLE 服务 UUID(一种唯一的服务标识符)来实现
-
绕过随机 MAC 地址(针对性追踪) : 手机(iOS 和 Android)为了隐私,通常会使用"随机 MAC 地址"来广播,防止被长期追踪,但在 Bluehood 的分析下,通过结合信号特征和其他元数据,依然可能识别出某些模式,或者至少识别出"这还是原来那类设备"
-
行为模式分析(Pattern Analysis) : Bluehood 带有一个 dashboard,可以生成热力图,它记录了:
- 设备什么时候出现,什么时候消失(判定作息时间)
- 设备停留了多久
- 关联分析:比如每当"这个特定型号的耳机"出现时,"这个特定型号的手机"也同时出现,从而推断它们属于同一个人

举个例子,如果你的 iPhone 开启了蓝牙,那么 iPhone 发出的蓝牙广播包里,包含一段被称为 Manufacturer Specific Data 的数据,而比如数据是以 0x004C 开头,并且在 0x004C 之后,iPhone还会附带很多加密或未加密的"元数据"来告诉周围的其他苹果设备:"我是谁,我现在能干嘛"。
虽然苹果对这些数据做了加密处理,但不少技术人员已经反向出了很多模式,一些扫描器(不是 Bluehood)不仅能知道你带了 iPhone,甚至可能分析出:
- 设备型号:是 iPhone、iPad 还是 MacBook
- 设备状态:屏幕是亮着还是黑着?正在打电话吗?
- 电量情况:电池电量
- 颜色:是的,有些广播甚至包含设备的颜色信息(为了让配对弹窗显示的颜色和真机一致)
更具体一些例子,例如:
- Flipper Zero 的蓝牙功能 : 这两年很火的极客玩具 Flipper Zero,刷入一些第三方固件后,可以直观地显示周围所有 iPhone 的型号,甚至还能向 iPhone 发送垃圾弹窗(导致手机死机)


- 商业客流分析系统: 很多商场、机场使用的客流分析系统,就是利用这种原理,他们在门口装几个蓝牙/Wi-Fi 探针,虽然不知道你是"张三",但他们知道"一部 iPhone 在下午 2 点进来了,逛了 30 分钟,去了耐克店"
所以 Bluehood 没有使用什么深奥的「黑魔法」去破解,只是简单通过被动监听(Passive Scanning) + 特征指纹匹配(Fingerprinting) 来实现的,在它的代码里,核心就是 bluehood/scanner.py 。

bluehood/scanner.py 使用了 Python 的 bleak 库调用系统的蓝牙适配器进行扫描, 在 scanner.py 启动了一个扫描器,专门捕获周围设备发出的 Advertisement Data(广播数据) :
ini
# bluehood/scanner.py
discovered = await BleakScanner.discover(**kwargs)
for device, adv_data in discovered.values():
# 获取设备广播出来的 "服务UUID列表"
service_uuids = list(adv_data.service_uuids) if adv_data.service_uuids else []
# ...
然后在 bluehood/classifier.py 里,Bluehood 维护了一个庞大的特征码字典 ,专门用来匹配这些 ID,虽然你的 iPhone 会随机变换 MAC 地址(身份证号)来保护隐私,但它广播的 "服务内容"(Service UUIDs) 会直接暴露了它的身份。
-
比如其中就有一段专门针对 Apple 设备的指纹库,只要扫描器在广播包里看到了
0000fd6f或者d0611e78这一串字符,就会直接判定: "这附近有一台 iPhone" (TYPE_PHONE)bash# bluehood/classifier.py # Apple-specific (Continuity, AirDrop, etc.) ("d0611e78", TYPE_PHONE), # Apple Continuity (苹果接力功能) ("7905f431", TYPE_PHONE), # Apple Notification Center (苹果通知中心服务) ("89d3502b", TYPE_PHONE), # Apple Media Service (媒体服务) ("0000fd6f", TYPE_PHONE), # Apple Continuity short UUID (接力短码)
另外,在 bluehood/db.py 和 bluehood/patterns.py 还会分析你的数据规律:
-
在
db.py中,它把每次扫描到的设备存入 SQLite 数据库,如果是同一个 MAC 地址(对于随机 MAC 的 iPhone,长期追踪有难度,但短期内或特定场景下依然有效),它会更新last_seen(最后出现时间)和total_sightings(总目击次数) -
patterns.py通过分析出现的时间点,给设备打标签:- 早出晚归? -> 标记为
"Evenings (5PM-9PM)" - 只有周末来? -> 标记为
"Weekends only" - 天天都在? -> 标记为
"Constant"或"Daily"
python# bluehood/patterns.py 的逻辑片段 def _analyze_time_pattern(hourly): # ...如果你主要活动在 17点-21点... return "Evening" - 早出晚归? -> 标记为
通过 Prometheus 导出器还有实时指标 daemon.py :
bluehood_scans_total- 扫描次数bluehood_devices_total- 设备总数bluehood_sightings_total- 检测次数bluehood_device_rssi_dbm- RSSI 分布直方图
通过数据可以得到
- 热力图显示小时/日活动分布
- 30天存在时间线
- RSSI历史图表
- 信号强度分布热力图
另外协议级的逆向也是屡见不鲜,因为现在对于手机设备和设备之间用于文件传输、接力、设备发现等功能,都依赖于 BLE 广播 和 GATT 服务:
- 它们会广播一些特定的 BLE 广告包来实现"附近设备可见性"
- 黑客通过监听这些广播可以分析出协议内部的字段、如何认证、哪里有隐私泄露等
- 有些研究也逆向出了这些广播包含了跨设备发现信息,以及哪怕在随机 MAC 环境下也能被识别模式
甚至有一款天朝的智能睡眠眼罩产品,在卖到国外后,被人发现:
应用会将用户的脑电波广播到一个公开的 MQTT 代理,对方通过 Claude Code 逆向了产品的 Flutter APK ,从而破解了数据协议,最终获取到其他人的生理数据信息:
所以可以看到,Bluehood 的实现很直观的展示了你的蓝牙是如何出卖你的信息,这也是为什么这种工具在隐私领域被称为"数字尾气分析"的原因,你并没有主动连接它,但你路过留下的数字痕迹(UUID、信号强度)足以勾勒出你的设备类型和活动规律。
实际上这也是为什么,经常有人说,我什么都没搜没输入,但就也会有一些精准广告上门的原因之一,同时也是,某些地方可能禁止某些设备进去,而当这些设备出现时,会被发现的判断逻辑之一。
