luochen1990 最近的时间轴更新
luochen1990

luochen1990

V2EX 第 269440 号会员,加入于 2017-11-22 23:37:25 +08:00
luochen1990 最近回复了
2019-12-05 11:00:00 +08:00
回复了 yaaaaaang 创建的主题 问与答 米家智能家居的可行性
emmmm, 感觉楼上并没有人认证回答题主的问题, 我最近正好在研究米家设备的通信协议, 顺便答一下这个题吧.

首先 DDoS 攻击, 这个其实与当前话题关系不大, 咱们暂且不讨论.

题主的核心问题是: 米家智能家居设备有没有安全隐患

我觉得这是个很值得讨论的问题, 我自己在研究通信协议之前, 对这个问题也是比较担忧的.

要回答这个问题, 我先得简单介绍一下米家设备的通信方式:

米家设备的通信网络, 在物理上, 分三种协议: WIFI 网络, Zigbee, 蓝牙

其中 Zigbee 和 蓝牙设备最终都要通过相应的网关连接到 WIFI 网络, 从而跟局域网里的其他 WIFI 设备通信, 所以可以说 WIFI 网络是主干.

所以, 这个过程中, 最关键的, 是米家设备在 WIFI 网络中所使用的 "局域网通信协议", 在 Github 上有一个项目叫 miio 就是实现了这个通信协议, 从而可以直接通过代码跟米家设备通信, 所以想详细了解这个协议的话, 就可以从这个项目入手.

这个局域网通信协议, 是基于 UDP 不可靠传输协议的, 其中的 UDP 包结构网上有[文档]( https://github.com/OpenMiHome/mihome-binary-protocol/blob/master/doc/PROTOCOL.md), 包的 Payload (也就是传输关键数据的部分) 是经过 AES 加密的, 所以对于安全性的分析, 主要就是对这个 AES 加密过程的分析以及其密钥是否安全的分析了.

关于 AES 加密本身的安全性, 咱们不用多虑, 毕竟是一个很成熟使用也很广泛的加密算法了.

那么问题主要就是这个密钥 (token) 的安全性问题.

首先我们要知道, 每个设备的 token 都是不同的, 所以即使一个 token 泄露, 也不会影响另一个设备.

然后我们知道, 设备的 token 都是会随着你的小米账号保存到小米的云端的. 所以理论上如果有小米员工, 能访问线上数据库的话, 是完全可以拿到你家里的设备的 token 的, emmm, 这里我们只能选择相信小米员工不会这么无聊了, 毕竟只要连了公网, 用哪家的设备都会面临同样的信任问题...

另外, 如果有人拿到了你的手机, 并且能解锁手机, 打开米家 App, 那么理论上也是有办法拿到 token 的 (旧版米家 App 是证实了可以拿到的).

所以说到这里的话, 我们就知道, 手机安全, 和小米账号安全, 这两件事就至关重要了, 要是这两个不能保证, 那么小米出再多安全措施也是没用的.

那么一旦设备 token 暴露会怎么样呢? 一般不会怎么样, 因为攻击者要想控制你家里的设备的话, 还得进入你家里的局域网络.

进入你家里的局域网络一般有两种方法, 一种是远程方法, 就是直接控制你家里的某个暴露到互联网的设备, 然后用它来收发 UDP 包, 实现控制.

另一种是本地方法, 就是先通过其他渠道获取你家的物理位置 (这个还是比较值得担忧的, 因为你的物理位置可能早就通过各种方式 -- 比如手机定位 -- 暴露了), 然后到你家附近, 连你家的 WIFI, 如果你家的 WIFI 密码刚好比较弱, 或者曾经告诉过某个手机安装过 WIFI 万能钥匙的亲戚 (听起来还是非常有可能的), 那么入侵者就很容易进入你家的局域网.

一旦有人持有你家里所有设备的 token, 并且成功进入你家里的局域网, 那么所有设备就沦陷了...

当然这时候也有补救办法, 只要发现时快速改掉局域网 WIFI 密码, 并且拔掉外网的网线, 就可以中断对方的控制. 之后慢慢重置家里的每一个设备, 或者更快的方法是改 WIFI 名称 (SSID), 重置后或 WIFI 变更后, 设备都会重新生成 token.

总得来说, 米家设备的安全公式:

米家设备不安全 = (小米账号不安全 | 手机不安全) * ((WIFI 不安全 * 物理位置泄露) | 公网设备不安全)

所以, 米家设备 (或者说任何品牌的智能家居设备) 安不安全, 这个答案对每个人来说都不同, 要得到答案, 就要检查上述公式里的每一项安全不安全, 对于一个啥安全都不注意的小白来说, 那用啥系统都必然是不安全的.
2019-12-05 10:04:54 +08:00
回复了 zcbenz 创建的主题 智能家电 米家传感器的反应时间?
根据相关文档, 门窗传感器的工作逻辑是, 每动作一次, 会向网关上报一次状态, 这个延迟是 zigbee 协议的延迟, 应该是毫秒级别的, 当然不排除信号不好的时候需要重试导致延迟增加的情况.


```
米家窗磁传感器(~60 分钟每次):
窗磁传感器贴在窗户上或门上感知窗户的状态,每动作一次发送一次 report。

属性 说明
status open/close/unknown (开 /关 /未知)
voltage 纽扣式电池电压值,单位 mv,范围 0~3300mv,一般情况下,小于 2800mv 时表示低电量
属性上报:
{"cmd":"report","model":"magnet","sid":"89234324","short_id":4343,"data":"{\"status\":\"open\"}" }

心跳上报:
{"cmd":"report","model":"motion","sid":"89234324","short_id":4345,"data":"{\"voltage\":3000}" }

magnet 代码是窗磁,89234324 代表的设备的 ID ( 64 位的长 16 进制字符串),status 是窗磁的开关状态。
```

需要原始文档可以搜索 "绿米网关局域网通讯协议", 里面能查到各种 zigbee 设备的工作逻辑.
找到[一个现成的 lua 插件]( https://github.com/nickw444/miio-go/blob/master/tools/wireshark/miio.lua), 亲测可用, 但是呢, 这个插件不支持根据 token 解密 payload 的功能, 所以仍然解决不了问题... 期待大神来把这个坑填上 :)
@GuryYu 嗯, 知道有 HA, 不过还没试用过, 我主要是想自己写应用层代码, 不想受平台开放能力的束缚, 所以想直接把协议层搞清楚. 不知道 HA 的灵活性怎么样, 支不支持自己写代码逻辑?
@5G 方便抓包过程, 以便能更低成本地适配 miio 库尚不支持的新设备咯
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2861 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 14:29 · PVG 22:29 · LAX 07:29 · JFK 10:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.