-
-
[原创]BLE安全初探:流量分析和安全加固
-
发表于: 2025-5-20 04:17 788
-
前段时间出于个人兴趣和需求,买了esp32开发板做了个蓝牙控制舵机,安装在宿舍灯旁,实现了手机远程关宿舍灯。
最近出于对ble安全的学习目的,买了款nrf52840-dongle,对开发板的ble服务做嗅探,可以由此初步学习对于ble的流量分析和安全加固。
蓝牙是一种短距的无线通讯技术,BLE(Bluetooh Low Energy)可视为蓝牙技术的一个新模块,并区别于传统模块,最大的特点就是成本和功耗降低,应用于实时性要求比较高的场景。
BLE协议栈如下
后续的流量分析中会涉及到的协议层如下
1、LL层(Link Layer链路层)
ble是面向连接的协议,类tcp。连接前需要进行广播,不断在广播通道发送广播报文。包括广播报文和建立连接后的报文都是以链路层为基础的。
2、L2CAP层(Logic link control and adaptation protocol)
L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
3、SMP(Secure manager protocol)
SMP用来管理BLE配对过程的,保证连接的安全性,过程包括密钥生成与分发。配对分为传统配对(legacy pairing)和安全配对(LE Secure Connections)
4、ATT(Attribute protocol)
ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
5、GATT(Generic attribute profile )
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。GATT 中存在服务端和客户端的定义,在 GATT 定义了服务(service),每个服务可以包含零个或多个特征(characteristic),不同的特征之间用唯一的 UUID 区分,这些特征又可以包括零个或多个:
描述符(descriptor),顾名思义,可有可无。
值(value),就是操作行为的实际数据。
属性(properties),指定了读或写。
硬件的工作不做赘述。以下是刷入esp32的代码,是不进行安全加固的版本。
(ps:本人是嵌入式开发的小白,esp32开发的门槛不高,使用到了arduino ide,它提供了简化开发的库函数和框架)。
以上代码烧入esp32,它就作为一个gatt的服务端运行,开启了ble服务,不断广播等待连接,并创建了特征,定义了收到特定的特征值"OFF",即进行关灯操作。此时手机作为客户端,与服务器连接,通过nrfconnect这个app可以发送自己编辑的特征值。
除了服务端-客户端的叫法,也可以叫做从机-主机,外设( Peripheral )-中心设备( Central)。
nrf52840是一款支持ble工作的芯片,可以用作蓝牙扫描器或嗅探器,配合wireshark捕获和分析周围设备的BLE广播包和连接包。价格40左右。
配置过程参考Wireshark配合nRF Sniffer使用技巧 - unrulife - 博客园 (cnblogs.com)
开始捕获后,在连接前有大量的广播包,info显示为ADV_IND等信息。
手机向设备发起配对请求后,可以看到首先有个由手机发起的连接请求,info为CONNECT_IND。随后没有发现有效数据,同时关注到存在"Encrypted packet decrypted incorrectly (bad MIC)"这样的字眼,说明流量被加密了。
用btsmp过滤出SMP包,说明配对的过程是会通过SMP协议进行密钥的管理的。
客户端发送一个 Pairing Request,服务端返回一个 Pairing Response,还有一些随机数的交换和确认。最后产生一个Long Term Key(LTK),用于加密配对后的通信。
Pairing Response的关键字段如下:
1、IO Capability
是根据输入输出能力协商配对方式,No Input, No Output (0x03)
声明设备无输入输出界面,因此使用 "Just Works" 或 静态密码 的配对方式。