幾個星期前,Youtube上名為JerryRigEverything的人上傳了一段針對 Tapplock 智慧藍牙指紋掛鎖的拆解影片。影片顯示,只要用GoPro相機固定黏附底座就可以把 Tapplock 後蓋取下,然後再利用螺絲起子就能把 Tapplock 的鎖扣輕鬆打開。
有點不可思議,這段影片引發了我對Tapplock 智慧掛鎖的安全性好奇,這款具備指紋辨識、手機藍牙和莫爾斯碼解鎖的智慧掛鎖,在方便的同時,它安全性如何呢?由此我對 Tapplock 進行了一番研究,最終我實現了2秒內對Tapplock的解鎖。
Tapplock智慧掛鎖由淬火鋼和耐用壓鑄的Zamak-3鋅合金打造而成。 Zamak-3鋅合金常用於兒童玩具、門把手、男士刮鬍刀等壓鑄產品,嚴格來說,這種金屬材質強度不高,且在400℃以下就能熔化變形,對於結實的鎖體來說,這不是一個好的材質選擇。 Zamak-3便於製作一些外觀精緻且感覺牢固的精細鑄件,也僅只是看著安全牢固而已。
Tapplock智慧掛鎖選用了 AES 128位元的加密演算法,加密強度算是很高的了。
這種加密強度與軍用等級相當,但於對IoT 駭客來說,這種對稱加密還是存在著一些缺點,尤其在這裡的Tapplock使用說明中,完全沒有金鑰配對、交換和分享的規定,甚至在安全性說明中連基本的身份認證都沒有。所以,類似這種應用場景中,AES-128加密仍有不足。
此外,針對Tapplock掛鎖的安全性,也有諸多爭議,就比如這裡的“牢不可破的Tapplock沒那麼安全可靠”,文章中羅列了很多針對Tapplock 軟硬體的安全測試,最終發現Tapplock並不那麼安全。
Tapplock官方宣稱自己的掛鎖 “非常強悍”,但實際在Abloy Protec門鎖面前,估計就沒法比了。 Tapplock官方也宣稱自己的掛鎖 "幾乎牢不可破",但最終卻被一把4吋的螺栓切割器瓦解。看來,一切都是的吹噓的行銷策略。
以上各路安全測試也激起了我的好奇心,那就買一把Tapplock智能掛鎖來實際測測吧,80歐元的價格付款,14小時之後,一款Tapplock智慧掛鎖就送到我家了。首先,我先按照 JerryRigEverything 的方法,用一個GoPro相機黏附底座黏住了 Tapplock 後蓋。
經過30分鐘的充分黏合後,用力拉黏附底座,可惜怎麼也弄不開Tapplock後蓋。原來,後蓋內還有一個伸到後蓋項部的彈簧梢,是專門為了防止後蓋的鬆脫或轉動而設計的。這個彈簧梢有可能被破壞,但是只靠一個相機黏附底座可能是不行的。但JerryRigEverything 的Tapplock測試用鎖,沒有這個伸出的彈簧梢,但我們購買的Tapplock測試用鎖是有這個彈簧梢的,所以,我們使勁拉住相機粘附底座最後也沒能按JerryRigEverything的方法打開Tapplock後蓋。
現在,我們轉向低功耗藍牙(BLE)進行測試,意外的是,我們透過這裡發現了一些不可思議的事。一般來說,我喜歡閱讀一些費時且深入有創意的 IoT 破解文章,但這裡我們就不繞了,直奔主題吧。在不到45分鐘的時間裡,我們需要完成 Tapplock 的破解解鎖。
首先,我們發現,Tapplock 手機APP的HTTP通訊中,竟然沒有傳輸加密機制,這是2018年啊,又不是古時候,完全令人吃驚。
從上述網路分析可以看到,當我每次用BLE連接Tapplock 時,就會有一個「隨機」 字串被傳送給Tapplock端,這些字串貌似是與Tapplock進行交流的命令。
但也值得注意的是,無論我執行多少次對 Tapplock 的連線請求,這些字串資料都是不變的。從以下藍牙利用工具gatttool的命令列執行中可以看到,Tapplock 也容易受到重播攻擊。
由於 Tapplock 手機APP允許使用者與其它人共用Tapplock掛鎖,或在某個期限內撤銷使用權許可。由此,我把該測試用鎖與其他用戶進行了共享,然後抓取其中的BLE通信數據發現,這種用戶間共享Tapplock的做法,完全與正常單一用戶對Tapplock的控制一樣,也就是,即使你撤銷了其他共享用戶的解鎖權限,但其他用戶一樣可以在此之前,可以通過通信數據抓包方式獲取到解鎖認證的所有信息,利用該信息可以實現對Tapplock的認證解鎖,和單一控制用戶沒啥區別。這就有點像智慧門鈴 Ring Smart Doorbell 的問題一樣,不可能撤銷另一個具備高解鎖權限的使用者。
Tapplock 智慧掛鎖沒有配備應有的出廠重置機制,使用帳號只能刪除其對應的掛鎖訊息,而無法刪除對應的解鎖資料。留存的解鎖數據是發送到服務端或是從服務端發送給Tapplock的,因此,處於網路中適當位置的攻擊者可以攔截這些解鎖數據,利用這些數據間接實現Tapplock開鎖。
這可不是小問題,廢話少說,能開鎖才是重點,現在我們需要來分析一下那些隨機資料是如何實現開鎖的。
經過幾分鐘的研究分析,我發現了與Tapplock掛鎖開鎖過程配對的具體函數方法:
public void regularPair(String str, byte[] bArr, byte[] bArr2) { bArr = getCMD(CMD_PAIRING_REGULAR, bArr, bArr2); send(str, bArr); str = TAG; bArr2 = new StringBuilder(); bArr2.append("Regular pair called, send "); bArr2.append(BluetoothTool.byteToStr(bArr)); Log.e(str, bArr2.toString()); }
該方法中向Tapplock掛鎖發送了包含兩個雙位元組數組的固定命令CMD_PAIRING_REGULAR。這兩個雙位元組數組會讀取以下對應資訊:
this.bluetoothCenterManager.regularPair(lockMacAddress, BluetoothTool.strToBytes(lockInfo.getKey1()), BluetoothTool.strToBytes(lockInfo.getSerialNo( )));
有效資訊也就是Key1 和SerialNo,它們又是從哪裡發送來的呢?原來當鎖發生初始配對時,以上資訊經keyAndSerialNo方法,間接轉換為Tapplock掛鎖的藍牙MAC位址。 keyAndSerialNo方法如下:
public static String keyAndSerialNo(String str, String str2) { str = AndroidTool.md5(str.toUpperCase()).toUpperCase(); if (str2.equals(KEY_ONE) { str = str.substring(0, 8); } else if (str2.equals(KEY_TWO) { str = str.substring(8, 16); } else if (str2.equals(SERIAL_NO) { str = str.substring(16, 24); } return str; }
這裡,它會把Tapplock掛鎖的藍牙MAC位址大寫,然後把它轉換為一個MD5雜湊值,其中0到7個字元為key1,16到23個位元組為SerialNo序號。
是的,解鎖Tapplock唯一要知道的就是Tapplock的藍牙MAC位址,而這個MAC位址卻是Tapplock廣播出來的。我直接被這種糟糕的安全性震驚了,於是乎,我又重新訂購了一個Tapplock,並確認了Tapplock掛鎖和其APP的真實性。
最後,我寫了一個攻擊腳本來掃描Tapplock掛鎖並能實現解鎖,用該腳本可以不到2秒的時間就能解鎖任何一款Tapplock,完全不需要任何高深的知識和技巧。後期,我會將該腳本移植到一個Android應用程式中,使整個解鎖操作更方便快速。整體來說,實現對Tapplock掛鎖的開鎖成本非常低。 Tapplock智慧掛鎖的這種安全性讓人汗顏,這種做法算是對消費者的不尊重,我也是無言了。
Tapplock聲稱具備防墊片功能,它在鎖栓中採用了傳統的做法,也就是在鎖扣中延伸出了另外一級咬合口,這樣能避免攻擊者用墊片開啟閂鎖。但是Tapplock的咬合口相對比較細薄,且離壓力的接合點有些遠。
另外,用12吋的螺栓切割器,不到10秒就能把Tapplock鎖栓搞定:
作為一款智慧掛鎖,Tapplock 的安全機制其實非常明確,那就是避免攻擊者開鎖。而鎖的安全程度取決於其自身的威脅模型設計,正確的安全設計多少能減緩攻擊者對鎖的攻擊過程,而且不會出現可被利用的安全紕漏。而身為 IoT 時代的智慧掛鎖,Tapplock的安全性簡直堪憂,不出2秒鐘就能被開鎖搞定。但當我把這個問題回饋給Tapplock官方之後,它們竟然回覆我:
「Thanks for your note. We are well aware of these notes.」
#謝謝你的上報提醒,我們已經知道這些問題了。
啊,原來Tapplock官方在知道這些問題的同時,不但不修復,而且還繼續售賣這些鎖具,也不讓消費者知曉。這完全有些讓我震驚。
以上是怎麼利用藍牙功能兩秒內攻擊解鎖Tapplock智慧掛鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!