本文作者:平安@涂鸦智能安全实验室
前言
在学习BLE低功耗蓝牙安全知识前,我们要先对BLE蓝牙有个基础了解,知道BLE是什么?
基础简介
BLE(Bluethooth Low Energy)是指低功耗蓝牙技术,是一种用于无线通信的短距离通信技术。蓝牙4.0标准包含两种不同的蓝牙技术:经典蓝牙(Classic BlueTooth)和低功耗蓝牙。
经典蓝牙和低功耗的蓝牙的区别:
- 经典蓝牙:是早期的蓝牙技术,用于传输较大量的数据和支持更复杂的功能。
- 低功耗蓝牙:更专注于低功耗、简单数据传输和快速连接的应用场景。
一些设备可能仍然选择使用经典蓝牙,而另一些设备则可能使用低功耗蓝牙来实现低功耗和简化的数据传输。低功耗蓝牙是在2010年后出现的,为了满足物联网(IOT)和传感设备的需求,使得非常适合用于低功耗设备,如健康追踪器、智能手表、智能家居等。
工作频率
蓝牙技术的频率为2.4GHz,使用的是ISM频段,这是一种被广泛应用于各种工业、科学和医疗设备的频段,常见的有2.4GHz和5.8GHz,2.4GHz是最为广泛使用的频段,被用于各种无线技术,包括蓝牙、Wi-Fi、Zigbee等,不同的无线技术采用不同的子频道和协议来进行通信,避免互相干扰。
低功耗蓝牙一共有40个信道,频段范围从2402GHz到2480GHz,每两兆赫兹一个信道。
组成部分
低功耗蓝牙组成部分包括以下几个主要方面:
- BLE芯片:要开发一款BLE设备,需要搭载BLE芯片,这是实现低功耗蓝牙通信的关键组件。在开发中常用CC2540芯片做BLE的设备,支持嵌入式软件开发,该芯片具备以下几个特点和功能:
- 低功耗特性:能够在保持长时间运行的同时,最大限度地减少功耗消耗
- 高集成度:集成了低功耗蓝牙协议栈和相关硬件模块,包括物理层、链路层和主机层,使其能够直接支持BLE通信,无需外部组件。
- 多种设备角色支持:可以作为中央设备(Central)或外围设备(Peripheral)运行,具备连接和数据交换的能力。它可以主动发起连接,也可以响应其他设备的连接请求。
- 高度可编程性:支持嵌入式软件开发
- 丰富的接口和功能:提供了多种通用输入输出引脚和串行接口(UART、SPI、I2C等)可与其他外部器件进行通信和连接。它还具备功耗管理、安全加密、数据传输和存储等功能。
- 广泛应用于物联网(IoT)设备、传感器网络、健康监测、智能家居、追踪器等领域,通过BLE技术实现设备之间的无线通信和数据传输。
CC2540芯片是单模芯片,区别于手机和PC端的双模芯片,区别在于单模芯片专门用于支持一种通信模式,即低BLE或者经典蓝牙,单模芯片通常具有较低的功耗,需要长时间运行且能耗较低,如传感器网络,健康监测等。而双模芯片可以同时支持BLe和经典蓝牙通信模式,兼容性更广泛,能够与不同类型的蓝牙设备进行通信,一般在一些需要同时支持BLE和经典蓝牙的应用中发挥作用,比如智能手机、音频设备等。
常见的集成CC2540的蓝牙主板如图:
- BLE协议栈:BLE协议栈是一组软件协议和算法,用于管理BLE设备之间的通信,处理蓝牙设备之间的连接、数据传输、安全性和功耗管理等各方面。所谓的协议,就是将指定的字节按照一定顺序排列组合起来,以便在使用时,可以通过该使用时同其他设备进行通信,特点就是有固定的帧格式。BLE协议栈由控制器(Controller)、主机控制接口(HCI)和主机(HOST)组成。
- 硬件部分都是在Controller中实现,像蓝牙基带是负责处理蓝牙通信的物理层操作,包括无线信号的调制解调、发送和接受数据包、功率控制、频率选择等,与上层的链路层、控制器层和主机层进行交互,协同工作实现蓝牙设备之间的无线通信。还比如说RF也在Controller中,RF是蓝牙通信中负责射频信号的收发和处理的部分,包括射频收发器(RF Transceiver)和相关的电路部分,用于调制和解调无线信号、调整发送和接收的频率、控制信号的功率等。
- 软件部分则是通过Host来控制,而在Host中存在这各种各样的协议,如数据的分段与重组、定义配对和密钥的分发、负责设置BLE的工作模式等等。
- 而HCI是一个接口,作为软硬件的桥梁,通过该接口实现软硬件的交互,是至关重要的一部分。
BLE的所有设计都要遵循蓝牙协议规范
- BLE设备角色:BLE定义了两种主要角色:中心设备(Central)和外围设备(Peripheral)。中心设备通常是移动设备(手机、PC),负责发起连接并接受来自外围设备的数据;外围设备通常是传感器、小型设备等,负责广播自身的数据并响应中央设备的请求。
以智能手环为例,手环是外围设备,而智能手机是中心设备,手环通过蓝牙将一些心跳、健康监测数据发送给手机,手机接收到蓝牙传输通道的数据后,通过APP将数据解析并显示给用户。外围角色的作用是为中心角色提供各种数据,中心角色可以扫描并接受多个外围角色的数据(外围角色中的设备进行广播,中心角色的设备寻找广播)
- GATT框架:GATT是BLE中定义的通用属性框架,用于描述和管理BLE设备之间的数据传输。GATT定义了一种基于客户端-服务器模型的数据交换方式,其中客户端可以向服务器请求数据或向其发送数据。GATT使用属性(Attribute)和特征(Characteristic)来描述设备的功能和数据,通过服务(Service)来组织和管理这些属性和特征。简单理解为蓝牙设备建立连接后所传输的数据。如图所示:
- BLE应用层:BLE应用层是在BLE设备上运行的应用程序,它们利用BLE协议栈和GATT框架实现特定的功能。应用层除了基本的BLE功能外,应用层还可以定义自己的应用层协议,用于实现特定的应用需求,如传感器数据的获取、远程控制等,负责解析和处理收到的数据,根据特定的数据格式和协议进行解析和处理,以实现应用层功能。应用层上可以包括各种应用程序,例如健康监测、追踪器、智能家居控制等。也可以自定义安全机制,包括配对过程、加密和认证,以确保通信的安全性和隐私保护。
这些组件共同协作,实现了低功耗蓝牙设备之间的可靠通信和数据交换。
协议栈组成部分
回顾蓝牙组成部分,蓝牙协议栈是蓝牙数据传输和解析的重要部分,本节详细说明下Controller和Host的各个部分。
控制器(Controller)
Controller是用于实现BLE通信协议的硬件模块或芯片,是在蓝牙设备中用于处理物理层和链路层通信的关键组件。
物理层(PHY)
BLE的物理层基于蓝牙核心规范,以下是BLE物理层的一些关键特性和技术:
- 频段:物理层指定了BLE使用2.4GHz的工业、科学及医疗(ISM)频段,这个频段是公共可用的无线电频段,是一个无需授权的频段,且是全球通用的频段,,频谱资源为2400Mhz~2483.5Mhz约83.5Mhz。
- 调配扩频:BLE物理层使用调配扩频技术,将通信信号在2.4GHz频段上的传输频率进行频繁的切换,以减少干扰和提高抗干扰能力。
- 射频信道:BLE拥有40个射频通道,其中37个自适应自动调频数据通道和3个广播通道,3个广播通道分别为37、38、39,因为广播通道比较少,如果设备的广播频率设置很高,容易堵信道。
- 发射功率:2.4Ghz ISM频段对设备有最大发射功率限制,对于BLE在蓝牙5.2协议规范中有规定,最小发射功率为-20dBm,最大发射功率为+10dBm。
- 带宽:BLE物理层的通信带宽相对较低,通常为1 Mbps或更低。这种较低的带宽有助于降低功耗和延长设备的电池寿命。
- 调制方式:BLE物理层使用高斯频移键控调制方式。GFSK调制可提供较高的数据传输速率和较低的功耗。
- 调制:为了保证通信效果,克服远距离信号传输中的问题,必须要通过调制将信号频谱搬移到高频信道中进行传输,这种将要发送的信号加载到高频信号的过程就叫调制。
- 无线信号的调制方式:OOK(通断键控)、ASK(幅移键控)、FSK(频移键控)、4-FSK、GFSK(高斯频移键控)
- 数据包结构:BLE物理层的数据传输以数据包为单位。一个BLE数据包包含同步字节、访问地址、通道标识符(用于识别数据包类型)、数据字段和错误检测码(CRC)等部分。
链路层(LL)
在BLE通信中,链路层是位于BLE协议栈中的一个关键层级。位于物理层之上,负责处理与连接建立、数据传输和断开相关的任务,确保了设备之间的可靠通信。
链路层定义了两个设备如何利用无线电传输信息,包含了报文、广播、数据通道的定义,规定了两个设备操作行为规范。
定义了5种设备状态:
- 就绪态:可译为待机态,上电后协议栈在接收到主机层的命令之前会进入并保持在就绪态,可以由就绪态进入广播态、扫描态和发起态,其他任何状态都可以进入就绪态。
- 广播态:广播态链路层会控制射频发射广播报文,也可以发送扫描响应来回应主动扫描的设备。在广播态下设备可以被其他设备发现,收到其他设备的连接请求后退出广播态进入连接态。广播报文中包含本地设备名称和设备地址等基本信息。广播还可分为可连接广播和不可连接广播,可连接广播可以被扫描设备发现和连接进入连接态;不可连接广播无法被其他设备连接,广播设备将数据广播到空中但不提供连接,"beacon"是典型的应用场景之一。
- 扫描态:处于扫描态的链路层可以侦听来自广播设备的物理信道包,用于发现正在广播的设备。扫描态由两个子状态:主动扫描和被动扫描。被动扫描只有接收机(RX)在工作,设备只能被动扫描无法发送任何报文;主动扫描态中链路层一旦发现新的广播设备都会发送扫描请求,并等待该请求响应。
- 发起态:在建立连接之前,链路层需要进入发起态,发起态的接收机用于侦听自己试图连接的设备广播,如果接收到了广播报文,链路层会向其发送连接请求并进入链接状态,发起请求后,发起设备会进入数据通道并在数据通道中进行数据包发送,如果对方有应答说明连接建立成功,否则连接建立失败进入就绪态。
- 连接态:两个设备成功建立后链路层会进入连接态,进入连接态的设备分为从机和主机。主机只能由发起态进入,主机定时向从机设备发送报文,从机在回复主机报文时发送自己的数据。从机由广播态进入,从机没有主动发送数据的能力,只有主机发起了连接事件后,从机在可以发送自己的数据,如果从机没有数据需要发送,可以忽略主机发送的连接事件,降低设备功耗。
主机控制接口(HCI)
HCI是上层HOST与下层Controller的通信接口,定义了蓝牙设备上层协议栈与底层控制器之间的命令和数据交互方式。主要用于蓝牙设备的控制和管理,通过HCI接口,主机可以与蓝牙设备的底层控制器进行通信,发送命令和接收事件,以实现对蓝牙设备的控制和监控。
以下是HCI接口的特点和功能:
- 命令和事件:通过HCI接口,主机可以向蓝牙发送各种命令,如建立连接、断开接口、配置参数等。蓝牙设备在执行这些命令后,会生成相应的事件并通过HCI接口向主机发送,主机可以根据事件进行相应的处理。
- 数据传输:HCI 接口支持蓝牙设备之间的数据传输。主机可以通过 HCI 接口发送数据给底层控制器,底层控制器将数据传输给指定的蓝牙设备。同样地,蓝牙设备也可以通过 HCI 接口将数据传输给主机。
- 配置和控制:HCI 接口提供了对蓝牙设备的配置和控制功能。主机可以通过发送相应的命令,设置设备的参数、模式和功能,以满足特定的应用需求。
- 错误处理:HCI 接口通过返回错误码来指示操作中可能发生的错误。主机可以根据错误码来判断操作是否成功,并做相应的处理。
如果主机和控制器分开在不同芯片的话HCI接口包括了物理接口和逻辑接口,协议规范规定了四种可用的物理接口,包括通用UART、3线UART、USB和SDIO。逻辑接口定义了数据包的帧格式。
主机(HOST)
Host负责与蓝牙设备进行通信、控制连接、数据传输以及执行蓝牙协议栈的各个层级,是一个完全由软件实现的层。
逻辑链路控制和适配协议(L2CAP)
L2CAP是整个蓝牙协议中最核心的部分,位于HCI接口上层,负责连通主机和控制器,向上层提供面向连接和无连接的数据服务,并提供多路复用、分段和重组操作。
注:
SDU -> 服务数据单元,L2CAP与上层交换的数据包,它不包含L2CAP的帧头。
PDU -> 协议数据单元,包括了L2CAP协议信息域、控制信息、上层信息数据,这个数据包就包含了L2CAP的帧头。一个SDU可能被分割成多个PDU进行传输。
MTU -> 最大数据传输单元,上层应用可以接收的payload最大字节数,注意这个跟ATT的MTU是不一样的。
MPS -> L2CAP可以接收的payload最大字节数。
Credit -> 本蓝牙设备可以接收的LE帧数量。Credits取值范围是1~65535,在两个设备之间使用流控制。
L2CAP Basic Header -> 为每个PDU预先准备的L2CAP协议信息。它包括了CID和长度。
L2CAP的主要功能包括:
- 数据分段和重组:L2CAP负责将上层应用层传递的数据进行分段,以适应底层链路层的数据包大小。在接收端,L2CAP 负责重组这些分段数据,以便传递给上层应用层。
- 可靠数据传输:L2CAP提供了一种可靠的数据传输机制,通过确认和重传来保证数据的可靠性。它确保数据的正确传递,以及处理数据丢失或错误的情况。
- 安全性:L2CAP支持安全特性,包括加密和认证。它可以使用底层链路层提供的安全机制来保护通信的机密性和完整性。
- 透明的数据通道:L2CAP 提供了透明的数据通道,可以传输各种类型的数据,如音频、视频、传感器数据等。它可以通过通道 ID 来标识和区分不同的数据通道。
- 信用管理:L2CAP 使用信用管理来管理数据传输的流控制。通过分配和管理信用,它可以控制数据发送的速率,以避免数据的拥塞和丢失。
- QoS(Quality of Service):L2CAP 支持对数据传输的服务质量进行配置和管理。通过设置不同的 QoS 参数,可以优化传输性能,满足不同应用场景的需求。
通用属性规范(GATT)
自下而上的顺序应该先看ATT协议,但先了解GATT协议,可以更好的理解ATT原理。
在GATT之上就是应用程序,通过GATT同意属性格式和属性访问接口。是一个基于ATT的通用属性配置文件,用于定义设备之间的数据交换和服务。GATT 提供了一种层次化的数据模型,用于组织和访问设备上的属性数据。它将属性组织成一个层级结构,由服务(Service)、特征(Characteristic)和描述符(Descriptor)组成。一个profile由若干个service组成,而一个service又由若干characteristic组成,characteristic又是由声明、数值和描述符组成。
- 服务(Service):服务是一组相关的特征的集合,用于提供特定的功能或服务。每个服务都有一个唯一的UUID来标识。
- 特征(Characteristic):特征代表了设备的某个具体属性或数据。它包含一个值和可选的一些属性,如读取、写入、订阅通知等。每个特征也有一个唯一的UUID来标识。
- 描述符(Descriptor):描述符提供了特征的附加信息和配置选项。它可以包含一些元数据,如单位、范围等。描述符也有一个唯一的UUID来标识。
GATT还定义了两种设备角色:客户端和服务端,客户端通过发送读取、写入和订阅通知等命令,从服务端获取或修改属性数据。服务端则响应这些请求并返回相应的数据或执行相应的操作。如智能手环和手机之间,智能手环向手机提供数据是服务器,手机主动发起命令读取手环的数据,手机为客户端。
对于GATT本身,可以简单理解为一种根据一定格式规范组织的数据表:
上图主要由三部分组成:Handle、Attribute Type、Attribute Value。其中Handle是作为索引的依据类似数组的下标,Attribute Type是根据UUID而定义的128bit标识(实际传输可以只传递16bit),Attribute Value即属性值。
属性协议(ATT)
ATT 协议的主要目的是定义蓝牙设备之间的数据交换方式和规范,以便实现设备之间的通信和数据访问。它建立在 L2CAP之上,作为上层协议。
ATT是作为完成上述数据表具体的操作,它的操作对象就是每一条属性指。
属性其实就是一种数据格式:
上述图片就是一条属性,它由以下几个部分组成:
Attribute Handle:属性句柄,如果设备上有两个类型一样的肯定需要一个标识来区分,属性句柄就是每个属性的唯一标识,由系统分配。
Attribute Type:属性类型,用UUID表示,分为四大类:
- Primary Service(首要服务项)
- Secondary Service(次要服务项)
- Include(包含服务项)
- Characteristic(特征值)
而UUID对应属性类型可以划分为以下几种:
0x1800-0x26FF:服务项类型
0x2700-0x27FF:单位
0x2800-0x28FF:属性类型
0x2900-0x29FF:描述符类型
0x2A00-0x7FFF:特征值类型
Attribute Value:属性的值
如果该属性是服务项类型或者是特征值声明类型,那么它的属性就是UUID等信息。如果是普通的特征值,则属性值是用户的数据。属性值需要预留空间以保存用户数据。为了方便理解,可以将属性值的空间看做I2C的数据空间,操作特征值里的用户数据,就是对那块内存空间进行读写。
Attribute Permissions:属性权限,主要有以下四类:
访问权限(Access Permission)- 只读、只写、读写
加密权限(Encryption Permission)- 加密、不加密
认证权限(Authentication Permission)- 需要认证、不需要认证
授权权限(Authorization Permission)- 需要授权、不需要授权
ATT PDU
在这里先了解下PDU(Protocol Data Unit)协议数据单元,PDU是一种通用术语,用于描述各种通信协议中的数据传输单元。在BLE中,ATT和GATT都使用ATT PDU来描述数据单元,这些PDU用于在BLE设备之间传输属性数据和命令。L2CAP在蓝牙协议栈中位于ATT之中,尽管L2CAP没有明确使用PDU的术语,但它使用L2CAP数据包来传输数据。这些数据包可以被视为类似于PDU的数据传输单元。
ATT PDU 是在BLE(Bluetooth Low Energy)通信中使用的数据单元,用于在客户端和服务器之间传递属性数据和命令。它被封装在L2CAP(Logical Link Control and Adaptation Protocol)数据包中进行传输。
ATT PDU根据不同的操作类型和数据类型而有所不同,它包含以下重要字段:
- Opcode:操作码
- Attribute Parameters: ATT参数
- Authentication Signature: 身份验证签名
Atrribute Protocal PDU格式:
Attribute Opcode的取值:
ATT层抓包
Read By Group Type Request包
Read By Group Type Response包
SMP(安全管理)
SMP是BLE通信中用于安全管理的协议。负责处理BLE设备之间的安全性,包括身份验证、加密和密钥管理等方面。SMP 的主要目标是确保蓝牙设备之间的通信安全,并提供对抗窃听、篡改和伪造等威胁的保护。以下是BLE SMP 协议的关键功能:
- 身份验证:支持蓝牙设备之间的身份验证。在连接建立过程中,设备可以相互验证其身份,确保只有授权的设备可以进行通信。
- 加密:提供了对蓝牙通信的加密保护。一旦设备成功进行身份验证,它们可以协商并建立安全的加密连接,确保数据的机密性。
- 密钥管理:管理和协商用于身份验证和加密的密钥。它定义了密钥协商过程和密钥更新策略,以确保密钥的安全性和有效性。
- 安全级别:定义了不同的安全级别,以适应不同的应用需求。这些级别包括无安全、连接安全和数据完整性等级,开发人员可以根据应用的要求选择适当的安全级别。
SM在蓝牙协议中的位置如图:
数据单元对应的内容:
安全加密的方式有通用和私有的区别,通用类型的比如通过PIN配对码的方式,具体后面着重再讲。
GAP(通用访问配置文件)
BLE GAP 定义了蓝牙设备在广播和连接建立过程中的角色和行为,包括以下关键功能:
- 设备发现:允许设备通过广播消息来宣告其存在和提供的服务。其他设备可以通过扫描和解析这些广播消息,发现周围的蓝牙设备。
- 角色定义:定义了两个主要的角色,即广播者(Broadcaster)和扫描者(Scanner)。广播者是指周期性地广播其存在和服务的设备,而扫描者是指扫描周围广播消息以发现设备的设备。
- 连接建立:定义了蓝牙设备之间建立连接的过程。设备可以发送连接请求来建立与目标设备的连接,目标设备可以接受或拒绝这些请求。
- 连接参数管理:定义了连接参数的交换和管理,包括蓝牙地址、蓝牙名称、蓝牙的pincode、蓝牙的class,在连接建立过程中,设备可以协商和交换连接参数,如连接间隔、连接超时和连接事件长度等,以适应不同的应用需求。
- 安全管理:支持蓝牙设备之间的安全管理。它定义了身份验证和加密过程,以确保连接的安全性和数据的保护。
----------------------------------------------------------------------------------------------------
漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。