1. 程式人生 > >藍芽協議分析(8)_BLE安全機制之白名單

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

  1. 前言
    在萬物聯網的時代,安全問題將會受到非常嚴峻的挑戰(相應地,也會獲得最大的關注度),因為我們身邊的每一個IOT裝置,都是一個處於封印狀態的天眼,隨時都有被開啟的危險。想想下面的場景吧:

凌晨2點,x米手環的鬧鐘意外啟動,將你從睡夢中驚醒,然後床頭的燈光忽明忽暗……

你的心率、血壓、睡眠質量等資訊,默默地被競爭對手收集著,並通過大資料分析你的情緒、健康等,隨時準備給你致命一擊……

我知道你家裡有幾盞燈、幾臺電器、幾個人,知道你幾點睡覺幾時醒來,知道你一週做過幾頓飯,甚至知道你有一個xx棒、一週使用幾次、每次使用多久……

……

算了,不羅列了,有時間的話可以建個iot eyes的站點,專門收集、整理物聯網安全有關的內容。這裡就先言歸正傳。

經過前面幾篇的藍芽協議分析,我們對藍芽(特別是藍芽低功耗)已經有了一個比較全面的瞭解。隨後幾篇文章,我會focus在BLE的安全機制上。畢竟,知己知彼,才能攻防有度。

話說,藍芽SIG深知物聯網安全的水有多深,因此使用了大量的篇幅,定義BLE安全有關的機制,甚至可以不誇張的說,BLE協議中內容最多、最難理解的部分,非安全機制莫屬。本文先從介紹最簡單的----白名單機制(White list)。

  1. 白名單機制
    白名單(white list)是BLE協議中最簡單、直白的一種安全機制。其原理很簡單,總結如下(前面的分析文章中都有介紹):

所謂的白名單,就是一組藍芽地址;

通過白名單,可以只允許特定的藍芽裝置(白名單中列出的)掃描(Scan)、連線(connect)我們,也可以只掃描、連線特定的藍芽裝置(白名單中列出的)。

例如,如果某個BLE裝置,只需要被受信任的某幾個裝置掃描、連線,我們就可以把這些受信任裝置的藍芽地址加入到該裝置的白名單中,這樣就可以有效避免其它“流氓裝置”的騷擾了。

不過呢,該機制只防君子不防小人,因為它是靠地址去過濾“流氓”的,如果有些資深流氓,偽裝一下,將自己的裝置地址修改為受信任裝置的地址,那就慘了……

  1. 白名單有關的HCI命令
    注1:本文主要從HCI的角度分析、介紹,如非必要,不再會涉及HCI之下的BLE協議(後續的分析文章,也大抵如此)。

3.1 白名單維護相關的命令
BLE協議在HCI層定義了4個和白名單維護有關的命令,分別如下:

1)LE Read White List Size Command,獲取controller可儲存白名單裝置的個數

該命令的格式為:
List item

| 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)      Status
     Address(6 bytes)

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)     Status
     Address(6 bytes)
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引數。

  1. 使用示例
    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,該命令不需要引數,可直接使用,如下:

[email protected]:/ # hcitool lewlsz
hcitool lewlsz
White list size: 26

2)hcitool lewlclr,情況controller的白名單,對應3.1中的LE Clear White List Command,該命令也不需要引數,可直接使用,如下:

[email protected]:/ # hcitool lewlclr
hcitool lewlclr

3)hcitool lewladd,將指定裝置新增到白名單中,對應3.1中的LE Add Device To White List Command,其格式如下:

[email protected]:/ # hcitool lewladd --help
hcitool lewladd --help
Usage:
lewladd [–random]

其中是必選項,為要新增的藍芽裝置的地址。地址有public和random兩種,預設是public,如果需要新增random型別的地址,則要指定–random引數,例如:

[email protected]:/ # hcitool lewladd 22:22:21:CD:F4:58
hcitool lewladd 22:22:21:CD:F4:58

[email protected]:/ # 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,該命令只需要藍芽地址作為引數,如下:

[email protected]:/ # hcitool lewlrm --help
hcitool lewlrm --help
Usage:
lewlrm

5)hcitool lecc,連線BLE裝置的命令,對應3.2中的LE Create Connection Command,可以連線指定地址的裝置,也可以直接連線白名單中的裝置:

[email protected]:/ # hcitool lecc --help
hcitool lecc --help
Usage:
lecc [–random]
lecc --whitelist

一般情況下,我們都是通過hcitool lecc 的方式連線藍芽裝置,不過如果我們需要連線白名單中的裝置,可直接使用如下命令:

hcitool lecc --whitelist

6)hcitool cmd,對於其它沒有直接提供hcitool命令的HCI操作,我們可以使用hcitool cmd直接傳送命令,其使用方法如下:

[email protected]:/ # 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]

  1. 參考文件
    [1] 藍芽協議分析(6)_BLE地址型別

[2] 藍芽協議分析(5)_BLE廣播通訊相關的技術分析

[3] 玩轉BLE(1)_Eddystone beacon

[4] 藍芽協議分析(7)_BLE連線有關的技術分析

[5] Core_v4.2.pdf

轉自:蝸窩科技,www.wowotech.net