Flume水监测器915 MHz安全性非常好
2026年7月28日,Flume水监测器是一种广泛使用的消费设备,能够附着在家庭水表上,并将近实时的使用数据传输到家庭Wi-Fi网络上的桥接设备。接着,桥接设备将数据上传到云端,通过Flume应用程序可访问。水表传感器与桥接之间的链接使用915 MHz频段的射频信号。该链接是加密的,我经过几周的兼职努力,借助Steve Crosby发布的逆向工程工作成功破解了加密。以下是我所做工作的简要总结。\n\n寻找和解调915 MHz频段射频信号\nFCC文件表明该设备采用902.5–927 MHz频段的50频道跳频方案,频道间隔为500 kHz。我将LimeSDR Mini软件定义无线电调谐到该频段的中心(使用20 MHz的显示带宽),然后打开水龙头。短时(~1 ms)信号和~500 kHz带宽一目了然,如下所示。\n\nFlume射频消息的频谱示例(909 MHz中心频率)\n\n经过一些实验,我确定该信号以200 kbps的速率使用2-FSK(频移键控)调制[2],约25字节消息中的一部分通过传感器的RFM69发射芯片中的选项进行了变白。\n\n附注:变白序列文档不足,但我相信它的开头为FF 87 B8 89…(详见[3]以获取完整序列)。消息结构非常简单:我使用生成多项式0x1021(根据芯片文档)验证了循环冗余校验CRC-16值,使用通过穷举搜索确定的初始种子和异或选项。\n\n加密有效载荷呢?\n16字节的有效载荷使用AES-128电子密码本(ECB)模式加密(这是RFM69芯片的另一个选项)。根据Crosby帖子中的原始数据,128位密钥是由8字节密钥通过简单的硬编码映射导出的。虽然64位仍然太大,无法直接暴力破解,但事实证明,无效RF消息头字节的一部分(未加密)提供了密钥的另外16位。这样,搜索空间减少到48位。再加上假设(从Crosby的数据推断)密钥的最后一个字节的一半是已知常量,进一步减少到44位。我通过测试多个消息并寻找一致的低熵明文(或具有高匹配位数的明文)暴力破解了剩余的44个未知位。在一台不错的GPU上的未优化Python脚本大约花费了一天(<$10在云平台上)。\n\n总结\n对于消费级水传感器,结合44位有效加密的跳频波形是一种合理的安全级别。不过,仍有一些风险:了解AES密钥、CRC算法和其他参数后,可以生成欺骗消息。如果支持OTA(空中)更新,可能会启用恶意固件更新(我尚未对此进行调查,也不打算)。我联系了Flume。他们的响应非常及时,CTO分享了他们已在进行中的计划的概述,以进一步改善产品的隐私和安全性。他们现在对发布这篇文章感到满意。\n[1] (https://lithostech.com/2024/12/diving-into-flume-water-monitor/)\n[2] 还观察到其他不同数据速率的信号(例如,在桥接重启时)\n[3] (https://www.nxp.com/docs/en/application-note/AN5070.pdf)
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡