低功耗蓝牙(BLE)安全初探

BLE概述

“蓝牙”,即Bluetooth,是斯堪的纳维亚语中 Blåtand / Blåtann 的英化版本。该词是十世纪的一位国王Harald Bluetooth的绰号,相传他将纷争不断的丹麦部落统一为一个王国,并引入了基督教。蓝牙技术开发者Jim Kardach于1997年提出用Bluetooth这个名词,据说他当时正在读一本名为The Long Ships的小说,讲述的就是维京人和Harald Bluetooth国王的故事。他认为蓝牙可以把各种不同的通信协议统一在一起,诚如这位国王做的事情一样。至于蓝牙的logo,取自国王Harald Bluetooth名字中的【H】和【B】两个字母的组合,用古北欧文字来表示:
蓝牙起源蓝牙技术发展至今衍生出了多个版本,“低功耗蓝牙”(Bluetooth Low Energy)是演化过程当中的一次颠覆性改变。与前面几代不同的是,蓝牙4.0版引入的BLE协议更注重功耗问题,而非通信速率的提升。这也使得低功耗蓝牙更加节能,能使设备的电池维持很长时间,因此在很多可穿戴设备中得到了应用。

BLE协议栈

BLE协议栈的结构图如下所示,详细可参考蓝牙4.2官方文档
BLE协议栈

Physical Layer

任何一个通信系统,首先要确定的就是通信介质(物理通道,Physical Channel),BLE也不例外。在BLE协议中,“通信介质”的定义是由Physical Layer(其它通信协议也类似)负责。
Physical Layer是这样描述BLE的通信介质的:

由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);
BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400-2.4835 GHz);
为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称作RF Channel。

经过上面的定义之后,BLE的物理通道已经出来了,即“频道分别是‘f=2402 +k * 2 MHz, k=0, … ,39’,带宽为2MHz”的40个RF Channel。其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date);剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。
信道

Link Layer用于控制设备的射频状态,设备将处于Standby(待机)、Advertising(通告)、Scanning(扫描)、Initiating(初始化)、Connection(连接)这五种状态中的一种。
设备状态

  • 待机状态(Standby State):此时即不发送数据,也不接收数据,对设备来所也是最节能的状态;
  • 通告状态(Advertising State):通告状态下的设备一般也被称为“通告者”(Advertiser),它会通过advertising channel(广播通道)周期性发送数据,广播的数据可以由处于Scanning state或Initiating state的实体接收;
  • 扫描状态(Scanning State):可以通过advertising channel(广播通道)接收数据的状态,该状态下的设备又被称为“扫描者”(Scanner)。此外,根据advertiser所广播的数据类型,有些Scanner还可以主动向Advertiser请求一些额外数据;
  • 初始化状态(Initiating State):和Scanning State类似,不过是一种特殊的状态。Scanner会侦听所有的advertising channel,而Initator(初始化者)则只侦听某个特定设备的的广播,并在接收到数据后,发送连接请求,以便和Advertiser建立连接;
  • 连接状态(Connection State):由Initiating State或Advertising State自动切换而来,处于Connection State的双方,分别有两种角色。其中,Initiater方被称为Mater(主设备),Advertiser方则称作Slave(从设备)。

HCI

主机控制接口层(Host Controller Interface,简写 HCI):定义Host(主机)和Controller(控制器)之间的通信协议,这一层可以是软件或者硬件接口,如UART、SPI、USB等。

Generic Access Profile(GAP)

前面Link Layer虽然对连接建立的过程做了定义,但它并没有体现到Application(或者Profile)层面,而GAP则是直接与应用程序或配置文件通信的接口,它实现了如下功能:

  • 定义GAP层的蓝牙设备角色(role)

    • Broadcaster(广播者):设备正在发送advertising events
    • Observer(观察者):设备正在接收advertising events
    • Peripheral(外设):设备接受Link Layer连接(对应Link Layer的slave角色)
    • Central(主机):设备发起Link Layer连接(对应Link Layer的master角色)
  • 定义GAP层的用于实现各种通信的操作模式(Operational Mode)和过程(Procedures)

    • Broadcast mode and observation procedure,实现单向的、无连接的通信方式
    • Discovery modes and procedures,实现蓝牙设备的发现操作
    • Connection modes and procedures,实现蓝牙设备的连接操作
    • Bonding modes and procedures,实现蓝牙设备的配对操作
  • 定义User Interface有关的蓝牙参数,包括蓝牙地址、蓝牙名称、蓝牙的PIN码等

  • Security相关的定义。。

L2CAP Protocol

逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol):为上层提供数据封装服务,允许逻辑上的点对点数据通信。

Attribute protocol(ATT)

在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。
谈起应用程序,就不得不说BLE的初衷—-物联网。物联网中传输的数据和传统的互联网有什么区别呢?抛开其它不谈,物联网中最重要、最广泛的一类应用是:信息的采集。

这些信息往往都很简单,如温度、湿度、速度、位置信息、电量、水压、等等。
采集的过程也很简单,节点设备定时的向中心设备汇报信息数据,或者,中心设备在需要的时候主动查询。

基于信息采集的需求,BLE抽象出一个协议:Attribute protocol,该协议将这些“信息”以“Attribute(属性)”的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。
Attribute Protocol的主要思路包括:

  1. 基于L2CAP,使用固定的Channel ID
  2. 采用client-server的形式。提供信息(以后都将其称为Attribute)的一方称作ATT server(一般是那些传感器节点),访问信息的一方称作ATT client。
  3. 一个Attribute由Attribute Type、Attribute Handle和Attribute Value组成。

    • Attribute Type用以标示Attribute的类型,类似于我们常说的“温度”、“湿度”等人类可识别的术语,通过UUID进行区分。
    • Attribute Handle是一个16-bit的数值,用作唯一识别Attribute server上的所有Attribute。Attribute Handle的存在有如下意义:
      • 一个server上可能存在多个相同type的Attribute,显然,client有区分这些Attribute的需要。
      • 同一类型的多个Attribute,可以组成一个Group,client可以通过这个Group中的起、始handle访问所有的Attributes。
    • Attribute Value代表Attribute的值,可以是任何固定长度或者可变长度的octet array。
  4. Attribute能够定义一些权限(Permissions),以便server控制client的访问行为,包括:

    • 访问有关的权限(access permissions),Readable、Writeable以及Readable and writable;
    • 加密有关的权限(encryption permissions),Encryption required和No encryption required;
    • 认证有关的权限(authentication permissions),Authentication Required和No Authentication Required;
    • 授权有关的权限(authorization permissions),Authorization Required和No Authorization Required。
  5. 根据所定义的Attribute PDU的不同,client可以对server有多种访问方式,包括:

    • Find Information,获取Attribute type和Attribute Handle的对应关系;
    • Reading Attributes,有Read by type、Read by handle、Read by blob(只读取部分信息)、Read Multiple(读取多个handle的value)等方式;
    • Writing Attributes,包括需要应答的writing、不需要应答的writing等。

Generic Attribute profile(GATT)

ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。至于具体共享哪些信息,ATT并不关心,这是GATT(Generic Attribute Profile)的主场。GATT相对ATT只多了一个‘G‘,然含义却大不同,因为GATT是一个profile(更准确的说是profile framework)。
GATT由上图可知,GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,乃SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等,可参照官方Profiles Overview,对我们的分析并无大用。
Service和Characteristic则是比较重要的,Service可以理解为PHP中的“类”、功能对象的集合。Characteristic可以理解为PHP的“函数”,是GATT中具体的功能对象,每个Service都可以包含一个或多个Characteristic(特征)。Characteristic是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。
以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的,具备前面所描述的Attribute的所有特征:Attribute Handle、Attribute Types、Attribute Value和Attribute Permissions。
在理解了GATT后,就已经能够分析或是“黑掉”一些BLE设备了。这里拿小米手环做例子,当LightBlue连上小米手环后,可以看到一个名为FEE7的UUID,如下所示:
LightBlue其中,FEE7是一个私有Service的UUID,里面的0xFE**则是私有Characteristic的UUID。下面的Immediate Alert 显示出了名称,代表其不是小米私有的Service,而是官方公开定义的Service。点击进入这个Characteristic,看到它的UUID为2A06。然后我们到蓝牙官网定义的列表Characteristics搜索2A06,进入Characteristic的详情页面。
Alert Level于是,该Characteristic操作定义非常明确了。点击“Write new value”,可以写入新的值。若写入1或2,则可以引起手环的震动。。

Security Manager(SM)

Security Manager负责BLE通信中有关安全的内容,包括配对(pairing,)、认证(authentication)和加密(encryption)等过程。

BLE数据包格式

在低功耗蓝牙规范中,分广播报文和数据报文这两种。设备利用广播报文发现、连接其它设备,而在连接建立之后,便开始使用数据报文。无论是广播报文还是数据报文,链路层只使用一种数据包格式,它由“前导码”(preamble)、“访问码”(access code)、”有效载荷“和”循环冗余校验“(Cyclical Redundancy Check,CRC)校验码组成。其中,”访问码“有时又称为”访问地址“(access address)。
BLE数据包格式

  1. Preamble
    1个字节长度,接受中用于频率同步、数据速率同步、自动增益控制调整,固定为01010101或者10101010序列
  2. Access Address
    4个字节长度,广播报文接入地址为:0x8E89BED6,数据报文接入地址为:32bits随机数
  3. PDU
    • 广播报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.3)
      广播报文广播报文
      • PDU Type:有效载荷内容的类型,通过这一字段确定该数据包是一个”通告“还是”扫描请求“或”响应“等
        PDU Type
      • RFU 保留位
      • TxAdd:发送地址字段
      • RxAdd:接收地址字段
      • Payload Length:用来表示”有效载荷数据“(payload data)的长度,不包括头部内容
    • 数据报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.4)
      数据报文数据报文数据报文
      • LLID(逻辑链路ID):0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容
      • NESN:下一个期望的序列号,用于对接收到的数据包进行确认
      • MD:更多数据字段,主要是为了说明发送方是否还有要发给接收者的数据
      • RFU 保留位
      • Payload Length:用以表示包含“信息完整性校验码”(Message Integrity Check,MIC)在内的“有效载荷数据”的长度
  4. CRC
    3个字节长度,“循环冗余校验”(Cyclical Redundancy Check,CRC),可检查数据的正确性

BLE通信协议分析

逆向思路

Android系统自4.3版本开始,引入了对BLE的支持,详见Bluetooth Low Energy。通过浏览当中的信息,我们可以得知在app开发环节,需要做到如下几件事情:

  1. BLE相关权限声明
    BLE权限声明
  2. 操作蓝牙之前,判断系统是否支持BLE
    BLE支持判断
  3. 获取本机的蓝牙适配器,BluetoothAdapter的获取依赖于bluetoothManager.getAdapter()实现
    获取蓝牙适配
  4. 发intent通知系统打开蓝牙
    打开蓝牙
  5. 使用startLeScan()函数获取外围设备,并实现BluetoothAdapter.LeScanCallback方法接受扫描结果
    扫描外围设备扫描外围设备
  6. 调用connectGatt方法对设备进行连接,里面的BluetoothGattCallback对象用于交付操作结果给客户端。如果连接成功将返回BluetoothGatt实例,该实例是进行蓝牙控制的基础
    返回BluetoothGatt实例
  7. 成功建立连接后,便可对attributes(属性,参考前面的BLE协议栈)进行读写。利用getService、getCharacteristics获取外围设备的service和characteristic,对于其中支持写的characteristic在写入相应的数据,可实现外围设备的控制
    操作attributes属性了解BLE app的开发步骤后,进行逆向时思路也就清晰了许多。首先,可以通过startLeScan、LeScanCallback等方法定位到扫描BLE外围设备的相关代码段;然后,根据connectGatt、BluetoothGattCallback等api锁定设备连接的相关函数,并找到指令交互部分,最后梳理出整个控制流程。。

BLE嗅探

除去静态分析外,我们还需要一些嗅探蓝牙通信的手段。目前,个人选用的是CC2540 USB Dongle配合官方的packet Sniffer程序,安装及使用方法详见BLE sniffer guide(要求Windows环境)。
BLE嗅探BLE嗅探BLE嗅探此外,需要注意的是,设备连接建立前,它会在3个信道发送广播(37、38、39),而sniffer只能监听三个频道中的任意一个,所以每次能抓到包的概率是三分之一。
BLE嗅探

实战

关于这部分内容,可详见之前的文章:爱无惧距离,记一次对智能跳蛋的入侵

参考链接

  1. 蓝牙低功耗(BLE)协议栈介绍
  2. 蓝牙学习之旅——低功耗蓝牙之报文(广播报文&数据报文)
  3. Bluetooth开发指南
  4. 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
  5. BLUETOOTH SPECIFICATION Version 4.0
------ 本文结束 感谢阅读 ------

版权声明

Shell In Ghost by Jiang Jie is licensed under a Creative Commons BY-NC-ND 4.0 International License.
蒋杰创作并维护的Shell In Ghost博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Shell In Ghost 博客( https://www.wireghost.cn ),版权所有,侵权必究。