Z-Wave是一种新兴的智能家居技术,里面使用了Z-Way通信协议,这种无线组网规格在欧美已经非常成熟。最近我购置了一块RaZberry板子,开始了我的家具智能化研究之旅。
什么是Z-Way
我之所以选择RaZberry板子,而不是传统的Z-Wave控制器,主要是因为它拥有对树莓派的兼容特性,让我可以通过程式化访问Z-Wave协议和通用输入输出(GPIO)设备,这对于研究我家里面的报警传感器非常有帮助。顺便提一句,Z-Way会提取Z-Wave的特性来设计REST(Representational State Transfer)API,使得该API更加易用。Z-Way项目甚至拥有基础的web界面,包括网关管理界面。
测试过程
在给RaZberry板子安装软件,并连上部分设备后,我开始观察管理设备时产生的web请求包。Z-Way使用了Angular的JS框架开发了一个API,可以应对来自web和安卓app的访问。
以下是一个我开灯的请求:
下面是响应包:
但此时,我发现了一个严重的问题,Angular的API并不需要认证。我在官网找了找,发现有用户提出了这么一个问题(FAQ):
问:HTTP/JSON的API有经过HTTP认证麽?
答:当然没有,你的内网被厂商假定为绝对安全的,自身有着第三方防火墙和密码的保护,不会有外界侵入。如果你想要用密码保护Z-Way,你可以使用ngnix或者其他反向代理服务器做额外的设置。
看来厂商早发现了这个问题,但并没有去亲自解决它。但这也说的过去,使用这些硬件的大多数都是技术极客,普通用户占少数。不过,鄙人仍然觉得这里面潜伏着危机,因为毕竟它给用户带来的是未知的恐惧。
用户的局域网可能会比较安全,但这并不意味着来自远程攻击是不可能实现的。我开始思考从局域网外攻击API接口的方法。突然,我想起了上面的应答包。注意, Z-Way的web服务器默认的CORS(跨域资源共享)头部允许任何origin来源,它会响应一个Access-Control-Allow-Origin: *,即允许所有origin来源,这显而易见将导致跨域攻击。
下面的POC将向你展示,黑客如何用恶意JS代码扫描内网主机,从而实现对Z-Wave的操作。由于这些请求是异步的,受害者并不能意识到正在发生着什么。
首先,脚本循环尝试局域网主机,向API发送POST请求。接着,它会找出返回状态码不为0的主机,确定其存活。如果受害者的控制器设备号小于99,脚本会遍历设备ID号,上限为15,尝试打开灯。这种漏洞的影响,更多地体现在解开门锁、开启车库、以及处理其他敏感设备上。
下面的测试模拟了某主机被黑的场景,返回的响应码为200时就是成功了:
攻击者可以尝试探测更多的默认内网网段,如果受害人的浏览器支持WebRTC,攻击者可以得到更多的信息。在这种情况里,我们可以发出STUN请求,确定受害人的内网IP,从而估算内网范围。
厂商要通过认证加强Razberry的安全不太容易,但用户通过其他设置做到这一点可能并不算难。此外厂商可以做出的另一个改进,则是在CORS策略中需要指定允许的origin,而非来者不拒。Z-Way请求包的这个漏洞很有意思,它揭示了自由CORS实现的风险,并展示了如何攻击他们。