如何黑掉Z-Way控制下的智能家居
Z-Wave是一種新興的智能家居技術(shù),里面使用了Z-Way通信協(xié)議,這種無線組網(wǎng)規(guī)格在歐美已經(jīng)非常成熟。最近我購(gòu)置了一塊RaZberry板子,開始了我的家具智能化研究之旅。
什么是Z-Way
我之所以選擇RaZberry板子,而不是傳統(tǒng)的Z-Wave控制器,主要是因?yàn)樗鼡碛袑?duì)樹莓派的兼容特性,讓我可以通過程式化訪問Z-Wave協(xié)議和通用輸入輸出(GPIO)設(shè)備,這對(duì)于研究我家里面的報(bào)警傳感器非常有幫助。順便提一句,Z-Way會(huì)提取Z-Wave的特性來設(shè)計(jì)REST(Representational State Transfer)API,使得該API更加易用。Z-Way項(xiàng)目甚至擁有基礎(chǔ)的web界面,包括網(wǎng)關(guān)管理界面。
測(cè)試過程
在給RaZberry板子安裝軟件,并連上部分設(shè)備后,我開始觀察管理設(shè)備時(shí)產(chǎn)生的web請(qǐng)求包。Z-Way使用了Angular的JS框架開發(fā)了一個(gè)API,可以應(yīng)對(duì)來自web和安卓app的訪問。
以下是一個(gè)我開燈的請(qǐng)求:
下面是響應(yīng)包:
但此時(shí),我發(fā)現(xiàn)了一個(gè)嚴(yán)重的問題,Angular的API并不需要認(rèn)證。我在官網(wǎng)找了找,發(fā)現(xiàn)有用戶提出了這么一個(gè)問題(FAQ):
問:HTTP/JSON的API有經(jīng)過HTTP認(rèn)證麼?
答:當(dāng)然沒有,你的內(nèi)網(wǎng)被廠商假定為絕對(duì)安全的,自身有著第三方防火墻和密碼的保護(hù),不會(huì)有外界侵入。如果你想要用密碼保護(hù)Z-Way,你可以使用ngnix或者其他反向代理服務(wù)器做額外的設(shè)置。
看來廠商早發(fā)現(xiàn)了這個(gè)問題,但并沒有去親自解決它。但這也說的過去,使用這些硬件的大多數(shù)都是技術(shù)極客,普通用戶占少數(shù)。不過,鄙人仍然覺得這里面潛伏著危機(jī),因?yàn)楫吘顾o用戶帶來的是未知的恐懼。
用戶的局域網(wǎng)可能會(huì)比較安全,但這并不意味著來自遠(yuǎn)程攻擊是不可能實(shí)現(xiàn)的。我開始思考從局域網(wǎng)外攻擊API接口的方法。突然,我想起了上面的應(yīng)答包。注意, Z-Way的web服務(wù)器默認(rèn)的CORS(跨域資源共享)頭部允許任何origin來源,它會(huì)響應(yīng)一個(gè)Access-Control-Allow-Origin: *,即允許所有origin來源,這顯而易見將導(dǎo)致跨域攻擊。
下面的POC將向你展示,黑客如何用惡意JS代碼掃描內(nèi)網(wǎng)主機(jī),從而實(shí)現(xiàn)對(duì)Z-Wave的操作。由于這些請(qǐng)求是異步的,受害者并不能意識(shí)到正在發(fā)生著什么。
首先,腳本循環(huán)嘗試局域網(wǎng)主機(jī),向API發(fā)送POST請(qǐng)求。接著,它會(huì)找出返回狀態(tài)碼不為0的主機(jī),確定其存活。如果受害者的控制器設(shè)備號(hào)小于99,腳本會(huì)遍歷設(shè)備ID號(hào),上限為15,嘗試打開燈。這種漏洞的影響,更多地體現(xiàn)在解開門鎖、開啟車庫、以及處理其他敏感設(shè)備上。
下面的測(cè)試模擬了某主機(jī)被黑的場(chǎng)景,返回的響應(yīng)碼為200時(shí)就是成功了:
攻擊者可以嘗試探測(cè)更多的默認(rèn)內(nèi)網(wǎng)網(wǎng)段,如果受害人的瀏覽器支持WebRTC,攻擊者可以得到更多的信息。在這種情況里,我們可以發(fā)出STUN請(qǐng)求,確定受害人的內(nèi)網(wǎng)IP,從而估算內(nèi)網(wǎng)范圍。
廠商要通過認(rèn)證加強(qiáng)Razberry的安全不太容易,但用戶通過其他設(shè)置做到這一點(diǎn)可能并不算難。此外廠商可以做出的另一個(gè)改進(jìn),則是在CORS策略中需要指定允許的origin,而非來者不拒。Z-Way請(qǐng)求包的這個(gè)漏洞很有意思,它揭示了自由CORS實(shí)現(xiàn)的風(fēng)險(xiǎn),并展示了如何攻擊他們。