• 深入理解蓝牙BLE之“安全管理Part1(GAP)”


    目录

    前言:

    安全通信:

    GAP章节:

    安全模式:

    LE security mode 1:

    LE security mode 2:

    说明:

    安全规程:

    认证规程:

    数字签名规程:

    授权规程:

    加密规程:

    其他:

    隐私特性:


    前言:

    蓝牙BLE是一种无线通信,监听者可以很容易的获取空中的数据,为了保证数据通信的安全性,必要时需要对所传输的数据进行加密。Bluetooth Core Spec文档中关于蓝牙BLE安全相关的内容主要分布在GAP,GATT和SMP这三个章节中,三者的关系如图1,将三部分内容整合在一起去理解,更容易系统的理解蓝牙BLE的安全性的内容。

    图1

    安全通信:

    无线通信要保证数据的安全性的话,两个设备之间所传输的无线数据一定是加密的(或者是签名的),双方使用相同的对称密钥或者非对称密钥进行加解密即可,数据的加密/解密并不是蓝牙BLE协议的设计难点,两个无线设备之间如何安全的分配/协商密钥,才是BLE安全通信的核心内容。蓝牙BLE协议协商/分配密钥的过程是通过配对机制来实现的。

    蓝牙BLE设备是基于CS模型设计的,client端向提供数据的server端发送消息,以读取或者写入数据。server作为数据的提供者,是对数据安全性更有需求的一方,而client是被要求的一方,简单点来说,server将敏感数据配置为较高的安全等级需求,client只有满足了这个安全等级,server才允许这个client来访问它的数据。

    server提供的数据可能并不是敏感数据,即使是敏感数据,也是有安全等级划分的。因此server对不重要的数据,完全可以不配置安全性的加密需求,对于重要的数据,也可以根据重要程度,设置不同的加密等级,这些安全等级的机制,蓝牙BLE协议都是支持的。

    两个互相通信的蓝牙BLE设备,在第一次配对绑定成功之后,会将协商好的密钥保存在各自的数据库中,在下一次进行连接时,直接使用数据库中的密钥进行加密即可。蓝牙BLE安全性的实现需要双方设备分别有一个security database来存储这些配对成功的密钥。core spec文档中同样有提到过:"The local device’s security database specifies the security settings required to accept a service request."。说明server配置的安全等级需求,也是保存在security database中的。

    GAP章节中定义了安全模式和安全等级,GATT中提到过attribute permission,SMP讲解了分配密钥的具体实现(配对的详细过程)。我个人的理解是GAP定义了BLE安全相关的框架,SMP定义了具体实现,而GATT作为数据的提供者是BLE安全传输的需求方。

    因此为了更好的理解蓝牙BLE的安全管理,我们先从GAP章节开始阅读,对于细节的疑问可以先不用深究,在SMP章节会详细的介绍如何实现的。

    GAP章节:

    我们以SIG Bluetooth 4.2版本的Core Spec文档来介绍GAP的安全相关的内容。相关内容在Vol 3,part C的SECURITY ASPECTS – LE PHYSICAL TRANSPORT一节中。

    本小结定义了安全连接的模式和规程,其中安全模式分为2种,实现安全模式的安全规程有4种。

    安全模式:

    LE security mode 1:

    安全模式1共有4个安全等级:

    1. No security (No authentication and no encryption):
    没有安全需求,不需要认证,不需要加密,也就是没有配置过GATT安全相关的内容,gatt的server提供的数据不重要的话,可以使用这个方式。
    2. Unauthenticated pairing with encryption:
    非认证的配对加密,这里指的是通过legacy pairing的just work方式进行的配对,此配对方式可以生成密钥,但是安全性不足,可以被第三方监听破解,用户不确定是否是认证的设备与我们的设备进行配对,因此叫做非认证配对加密。
    3. Authenticated pairing with encryption:
    认证的配对加密,这里指的是通过legacy pairing的passkey或者oob的方式进行的配对,此配对方式生成密钥的安全性是足够的,并且用户可以确定与我们配对的对方设备,因此叫做认证配对加密。
    4. Authenticated LE Secure Connections pairing with encryption:
    使用LE Secure Connections配对方式生成的密钥进行的加密,蓝牙4.0和4.1只有legacy pairing方式,蓝牙4.2开始引入了LE Secure Connections的配对方式。两者的区别是LESC加入了ECDH的算法支持,两个设备之间在无需再传递LTK密钥了,而是各自计算出了LTK的值。
    security mode 1的内容很容易理解,蓝牙BLE的GATT的Server端的数据,需要根据数据的重要性设置不同的安全等级,有四个安全等级可以选择,分别是不需要加密,使用非认证的配对方式生成的密钥进行加密,使用认证的配对方式生成的密钥加密,使用LESC更高安全级别的陪对方式生成的密钥进行加密,其中这四个安全等级对应着四种不同安全级别的密钥,密钥的安全级别是根据配对的方式来确定的,最高的安全级别的配对是通过LESC来进行配对的,这种方式生成的密钥安全等级最高。

    LE security mode 2:

    安全模式2共有2个安全等级:

    1. Unauthenticated pairing with data signing:
    非认证配对的数据签名传输。签名所用的签名密钥是双方使用非认证配对方式协商的,也就是legacy pairing的just work方式配对之后,双方分配的签名密钥。
    2. Authenticated pairing with data signing:
    认证配对的数据签名传输。签名所用的密钥是双方使用认证配对方式协商的密钥,也就是使用legacy pairing的passkey或者oob,或者LESC的方式进行的配对后分配的签名密钥,这种方式的签名密钥安全性更高。

    说明:

    安全等级是向下兼容的,也就是说如果server端要求level 3的密钥安全等级,两个设备使用level 4的方式进行配对也是可以的。(配对的方式决定了密钥的安全等级)。

    mode 1和mode 2的区别:数据的安全传输有两种方式一种是加密,另外一种是签名。加密对于双方设备是一个比较重的任务,一旦连接的链路开始加密了,所有后续传输的数据都是加密的,直至双方协商停止加密。但是签名就会轻量级很多,签名仅仅是使用签名写入命令那一包数据用得到,其他数据可以不签名。因此如果两个设备之间传输的数据已经是加密数据了,那么就没有必要再传输签名的数据了。
    mode 1和mode 2是可以混合使用的,叫做Mixed Security Modes,spec中有解释,例如当前连接,如果既要求LE security mode 1,又要求LE security mode 2 level 2,则LE security mode 1 level 3将被使用。还有及其他几种组合情况不再描述了。

    安全规程:

    认证规程:

    认证规程描述了两个ble设备之间的安全模式是如何建立起来的,认证规程覆盖了security mode 1,认证规程是在连接建立成功之后才开始的(security mode 2是在数据签名规程中定义的)。security mode 1是通过加密来实现的安全性,加密的安全等级根据配对方式的影响,有两种配对类型,一个是认证配对,一个是非认证配对,前者更安全,有MITM Protection;后者没有那么安全,没有MITM Protection。

    认证规程其实就是两个设备间,根据Server端设置的数据的security mode 1的level,通过配对方式来交换密钥的过程。如果Server端的数据设置了最高的level 4,那么这两个设备一定要使用LESC的配对方式才能满足,如果Server端设置了level 3的安全等级,那么这两个设备需要使用passkey或者oob的方式进行验证(如果有能力的话,使用LESC的配对方式更好,安全等级是向下兼容的)。

    Responding to a Service Request:

    本地设备是一个GATT Server,远端设备是GATT Client,当本地设备收到Client的Service request消息,如果当前链路不符合Server所要求的安全等级,Server应该回复error code给client。error code的值依赖于当前连接是否加密,以及所使用的加密密钥LTK的类型(LTK的类型,也就是配对的类型,是认证的,还是非认证的,还是LESC的)。

    Server回复Client的error code类型如图2,其中如果Server对所访问的数据没有要求安全加密(也就是security mode 1 level 1),则回复Request succeeds。

    图2

    GATT Server收到一个Client发送的Service Request之后的处理流程如图3。

    图3

    Security DB数据库文件中存储着这个GATT Server中的数据所需要的安全等级。如果不需要安全的等级,即level 1的安全等级,则直接访问数据;如果未配对,则发起配对流程,用以生成符合安全等级要求的LTK;如果已配对,判断当前的LTK是否符合数据的要求,不符合要求就重新配对,符合要求的话,就开启加密。

    有一个特殊的地方是Server的notify和indication,如果之前一个连接的Client把cccd设置为notify了,现在新连接的Client也需要重新验证安全等级,Server才可以发送notify和indication。

    Initiating a Service Request:

    本地设备是一个GATT Client,远端设备是GATT Server,client发送Service request消息到Server,流程图4。

     图4

    GATT Client端同样有一个security DB,存储着对方Server的安全等级的要求,是否已配对的状态,和用于加密链路的LTK的值,如果没有存储则尝试和Server建立配对关系。

    数字签名规程:

    数据签名用在“两个设备建立连接但是未启动加密”的情况下传输认证的数据,数据签名在两个设备需要快速建立连接且快速传输数据的情况下被使用,如果一个client发送的service request使用了签名写入命令,则Server端被认为当前是在使用LE Security Mode 2进行安全通信。

    数据签名需要使用CSRK密钥对数据进行加密,设备双方在配对的过程中,会生成CSRK,LTK和IRK,并且各自保存在security database中。签名数据的传输使用的命令是Signed Write Command,命令格式如图5。

    图5 

    其中12字节的认证签名,内部包含了4字节的SignCounter和8字节的MAC(Message Authentication Code )。SignCounter每发送一次该值会+1,这么设计的目的是防止重放攻击,这也就要求了GATT Server一定要保存所接收到的signed data数据中的SignCounter,以实现防重放攻击的逻辑。签名数据包的格式如图6。

    图6

    如果链路是加密的,也就是使用了security mode 1的安全模式,server收到了client的签名数据,server会执行client的请求,因为加密是向下兼容签名的。

    授权规程:

    “授权”,顾名思义是授予一定的权限去做某事,结合到蓝牙BLE的GATT中,是GATT Server授予某个Client去做某事。在允许client访问数据之前,service可以要求授权,授权是需要用户确认才能继续进行的应用层操作,认证不要求一定要提供授权的功能。授权是在认证成功后,有用户确认是否继续进行的操作。

    授权是在认证的基础上实现的:举个例子,认证成功后,client访问一个配置了授权的数据,则gatt server可以向用户弹出一个对话框,提示用户是否给对方设备授权,用户点击确定,则认为用户对这个设备进行了授权,如果用户选择“取消”,则gatt Server认为对方设备没有经过授权,则不允许当前的访问。

    没有经过认证的GATT Client,可以根据GATT Server返回的error code,发起配对请求,与GATT Server建立认证关系,但是授权则不同,没有经过GATT Server授权的Client,对此无能为力。

    认证和授权的区别:认证是一种安全等级的密钥的分配和使用该密钥加密解密的过程,认证过程中可以不需要用户参与,设备之间根据自身的io capability的配对和绑定;授权是在认证的基础上实现的,当client过来访问server的数据时,会给用户提示,询问用户是否允许client进行访问,或者存在一个授权设备的列表,只允许这些Client设备来访问GATT Server。

    关于授权的内容,在4.2 Core Spec的几个地方有提到。

    GAP章节中:

     GATT章节:

    加密规程:

    central设备(GATT Client)可以使用“the Encryption Session Setup”来加密当前连接。peripheral设备(GATT Server)可以使用“the Slave Initialted Security Request”来发起加密的规程,加密当前连接。

    其他:

    隐私特性:

    隐私特性主要是为了防止被跟踪。监听者可以根据设备的mac地址来跟踪该设备,为了防止被跟踪,设备可以使用随机地址。已配对的设备,可以通过IRK解析出来随机地址就是配对时的设备,但是监听者由于没有IRK,因此无法解析出来设备的mac地址,因此无法进行监听。

  • 相关阅读:
    抓包day3
    js 定时器 Timer
    【JUC】1.CompletableFuture异步编程
    零基础Linux_22(多线程)线程控制和和C++的多线程和笔试选择题
    VUE封装-自定义权限控制指令
    一次 G1 堆大小不均问题的排查及解决
    操作系统之内存的分配与回收——连续分配内存
    火爆全网,22个web自动化测试疑难解答总结,一路狂飙...
    gitlab下载及安装
    2022/08/25 day10:Redis 事务
  • 原文地址:https://blog.csdn.net/wanguofeng8023/article/details/126042505