本文翻译自 Building Bluehood: What Your Bluetooth Is Broadcasting,原载于 Hacker News。
背景
如果你经常阅读技术博客,可能对隐私话题不陌生。无论是通过 Tor 运行博客、使用 AdGuard 全网拦截广告,还是用 Proton Pass 保护 dotfiles 中的敏感信息,我一直在思考自己暴露了什么数据、暴露给了谁。
上周末我构建了 Bluehood,一个追踪附近设备并分析其出现模式的蓝牙扫描器。这个项目很大程度上由 AI 辅助完成,但动机完全是人类的:我想理解仅仅因为开启蓝牙,我泄露了什么信息。
时机恰好。几天前,KU Leuven 的研究人员披露了 WhisperPair(CVE-2025-36911),一个影响数亿蓝牙音频设备的严重漏洞。这个缺陷允许攻击者远程劫持耳机和耳塞、窃听对话,并通过 Google 的 Find Hub 网络追踪位置。这是一个严峻的提醒:蓝牙并非我们想象中那样隐形、无害的信号。
无人谈论的问题
我们已经习惯了蓝牙总是开启的状态。手机、笔记本电脑、智能手表、耳机、汽车,甚至医疗设备都在不断广播它们的存在。对隐私担忧的标准回应通常是”没什么可隐瞒的,就没什么可怕的”。
但问题是:即使你没什么可隐瞒的,你仍然在泄露你可能不想泄露的信息。
从我的家庭办公室运行 Bluehood(被动模式,只监听,从不连接),我可以检测到:
- 快递车辆何时到达,以及每次是否是同一位司机
- 邻居基于手机和可穿戴设备的日常模式
- 哪些设备经常一起出现(例如某人的手机和智能手表)
- 特定人员在家、在工作或在外地的确切时间
这一切都不需要任何特殊设备。一台带蓝牙适配器的 Raspberry Pi 就够了。大多数笔记本电脑也可以。
你无法控制的设备
最让我担忧的不是人们选择开启蓝牙。而是许多设备根本不给用户禁用的选项。
助听器就是一个好例子。现代助听器通常使用蓝牙低功耗(BLE),以便听力学家可以连接并调整设置或运行诊断。起搏器和其他植入式医疗设备有时也会出于同样的原因广播 BLE 信号。用户无法简单地关闭它。
然后是车辆。快递货车、警车、救护车、物流车队和火车通常有用于车队管理、诊断或驾驶辅助的蓝牙系统。这些系统持续广播,司机对此无能为力。
即使是消费设备也不总是那么简单。许多智能手表需要蓝牙才能正常工作。宠物 GPS 项圈需要它与主人的手机通信。一些健身设备没有它就无法工作。
需要你广播的隐私工具
有趣的是,一些最注重隐私的项目实际上需要开启蓝牙。
Briar 是一个为在敌对环境中活动的活动家和记者设计的点对点消息应用。它不依赖中央服务器,当互联网断开时,可以通过蓝牙或 Wi-Fi mesh 网络同步消息。这是一个在互联网中断或监控严重的地区维持通信的真正有用的工具。
BitChat 更进一步。它是一个完全通过蓝牙 mesh 网络运行的去中心化消息应用——不需要互联网,不需要服务器,不需要电话号码。每个设备同时充当客户端和中继,自动发现对等设备并通过多跳传递消息以扩展网络覆盖范围。该项目明确针对抗议、自然灾害和连接受限或审查严格的地区等场景。
两者都是解决真正问题的优秀项目。但要使用它们,你需要开启蓝牙。而每个开启蓝牙的设备都在向附近任何愿意倾听的人广播它的存在。
这造成了一种奇怪的张力。旨在保护隐私的工具往往需要一个在其他方面损害隐私的功能。
模式泄露的信息
人们经常低估模式能揭示什么。一个持有蓝牙扫描器的恶意行为者不需要知道你的名字。他们只需要随时间观察行为。
考虑一下有人在住宅区监控蓝牙信号几周能学到什么:
- 房子通常什么时候是空的?
- 是否有人每周四下午来访?
- 是否有规律性的模式暗示轮班工作?
- 孩子们什么时候放学回家?
- 哪些家庭有相同的快递司机,暗示相似的购物习惯?
如果你的财产受到损害,你可能可以回溯日志,看看当时哪些设备在范围内。遛狗者手腕上的智能手表。某人口袋里的手机。带有车队追踪的车辆。
这些可能看起来像是边缘情况,但它们说明了一个更广泛的观点:我们不断留下我们甚至没有考虑过的数字面包屑。
Bluehood 实际做什么
Bluehood 是一个 Python 应用程序,可以在任何带有蓝牙适配器的设备上运行。它持续扫描附近的设备,通过供应商和 BLE 服务 UUID 识别它们,并追踪它们何时出现和消失。
主要功能:
- 被动扫描:只监听,不尝试连接或与任何设备交互
- 设备分类:通过 BLE 指纹识别手机、音频设备、可穿戴设备、车辆、IoT 设备等
- 模式分析:小时和日热力图、停留时间追踪、检测相关设备
- 过滤:检测并从主视图中隐藏随机化 MAC 地址(现代手机用于隐私保护)
- Web 仪表板:用于监控和分析的简单界面
你可以用 Docker 运行,也可以直接安装。它将数据存储在 SQLite 中,并可选通过 ntfy.sh 在监控设备到达或离开时发送推送通知。
运行方式
尝试 Bluehood 最简单的方式是使用 Docker:
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
docker compose up -d
仪表板可在 http://localhost:8080 访问。
如果你更喜欢手动安装:
# Arch Linux
sudo pacman -S bluez bluez-utils python-pip
# Debian/Ubuntu
sudo apt install bluez python3-pip
pip install -e .
sudo bluehood
蓝牙扫描需要提升的权限。你可以以 root 运行、授予 Python 能力,或使用包含的 systemd 服务进行常驻监控。
这一切的意义
Bluehood 不是黑客工具。它是一个教育性演示,展示了用普通硬件和一点耐心可以实现什么。
我构建它是因为我想亲眼看看我在广播什么。结果令人警醒。即使没有恶意意图,任何具有基本技术知识的人都可以通过坐在车里运行脚本来了解我家庭的很多信息。
这不是关于偏执。这是关于理解我们在设备上开启无线 radio 时所做的权衡。对于某些用例,蓝牙是必不可少的。对于其他用例,它只是便利。意识到你在暴露什么是第一步,让你能够就你的设备属于哪一类做出明智的决定。
如果你尝试 Bluehood 并让你重新思考自己的蓝牙习惯,它就完成了它的使命。
源代码可在 GitHub 获取。欢迎反馈和贡献。
总结
这篇文章让我意识到几个关键点:
-
蓝牙泄露的信息比想象的多:不仅仅是设备名称,还有出现模式、与其他设备的关联性、日常作息等。这些”元数据”本身就很有价值。
-
被动扫描的威胁:不需要连接,只需要监听。这意味着攻击者可以完全隐蔽地收集信息,受害者不会有任何察觉。
-
无法选择的广播:助听器、起搏器、车队车辆——这些设备的蓝牙无法关闭,用户对此无能为力。这是一个系统性的隐私问题。
-
隐私工具的悖论:像 Briar 和 BitChat 这样的隐私保护工具需要蓝牙才能工作,这创造了一个奇怪的张力:为了保护通信隐私,你必须牺牲位置隐私。
-
自己动手验证:作者没有停留在理论担忧上,而是构建了工具来实际验证。这种”Show, don’t tell”的方式非常有说服力。
对于关心隐私的开发者,可以考虑:在不使用蓝牙时关闭它,支持随机化 MAC 地址的设备,或者——运行 Bluehood 看看你自己到底在广播什么。