你的蓝牙设备可能正在泄漏你的隐私? Bluehood 如何追踪附近设备并做隐私分析

今天聊点有意思的,之前我们聊过了造假的《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.pybluehood/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、信号强度)足以勾勒出你的设备类型和活动规律。

实际上这也是为什么,经常有人说,我什么都没搜没输入,但就也会有一些精准广告上门的原因之一,同时也是,某些地方可能禁止某些设备进去,而当这些设备出现时,会被发现的判断逻辑之一。

相关推荐
私人珍藏库2 小时前
[Android] 卫星地图 共生地球 v1.1.22
android·app·工具·软件·多功能
取名不易2 小时前
vue-drawer-board 简单的画图功能
前端
学习指针路上的小学渣3 小时前
JavaScript笔记
前端·javascript
取名不易3 小时前
在 nuxtjs中通过fabric.js实现画图功能
前端
冰珊孤雪3 小时前
Android Studio Panda革命性升级:内存诊断、构建标准化与AI调试全解析
android·前端
用户806138166593 小时前
避免滥用“事件总线”
前端
Xiaoke3 小时前
我终于搞懂了 Event Loop(宏任务 / 微任务)
前端
@大迁世界3 小时前
13.在 React 中应怎样正确更新 state?
前端·javascript·react.js·前端框架·ecmascript
终端鹿3 小时前
Suspense 异步组件与懒加载实战
前端·vue.js