本节的目标是在一个较高的层次上描述蓝牙设备之间的数据交互操作,不会涉及底层协议的重要知识。主要讲解的内容是一些基本的概念,例如,“设备发现”(device discovery)、跳频(frequency hopping)和“微微网” [1] (piconet)。
“传统蓝牙”规范在2.4GHz的ISM波段上定义了79个信道,每个信道有1MHz的带宽。设备在这些信道中以每秒1600次的频率进行跳转,换句话说,就是每微秒625次跳转。这项信道跳转技术被称为“跳频扩频”(Frequency Hopping Spread Spectrum,FHSS),这时的蓝牙设备中,用户最大可以达到3Mbps的通信带宽,最大约为100米的传输距离。“跳频扩频”通过在射频(Radio Frequency,RF)频谱中快速地移动,针对噪声信道为通信提供鲁棒性(robustness)。
任何通过蓝牙技术进行无线通信的设备,需要通信双方在同一时刻处于同一信道之内,如下图所示。通过协调的方式进行跳频的所有设备可以相互进行通信,它们共同组成了一个蓝牙的“微微网”。“微微网”是两个或者多个蓝牙设备之间使用的基本网络模型。每个“微微网”都有一个“主设备”(master)和一个到七个“从设备”(slave)。“微微网”中的通信是严格在一个“从设备”和一个“主设备”之间进行的。“微微网”中使用的信道跳跃的顺序是伪随机性的(pseudorandom),它只能通过“主设备”的地址和时钟产生。
就像所有的无线协议一样,使用蓝牙进行通信时,也同样需要确认在功率覆盖范围内是否有可能的“接入点”(peer),这个似乎并不难,只要大家同一频率,使用相同的通信协议握手即可,而当使用“跳频扩频”技术的时候,这个问题会变得非常复杂。假定在某一段时间内,有两个蓝牙设备已经在“微微网”中开始交互操作,这当然意味着它们两个设备的跳频的序列是一致的。但是每一个设备同样是“可发现的”(discoverable),这意味着这个蓝牙设备会周期性地广播它的“蓝牙设备地址”(Bluetooth Device Address,BD_ADDR)到其他还没有加入到这个“微微网”的蓝牙设备上,以便这些设备可以通过它的广播找到它。在这种情况下,这个蓝牙设备就必须暂时地停止它在“微微网”中的跳频动作,然后进入“监听”状态,以便监听是否有其他可能的蓝牙设备正在找自己,如果有,则对那些请求做出回应,然后回来找到原来那个跟自己在“微微网”中通信的蓝牙设备,继续之前的通信过程。这种定期检查其他设备是否在找自己的机制,称为“可发现的”。
许多蓝牙设备默认都不是“可发现的”,所以你需要专门开启这项功能,这通常需要一段时间该操作才能生效。在你打开一些以iOS作为系统内核的移动设备的蓝牙配置“设置”(Settings)页面时,系统会默认进入“可发现的”模式,其界面的显示如图7-1所示。如果某设备无视其他设备的“发现请求”(discovery request),或者也不主动寻找其他设备的“发现请求”,那么这个设备就称为“非可发现的”(non-discoverable)设备。要与这种“非可发现的”设备进行通信,唯一的方法就是通过其他一些手段,在拿到它的“蓝牙设备地址”以后,再通过“蓝牙设备地址”进行通信。
图7-1 Apple公司iOS内核的蓝牙设置(进入“可发现的”模式)
在一个蓝牙网络中,可能使用着的协议数量足以令人咋舌。这些协议通常可以分成两类:一种是在“蓝牙控制器”(Bluetooth controller)之间通信使用的,另一种是在“蓝牙主机”(Bluetooth host)之间通信时选择使用的。因为本书属于无线网络安全的主题,所以上面所说的“蓝牙主机”就是我们从笔记本电脑上运行攻击程序所攻击的对象。“蓝牙控制器”则是内置在笔记本电脑里的USB芯片组(chip),或是USB加密狗(dongle),接受“蓝牙主机”的命令,并解释执行这些命令。
图7-2显示了蓝牙协议栈中各层(layer)的组织结构,以及在每一层中,具体实现了哪些协议。从图中可以看到,“蓝牙控制器”负责跳频,基带封装(baseband encapsulation)并且将适当的结果返回到“蓝牙主机”。“蓝牙主机”负责处理更高层的协议,尤其是“主机控制接口”(Host Controller Interface,HCI)连接,它是“蓝牙主机”(你的笔记本电脑)和“蓝牙控制器”(你的蓝牙适配器中的芯片组)之间的通信接口。
图7-2 蓝牙主机和控制器之间的交互
在和蓝牙打交道的时候,需要把这个“蓝牙主机”/“蓝牙控制器”的模型放在你的脑海中。但作为黑客,我们最渴望的是对设备绝对的控制权,以便于可以操纵它的行为。如果将图7-2中的“蓝牙控制器”部分从整个模型中分离出来,那就意味着对于“蓝牙控制器”控制的那部分功能,我们都只能任由摆布而无可奈何。无论我们想让“蓝牙控制器”做什么,比如“始终保持在信道6上,不要再接收后面的包”,除非将这些要求转换为一系列的“主机控制接口”请求,或者通过另一种方式实现这些功能,否则无法达到预期的目的。最终导致我们对于这个无线设备没有那么多的控制能力。
(1)射频通信协议
“射频通信协议”(Radio Frequency Communication,RFCOMM)是蓝牙设备中采用的传输协议,使用该协议的蓝牙设备,一般是那些需要稳定的基于“流”(streams-based)的传输,这点和TCP协议很相似。“射频通信协议”被广泛应用于模拟串口通信,向电话设备发送AT命令集(又称“Hayes命令集” [2] ),在“对象交换协议”(Object Exchange,OBEX)协议上传输文件。
(2)逻辑链路控制及适配协议
“逻辑链路控制及适配协议”(Logical Link Control and Adaptation Protocol,L2CAP)是基于数据报文(datagram-based)的协议,该协议主要用于传输更高层的协议,比如“射频通信协议”和其他上层协议。一个应用层的程序员可以将“逻辑链路控制及适配协议”作为一种传输层协议使用,由于它是基于数据报文的,所以它的运行和UPD协议的运行很相似,是不可靠的连接方式,采用的是基于消息的数据传送机制。
(3)主机控制接口协议
如前面所说,蓝牙标准规定了使用“主机控制接口协议”的接口层来控制蓝牙芯片组,这些芯片组就是上面提到的“蓝牙控制器”。对于开发者来说,要访问标准蓝牙硬件的协议栈,远程“友好设备”(device-friendly)名称检索,连接建立以及终止,“主机控制接口协议”位于他们所能访问到的协议栈的最底层。
(4)连接管理器协议
“连接管理器协议”(Link Manager Protocol,LMP)位于“蓝牙控制器”协议堆栈的顶部,通过特定的硬件才能够访问它,换句话说,没有特定的硬件,这个协议是不可访问的,因此“连接管理器协议”主要用于处理那些“低层次加密”(low-level encryption)、信息验证(authentication)、数据配对(pairing)等操作。虽然通过控制“蓝牙主机”也可以完成这些功能,并可以明确地请求这些操作,但是“蓝牙控制器”的职责就是决定应该发送哪种类型的数据包,以及如何处理结果。
(5)基带层
和“连接管理器协议”层类似,开发者在没有特定硬件工具的前提下,是无法访问基带(baseband)层的。蓝牙的基带层主要规定了空中传输的参数(比如传输的速率),数据包最终在哪一层是形成帧,以及确定传送和接收的信道。
(6)蓝牙设备地址
“蓝牙设备地址”是一个48位(共6个字节)的数据,如下图所示,由三部分组成。
·非必要地址部分 “非必要地址部分”(Nonsignificant Address Part,NAP)有16位长度,位于“蓝牙设备地址”的前16位,是“组织唯一标示符”(Organizationally Unique Identifier,OUI)的一部分。这一部分被称为“非必要”的原因是这16位不会在跳频和其他蓝牙派生函数中使用。
·高位地址部分 “高位地址部分”(Upper Address Part,UAP)有8位,是“组织唯一标示符”的后8位部分。
·低位地址部分 “低位地址部分”(Lower Address Part,LAP)有24位,用来标识一个独一无二的蓝牙设备。
不像其他的无线协议中地址是公开并广泛使用的参数,在蓝牙网络中,“蓝牙设备地址”是作为一个秘密信息,不对外公开的。在以太网以及Wi-Fi无线网中,数据帧中都包含有地址,而在蓝牙通信中,“蓝牙设备地址”并会不包含在数据帧的头部进行传输,从安全的角度,这样就防止了攻击者使用侦听技术轻而易举地发现“蓝牙设备地址”的值。更为巧妙的是,恰恰是没有“蓝牙设备地址”信息,所以攻击者很难发现网络中正在使用的跳频规律,从而更增加了数据通信数据包的侦听难度。
“蓝牙技术联盟”(Bluetooth Special Interest Group,SIG)是一个负责定义蓝牙规范的国际组织。除了结构化的各层蓝牙协议栈之外,“蓝牙技术联盟”还规定了多种用户层的协议规范(application-layer profile)。这些协议为使用蓝牙提供了额外的功能和安全机制。这些协议规范可以在本机上编程实现,也可以不通过特定的硬件就可以随意地操纵它们。这些协议规范包括“服务发现协议”(ervice Discovery Protocol,SDP),“高级音频分发规范”(Advanced Audio Distribution Profile,A2DP),“蓝牙耳机规范”(Headset Profile,HSP),“对象交换规范”以及“个人局域网规范”(Personal Area Network Profile,PANP)。
加密和认证是直接包含在蓝牙标准规范中的,它直接在“蓝牙控制器”的芯片组中实现,这对于使用者和开发者来说是一种节约成本的措施。加密和认证使用与否是可选的,协议的开发商可以既不认证,也不加密;或者二者选择其中之一;或者两者皆用。
蓝牙的认证或者使用“传统配对”(traditional pairing)方式,或者使用在“蓝牙2.1规范”(Bluetooth 2.1 specification)中新设计的“安全简化配对”(SSP)方式。下面的内容中,我们将会讲解这两种认证机制。
1.传统配对
在当前大多数的蓝牙设备上,尽管“传统配对”认证的交换方式仍然在使用,但在“蓝牙2.1规范”中,“传统配对”方式被“安全简化配对”方式所取代。在使用“传统配对”方式中,当两个设备第一次相遇的时候,它们会完成一次配对交换,在这个过程中,每个蓝牙设备都从“蓝牙设备地址”中会派生出一个“安全密钥”(security key)、一个“个人识别号码”(personal identification number,PIN),以及一个随机数,其中的“安全密钥”又称为“连接密钥”(link key)。当交换过程结束的时候,两个设备都会将“连接密钥”信息存储在本地的“非易失性存储器”(local nonvolatile memory)中,以便在之后的认证交换中使用,以及需要使用的时候,用来派生“加密密钥”。
如果一个攻击者捕获到用于派生“连接密钥”的“传统配对”方式交换过程,同时也捕获了随后的认证交换过程,那么他随后攻击所选择的“个人识别号码”是完全有可能的。通常来讲,这是通过“个人识别号码”的“暴力攻击”(brute-force attack)来实现的,也就是通过猜测的“个人识别号码”计算,生成一个可能使用的“连接密钥”,随后将本地计算的认证结果同合法交换过程中的结果进行比较,最终检验所猜测的“个人识别号码”是否正确。详细的计算过程和攻击技术细节,我们会在第10章中进行讲解。
2.安全简化配对
在我们刚刚介绍的“传统配对”策略中,存在的最大问题就是这个实施被动式攻击的攻击者在捕获配对数以后,能够迅速地还原得到“个人识别号码”和存储的“连接密钥”。如果这个攻击者成功地拿到“连接密钥”,那么他就可以通过蓝牙网络解密所攻击的这一对蓝牙设备上的所有数据包交换,还能伪造合法设备参与其中。“安全简化配对”方式则会阻止这种被动式攻击的攻击者获得“连接密钥”,并且对于不同的蓝牙设备类型,提供多种认证选项。
“安全简化配对”方式通过采用“公钥密码学”(public key cryptography)的策略来改善蓝牙认证交换过程中的安全性,特别是通过“Diffie-Hellman [3] 椭圆曲线密钥”(Elliptic Curve Diffie-Hellman,ECDH)算法实现交换机制。一次Diffie-Hellman的密钥交换允许两台对等的蓝牙设备先交换“公钥”(public key),然后从中派生出一个“共享密钥”(shared secret),这个密钥对于捕获者来说是无法再生成的。这个产生出来的密钥被称为DHKey(即Diffie-Hellman key)。最终“连接密钥”由DHKey派生,并在随后的认证和加密过程中使用。
通过DHKey交换算法的使用,一个强大的“熵池” [4] (entropy pool)可以用来派生双方设备上的“连接密钥”。这个强大的“熵池”解决了“传统配对”派生中最大的问题,那就是在“熵池”,每一个单一的资源只是一个很小的“个人识别号码”值。
在介绍完了蓝牙技术的组成之后,我们就可以以攻击者的视角来讲解蓝牙了。同样我们会讲解各种攻击蓝牙技术的方法,深度挖掘支持这一全球标准的各相关技术和组件。
[1] piconet,用蓝牙技术把小范围内装有蓝牙通信模块的各种设备组成的微型网络,其范围一般在10~100米,俗称“微微网”。——译者注
[2] 早期数模转换设备中,最早的调制解调器Modem就是Hayes公司(中文名称“贺氏”)发明的,不过,Hayes在完成自己的使命以后,就退出了历史舞台,尽管如此,之后的Modem都统统宣布“贺氏兼容”。该调备的通信命令都以“AT”(即Attention)开始,所以统称AT指令集。现在这个指令集仍然广泛使用。——译者注
[3] Diff ie-Hellman 由Whitf ield Diff ie和Martin Hellman在1976年公布的一种密钥一致性算法。该算法是一种建立密钥的方法,而不是加密方法。——译者注
[4] 熵是信息论里的概念,简单地说,就是信息有效性的程度。比如“这个密码由4位数字组成”,那么这个信息相当于告诉你这个密码共有10000种可能,而“这个密码是我生日的4位数字”,那么这个信息相当于告诉我们这个密码只有366种可能。——译者注