Synth Daily

我的智能睡眠眼罩把用户脑电波广播到公开的 MQTT broker 上

一款具备脑电波读取和电刺激功能的智能睡眠眼罩,因其使用了共享的硬编码凭证连接到云端 MQTT 服务器,存在严重的安全漏洞。用户通过逆向工程发现,任何人都可以利用这些凭证访问全球所有该品牌设备的实时脑电波数据,甚至能远程向睡眠中的佩戴者发送电刺激。这一发现暴露了物联网设备在数字隐私和安全方面的重大隐患。

我本没想过自己最终能读取陌生人的脑电波,并在他们睡着时向他们发送电脉冲。但事情就这么发生了。

初步尝试:蓝牙协议

最初的尝试是通过蓝牙低功耗(BLE)直接与设备通信。虽然成功识别了设备并映射出两个数据通道(一个用于发送命令,一个用于传输数据),但由于协议非标准,直接发送各种通用命令模式(如 Modbus、JSON)均未得到任何响应。直接破解蓝牙协议的路径就此失败。

关键突破:反编译应用程序

由于直接与设备通信无果,注意力转向了其配套的安卓应用(APK 文件)。

  • 发现技术栈: 使用 jadx 工具反编译后,发现该应用是使用 Flutter 构建的。Flutter 会将代码编译为原生机器码,这使得逆向工程比普通 Java 应用更困难。
  • 寻找线索: 尽管代码被编译,但二进制文件中依然保留了字符串信息,如错误消息、URL 和调试日志。通过分析这些字符串,获得了决定性的线索。
  • 重大发现: 在大量的 Flutter 框架信息中,发现了以下关键内容:
    • 硬编码的凭证,用于连接公司的消息服务器(MQTT),且所有应用副本共享。
    • 云端 API 的地址。
    • 所有十五个命令的构建函数名称,例如设置震动、加热和电刺激等。
    • 揭示数据包结构的调试信息,包括头部、方向字节、命令类型、有效载荷和尾部。

虽然掌握了协议的结构,但具体的命令字节值仍然未知。通过使用一个专门反编译 Flutter 应用的工具 blutter,成功重构了函数并直接读出了每个命令对应的字节码。

成功控制

在完全映射了十五个命令后,向设备发送一个简单的查询数据包,设备立即返回了 153 字节的数据,其中包含:

  • 型号、固件版本、序列号
  • 所有八个传感器通道的配置(如 250Hz 的脑电波、呼吸、三轴加速度计等)
  • 电池电量为 83%

至此,所有功能,包括震动、加热、电刺激和音乐,都可以通过一个自制的网页控制面板进行控制。

真正的隐患:共享服务器

之前在应用中发现的 硬编码凭证 引发了更大的担忧。尝试使用这些凭证连接到公司的 MQTT 消息服务器后,连接成功了。

MQTT 是一种在物联网设备中广泛使用的发布/订阅消息系统。设备会向服务器“发布”传感器读数,并“订阅”来自服务器的命令。

连接后,收到的不仅仅是自己设备的数据,而是当时在线的 所有约 25 台设备 的数据流:

  • 正在发布 实时脑电波数据 的睡眠眼罩。
  • 报告温度、湿度和二氧化碳的空气质量监测器。
  • 检测房间是否有人在的传感器。

通过捕获的数据,可以清晰地看到一个用户正处于快速眼动睡眠(REM)阶段,而另一个则处于深度慢波睡眠阶段。这些都是来自世界某个角落的真实用户的真实脑电波。

最危险的功能:远程电刺激

由于所有设备共享相同的凭证和服务器,这意味着:如果你能读取某人的脑电波,你就能向他们发送电刺激。控制电刺激功能只需要一个简单的命令,指定模式、频率、强度和持续时间即可。这个安全漏洞使得恶意行为者可以远程干扰甚至伤害正在使用该设备的睡眠者

目前,发现此问题的用户已联系厂家通报这一严重安全问题,但并未公开公司或产品名称。这一事件也警示我们,需要重新审视个人在数字时代的隐私和安全策略。