1. 前言
在萬物聯網的時代,安全問題將會受到非常嚴峻的挑戰(相應地,也會獲得最大的關注度),因為我們身邊的每一個IOT設備,都是一個處於封印狀態的天眼,隨時都有被開啟的危險。想想下面的場景吧:
凌晨2點,x米手環的鬧鍾意外啟動,將你從睡夢中驚醒,然后床頭的燈光忽明忽暗…… 你的心率、血壓、睡眠質量等信息,默默地被競爭對手收集着,並通過大數據分析你的情緒、健康等,隨時准備給你致命一擊…… 我知道你家里有幾盞燈、幾台電器、幾個人,知道你幾點睡覺幾時醒來,知道你一周做過幾頓飯,甚至知道你有一個xx棒、一周使用幾次、每次使用多久…… …… |
算了,不羅列了,有時間的話可以建個iot eyes的站點,專門收集、整理物聯網安全有關的內容。這里就先言歸正傳。
經過前面幾篇的藍牙協議分析,我們對藍牙(特別是藍牙低功耗)已經有了一個比較全面的了解。隨后幾篇文章,我會focus在BLE的安全機制上。畢竟,知己知彼,才能攻防有度。
話說,藍牙SIG深知物聯網安全的水有多深,因此使用了大量的篇幅,定義BLE安全有關的機制,甚至可以不誇張的說,BLE協議中內容最多、最難理解的部分,非安全機制莫屬。本文先從介紹最簡單的----白名單機制(White list)。
2. 白名單機制
白名單(white list)是BLE協議中最簡單、直白的一種安全機制。其原理很簡單,總結如下(前面的分析文章中都有介紹):
所謂的白名單,就是一組藍牙地址; 通過白名單,可以只允許特定的藍牙設備(白名單中列出的)掃描(Scan)、連接(connect)我們,也可以只掃描、連接特定的藍牙設備(白名單中列出的)。 |
例如,如果某個BLE設備,只需要被受信任的某幾個設備掃描、連接,我們就可以把這些受信任設備的藍牙地址加入到該設備的白名單中,這樣就可以有效避免其它“流氓設備”的騷擾了。
不過呢,該機制只防君子不防小人,因為它是靠地址去過濾“流氓”的,如果有些資深流氓,偽裝一下,將自己的設備地址修改為受信任設備的地址,那就慘了……
3. 白名單有關的HCI命令
注1:本文主要從HCI的角度分析、介紹,如非必要,不再會涉及HCI之下的BLE協議(后續的分析文章,也大抵如此)。
3.1 白名單維護相關的命令
BLE協議在HCI層定義了4個和白名單維護有關的命令,分別如下:
1)LE Read White List Size Command,獲取controller可保存白名單設備的個數
該命令的格式為:
OCF | Command parameters | Return Parameters |
0x000F | Status White_List_Size |
Status,命令執行的結果,0為success。 White_List_Size,size,范圍是1~255。 |
注2:由此可知,白名單是保存在controller中,由於size的范圍是1~255,因此controller必須實現白名單功能(最少保存一個)。
2)LE Clear White List Command,將controller中的白名單清空
該命令的格式為:
OCF | Command parameters | Return Parameters |
0x0010 | Status |
Status,命令執行的結果,0為success。 |
3)LE Add Device To White List Command,將指定的設備添加到白名單
該命令的格式為:
OCF | Command parameters | Return Parameters |
0x0011 | Address_type(1 byte) Address(6 bytes) | Status |
Address_type,設備的地址類型[1],0為Public Device Address,1為Random Device Address。 Address,設備的地址。 Status,命令執行的結果,0為success。 |
4)LE Remove Device From White List Command,將指定的設備從白名單中移除的命令
該命令的格式為:
OCF | Command parameters | Return Parameters |
0x0012 | Address_type(1 byte) Address(6 bytes) | Status |
Address_type,設備的地址類型[1],0為Public Device Address,1為Random Device Address。 Address,設備的地址。 Status,命令執行的結果,0為success。 |
最后需要說明的是,當controller處於以下三個狀態的時候,以上命令除“LE Read Resolving List Size Command”外,均不能執行:
正在advertising; 正在scanning; 正在connecting。 |
3.2 白名單使用策略有關的命令
BLE設備在發起Advertising、Scanning或者Connecting操作的時候,可以通過Set Advertising Parameters、Set Scan Parameters或者LE Create Connection Command,設置Advertising、Scanning或者Connecting的過濾策略(Filter_Policy),具體如下:
1)Advertising時的白名單策略
LE Set Advertising Parameters Command的命令格式為:
OCF | Command parameters | Return Parameters |
0x0006 | … Advertising_Filter_Policy(1 byte) | Status |
該命令的其它參數請參考[2],Advertising_Filter_Policy的含義如下:
0x00,禁用白名單機制,允許任何設備連接和掃描。 0x01,允許任何設備連接,但只允許白名單中的設備掃描(scan data中有敏感信息?)。 0x02,允許任何設備掃描,但只允許白名單中的設備連接。 0x03,只允許白名單中的設備掃描和連接。 |
2)Scanning時的白名單策略
LE Set Scan Parameters Command的命令格式為:
OCF | Command parameters | Return Parameters |
0x000B | … Scanning_Filter_Policy(1 byte) | Status |
該命令的其它參數請參考[2],Scanning_Filter_Policy的含義如下:
0x00,禁用白名單機制,接受所有的廣播包(除了那些不是給我的directed advertising packets)。 0x01,只接受在白名單中的那些設備發送的廣播包(除了那些不是給我的directed advertising packets)。 0x02,和白名單無關,不再介紹。 0x03,接受如下的廣播包:在白名單中的那些設備發送的廣播包;廣播者地址為resolvable private address的directed advertising packets;給我的給我的directed advertising packets。 |
注3:Scanning時的白名單策略有點奇怪,既然是主動發起的,要白名單的意義就不大了吧?
3)Connecting時的白名單策略
LE Create Connection Command的命令格式為:
OCF | Command parameters | Return Parameters |
0x000D | … Initiator_Filter_Policy(1 byte) … | Status |
該命令的其它參數請參考[4],Initiator_Filter_Policy的含義如下:
0x00,禁用白名單機制,使用Peer_Address_Type and Peer_Address指定需要連接的設備。 0x01,連接那些在白名單中的設備,不需要提供Peer_Address_Type and Peer_Address參數。 |
4. 使用示例
4.1 准備工作
后續的測試需要用到如下的設備和軟件:
1)藍牙設備A,作為Advertiser,發送廣播數據,接受連接。
2)藍牙設備B,作為Scanner,掃描設備A的廣播數據,發起連接。
上述的1)和2)可以是如下一種:
一個具有bluez(hcitool等工具)的Android手機,可能需要較舊的android版本才行; 帶有藍牙功能的樹莓派,允許Debian、Ubuntu等系統(只要不是Android就行); Linux PC(或者虛擬機)加上一個具有BLE功能的藍牙適配器。 |
3)bluez工具集,我們需要使用其中的hcitool命令。
4.2 相關的hcitool命令說明
hcitool中的一些命令,和白名單機制有關,總結如下。
1)hcitool lewlsz,獲取controller白名單的size,對應3.1中的LE Read White List Size Command,該命令不需要參數,可直接使用,如下:
root@android:/ # hcitool lewlsz hcitool lewlsz White list size: 26 |
2)hcitool lewlclr,情況controller的白名單,對應3.1中的LE Clear White List Command,該命令也不需要參數,可直接使用,如下:
root@android:/ # hcitool lewlclr hcitool lewlclr |
3)hcitool lewladd,將指定設備添加到白名單中,對應3.1中的LE Add Device To White List Command,其格式如下:
root@android:/ # hcitool lewladd --help hcitool lewladd --help Usage: lewladd [--random] |
其中是必選項,為要添加的藍牙設備的地址。地址有public和random兩種,默認是public,如果需要添加random類型的地址,則要指定--random參數,例如:
root@android:/ # hcitool lewladd 22:22:21:CD:F4:58 root@android:/ # hcitool lewladd --random 11:22:33:44:55:66 |
4)hcitool lewlrm,將指定設備從白名單中移除,對應3.1中的LE Remove Device From White List Command,該命令只需要藍牙地址作為參數,如下:
root@android:/ # hcitool lewlrm --help hcitool lewlrm --help Usage: lewlrm |
5)hcitool lecc,連接BLE設備的命令,對應3.2中的LE Create Connection Command,可以連接指定地址的設備,也可以直接連接白名單中的設備:
root@android:/ # hcitool lecc --help hcitool lecc --help Usage: lecc [--random] lecc --whitelist |
一般情況下,我們都是通過hcitool lecc 的方式連接藍牙設備,不過如果我們需要連接白名單中的設備,可直接使用如下命令:
hcitool lecc --whitelist |
6)hcitool cmd,對於其它沒有直接提供hcitool命令的HCI操作,我們可以使用hcitool cmd直接發送命令,其使用方法如下:
root@android:/ # hcitool cmd --help hcitool cmd --help Usage: cmd [parameters] Example: cmd 0x03 0x0013 0xAA 0x0000BBCC 0xDDEE 0xFF |
其中ogf、ocf和parameters可以去藍牙spec的“HCI COMMANDS AND EVENTS”章節查詢。需要注意的是,parameters可以使用各種類型(8位、16位、32位),還是很方便的。
4.3 測試步驟
這里僅僅羅列一個簡單的測試,步驟包括:
1)設備A作為Advertising設備,不使用白名單,發送正常的ADV_IND(可連接、可掃描)廣播包。 2)設備B掃描並連接設備A(應該可以正常連接)。 3)設備A作為Advertising設備,啟用白名單,設置Advertising_Filter_Policy為0x2(只允許白名單中的設備連接),且沒有把B的地址添加到白名單中。 4)設備B掃描並連接設備A(應該不可以正常連接)。 5)設備A把設備B添加到白名單中,其它策略保持不變。 6)設備B掃描並連接設備A(應該可以正常連接)。 |
詳細步驟如下(我沒有測試,有問題的請大家留言告訴我):
1)設備A作為Advertising設備,不使用白名單,發送正常的ADV_IND(可連接、可掃描)廣播包。
# disable BLE advertising hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00 |
2)設備B掃描並連接設備A(應該可以正常連接)。
hcitool lescan hcitool lecc [bdaddr of A] |
3)設備A作為Advertising設備,啟用白名單,設置Advertising_Filter_Policy為0x2(只允許白名單中的設備連接),且沒有把B的地址添加到白名單中。
# disable BLE advertising hcitool lewlclr # 隨便加一個地址到白名單 hcitool lewladd 11:22:33:44:55:66
hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00 |
4)設備B掃描並連接設備A(應該不可以正常連接)。
hcitool lescan hcitool lecc [bdaddr of A] |
5)設備A把設備B添加到白名單中,其它策略保持不變。
# disable BLE advertising hcitool lewladd [bdaddr of B]
hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00 |
6)設備B掃描並連接設備A(應該可以正常連接)。
hcitool lescan hcitool lecc [bdaddr of A] |
5. 參考文檔
[1] 藍牙協議分析(6)_BLE地址類型
[2] 藍牙協議分析(5)_BLE廣播通信相關的技術分析
[3] 玩轉BLE(1)_Eddystone beacon
[4] 藍牙協議分析(7)_BLE連接有關的技術分析
[5] Core_v4.2.pdf
原創文章,轉發請注明出處。蝸窩科技,www.wowotech.net。