藍牙協議分析(8)_BLE安全機制之白名單


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 
hcitool lewladd 22:22:21:CD:F4:58

root@android:/ # hcitool lewladd --random 11:22:33:44:55:66 
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 cmd 0x08 0x000A 0x00 

# 設置廣播參數和廣播策略 
# Advertising_Interval_Min=0x0800 (1.28 second, default) 
# Advertising_Interval_Max=0x0800 (1.28 second, default) 
# Advertising_Type=0x00(ADV_IND, default) 
# Own_Address_Type=0x00(Public Device Address, default) 
# Peer_Address_Type=0x00(Public Device Address, default) 
# Peer_Address=00 00 00 00 00 00 (no use) 
# Advertising_Channel_Map=0x07(all channels enabled, Default) 
# Advertising_Filter_Policy=0x0(禁用白名單) 
hcitool -i hci0 cmd 0x08 0x0006 0x0800 0x0800 0x00 0x00 0x00 00 00 00 00 00 00 0x07 0x00 

# enable BLE advertising 
hcitool cmd 0x08 0x000A 0x01

# set advertising data to Eddystone UUID(可參考[3]中的介紹) 
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 cmd 0x08 0x000A 0x00 

# 設置廣播參數和廣播策略 
# … 
# Advertising_Filter_Policy=0x2(只允許白名單中的設備連接) 
hcitool -i hci0 cmd 0x08 0x0006 0x0800 0x0800 0x00 0x00 0x00 00 00 00 00 00 00 0x07 0x02 

# 清空白名單 
hcitool lewlclr 

# 隨便加一個地址到白名單 
hcitool lewladd 11:22:33:44:55:66


# enable BLE advertising 
hcitool cmd 0x08 0x000A 0x01

# set advertising data to Eddystone UUID(可參考[3]中的介紹) 
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 cmd 0x08 0x000A 0x00 

# 設置廣播參數和廣播策略 
# … 
# Advertising_Filter_Policy=0x2(只允許白名單中的設備連接) 
hcitool -i hci0 cmd 0x08 0x0006 0x0800 0x0800 0x00 0x00 0x00 00 00 00 00 00 00 0x07 0x02 

# 將B添加到白名單中 
hcitool lewladd [bdaddr of B]


# enable BLE advertising 
hcitool cmd 0x08 0x000A 0x01

# set advertising data to Eddystone UUID(可參考[3]中的介紹) 
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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM