一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:460500587
微信公众号:计算机与网络安全
ID:Computer-network
在2010年“蓝牙技术联盟”(Bluetooth Special Interest Group,SIG)刚刚推出低功耗蓝牙规范后,“低功耗蓝牙”(Bluetooth Low Energy)的设备就尾随而至。与前面几代蓝牙设备不相同的是,“低功耗蓝牙”设备更节能,因此,适用于大量垂直市场和应用。对于像“基本速率蓝牙”(Bluetooth Basic Rate,BR)和“增强数据速率蓝牙”(Enhanced Data Rate,EDR)设备这样的“传统蓝牙”类型来说,这些低功耗的功能都是不切实际。
在早期的蓝牙设备中,对于物理层的设计,通常首要考虑的因素是通信效率的优先,即使对于像“射频干扰”(Radio Frequence interference)这样的环节也不例外;而“低功耗蓝牙”设备在设计的时候,考虑因素是在实现了“射频干扰”的鲁棒性前提下,通过更简单的无线通信机制来实现整体性能的提升。流线型的连接建立的做法,固定频率的自我广播信道和一个不太复杂、成本也不太高的“栈”,在实现方式上都为“低功耗蓝牙”的成功提供了重要的保障。
虽然使用条件总是在决定电池的寿命上起着重要的作用,但“蓝牙技术联盟”声称,通过一个纽扣电池,“低功耗蓝牙”设备可以使用几个月到几年。这个重要的因素会在很多领域给“低功耗蓝牙”带来一个新的市场机会,比如在体育和健身设备领域、健康和保健的应用领域、电子消费领域和可穿戴计算设备领域。同时,在不久的将来,我们期待的“低功耗蓝牙”的成功会使“低功耗蓝牙”在其原有领先的领域内继续起到行业引领作用,如在汽车制造领域、医疗保健领域和智能家居产业领域。
在“低功耗蓝牙”早期的成功案例是Apple公司的iBeacon产品。它采用“低功耗蓝牙”技术,首先将“室内定位跟踪”(indoor location tracking)和“消息机制”(messaging mechanism)嵌入在全球数以百万计的Apple的iOS内核设备中。Apple公司和“蓝牙技术联盟”的友好合作强调了一个重要的现实,即“低功耗蓝牙”非常容易集成到各个设备中,这个现实也直接影响到了“低功耗蓝牙”的成功。作为竞争对手的ZigBee和IEEE 802.15.4技术(低速率无线个人局域网),从能量守恒的角度虽然更有效,但是对“低功耗蓝牙”的支持已经“先入为主”,成为大多数移动设备用户的强制性要求。使用相同的天线和软件特性,利用修正后的蓝牙芯片,就可以为“低功耗蓝牙”提供应用上的支持,并且是直接针对移动手持设备制造商的,这无疑会继续让移动手持设备制造商增加对这项技术的采用程度。
在这里主要介绍“低功耗蓝牙”设备背后基本的技术细节,着重强调的是“低功耗蓝牙”设备和“传统蓝牙”设备之间的不同。我们会核实一些“低功耗蓝牙”的关键应用,当然肯定会包括Apple公司的iBeacon,同时也会对识别和评估“低功耗蓝牙”安全方面的工具和技术进行详细的分析。
我们一直说的“低功耗蓝牙”设备,或者使用它的简称“BLE”,其实是在描述一个基于“蓝牙4.0规范”(Bluetooth 4.0 specification)的蓝牙设备,而这个4.0版本的蓝牙规范主要是通过一个更简单的物理层结构来改善并提升电池寿命。在其他市场材料方面,也能见到使用了“低功耗蓝牙”技术。“智能蓝牙”(Bluetooth Smart)是“蓝牙技术联盟”为了保证程序的兼容性,而提出的一种叫法,并不是这里提到的“低功耗蓝牙”。
一、低功耗蓝牙技术概述
“低功耗蓝牙”是蓝牙技术以另外的方式进行演化的过程中的一次颠覆性改变。早期“基本速率蓝牙”1.2设备的设计速率是1Mbps,后来“增强数据速率蓝牙”2.0设备的设计速率达到了3Mbps。“高速蓝牙”3.0的技术进一步扩展蓝牙协议,通过在Wi-Fi上跑蓝牙,使其达到了蓝牙的高速访问,甚至被称为“交替使用介质访问层/物理层的蓝牙”(Bluetooth Alternate MAC/PHY,AMP)。蓝牙在速度上步步提升,根据这种趋势,似乎最终要与Wi-Fi一决高下了。然而,蓝牙4.0就是我们现在要介绍的“低功耗蓝牙”,其数据传输的速率,突然“峰回路转”,又回到了1Mbps的原点。
在摒弃传输速度不停增长的大趋势背景下,“低功耗蓝牙”开辟了在低功耗应用的新机遇。这时,这个“另外的方式”不再试图追求更快的数据传输速率,转而向使用蓝牙进行通信的软硬件开发者提供了一个新的替代品。这个替代品意义重大,同样能产生高的效益,那就是:较低的电池利用率。
“低功耗蓝牙”的设计旨在给开发者和消费者一种能力,也就是通过一个硬币大小的电池提供相当长的一段时间,在这段时间里,在保证效率的前提下,提供设备以轻量级的数据传输。因为“传统蓝牙”已经提供了功率守恒的特性,所以“低功耗蓝牙”的设计中,除了保持这一优点,还为一系列新的应用和设备创建了一种强大的使用机会,使这些应用和设备都能充分利用这一机会。
因此,在蓝牙技术重点的这一次转移过程中,“低功耗蓝牙”与以前版本的蓝牙规范有显著的不同。“低功耗蓝牙”所进行的重大变化不仅体现在底层物理层的操作特性中,而且还体现在上层设备发现和数据交换行为中。
1、物理层的行为
“低功耗蓝牙”仍然使用2.4GHz频谱,通过“高斯频移键控”(Gaussian Frequency Shift Keying,GFSK)进行调制,这一点和“传统蓝牙”中的“基本速率传统蓝牙”是一样的。此外,“低功耗蓝牙”也使用“跳频扩频”技术来避免干扰。不过,与“传统蓝牙”不一样的是,“低功耗蓝牙”的频率跳转非常简单,并且设备在跳频期间占用某一个信道的时间也更长了,其实就是在每个信道的停留时间(dwell time)更长了。并且,从设备软硬件的实现角度来看,通过“低功耗蓝牙”的跳频方式也是更简单,比如,在“低功耗蓝牙”中,系统共使用了40个信道,其中允许跳频的信道有37个,还有3个信道专用于发送“通告数据”(advertising)。
为了最大限度地节能,“低功耗蓝牙”设备的发射功率限制为10mW。这有限的发射功率使设备达到一个合理的传输距离,那就是10米左右。不过,这时的系统却可以保持在一个较低的整体功率预期之内。
2、操作模式和连接的建立
“低功耗蓝牙”一共可以从五种远程操作状态中,选择其中之一作为当前的操作状态。
待机状态(Standby State)在待机状态,一个设备不再接收和发送数据包,此时的功耗最小,对设备来说,也是最节能的状态,这时允许设备关掉发送和接收接口。
通告状态(Advertising State)一个处于通告状态下的设备将定期在其配置的“通告信道”(advertising channel),以所配置的速率值发送“信标通告”(beacon advertisements)。该速率的变量名为“Beacon_Max_lnterval”,一般情况下,该值设置为1秒或2秒。处于“通告状态”的设备一般也被称为“通告者”(advertiser)。
扫描状态(Scanning State)当设备处于扫描状态时,“低功耗蓝牙”设备会监听“通告信道”中有哪些设备处于“通告状态”。处于“扫描状态”的设备一般也称为“扫描者”(scanner)。
初始化状态(Initiating State)一个设备处于“初始化状态”,那么它会监听特定设备所发的通告,一旦有设备发出通告,就会回复这个设备,并在随后建立一个连接。处于“初始化状态”的设备一般也称为“初始化者”(initiator)。
连接状态(Connection State)设备可以从“初始化状态”或“通告状态”转换到“连接状态”,完成这一操作的设备,既可以是“主设备”,也可以是“从设备”,两个角色都允许。
“主设备模式”(master mode)“主设备模式”下的设备初始化一个到特定目标设备的连接,又称为“发起方模式”(initiator mode)。
“从设备模式”(slave mode)“从设备模式”下的设备接收来自“主设备”的查询连接,并将其应用于一个需要认证的阶段,以便完成连接的进程。
这个专为设备操作模式而定义的结构,被灵活地借用到产品设计上,以便降低复杂性。例如,对于一个设备,如果只扫描处于“通告状态”的“低功耗蓝牙”设备是不是存在,那么这个设备就完全没有必要具备发射功能,这样做可以降低电池消耗量,最大程度减少设备成本。
要在两个“低功耗蓝牙”设备之间创建一个连接,“扫描状态”的设备会在“通告信道”里察看信标通告,然后决定要连接的目标设备。当接收设备选择好,“扫描状态”的设备就发送连接请求。在这一点上,回复的设备就会协商连接参数并同“主设备”建立一个连接。在连接建立之前,这个回复的设备的身份还不是“从设备模式”。
3、数据帧的配置
“低功耗蓝牙”使用有限的“有效载荷”(payload)的大小作为其整体节能策略的一部分,该“有效载荷”的长度为2~39字节。基本的“低功耗蓝牙”数据帧是由“前导码”(preamble)、“访问码”(access code)、“有效载荷”和“循环冗余校验”(Cyclical Redundancy Check,CRC)校验码组成。其中的“访问码”有时称为“访问地址”(access address)。整个结构如下图所示。
“低功耗蓝牙”数据包中,“有效载荷”长度的变化取决于“访问地址”的值和接收设备的状态。例如,一个数据包如果遵循“逻辑链路控制及适配协议”,那么它的内容就是一个长度是16位的头部,后面跟着变长的“有效载荷数据”(payload data),然后是一个可选的“信息完整性检查码”(Message Integrity Check,MIC)。这时,这些数据头部的各个字段意义分别如下:
逻辑链路ID(Logical Link Identifier,LLID)字段“逻辑链路ID”进一步说明了这个“有效载荷”数据的作用。比如0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容。
下一个期望的序列号(Next Expected Sequence Number,NESN)字段“下一个期望的序列号”是用于对接收到的数据包进行确认。
序列号(Sequence Number,SN)字段“序列号”主要用于发送数据包时,接收方确认该值是针对于“下一个期望的序列号”的下一个数据包。
更多数据(More Data,MD)字段“更多数据”主要是为了说明发送方是否还有要发送给接收者的数据。
保留字段(Reserved)未使用的位,虽然目前没有使用,但建议都填成“0”。目前接收者会忽略该位。跟在“长度”字段后面也有个“保留”字段,意义与此相同。
长度字段(Length)“长度”字段表示的是包含“信息完整性检查码”在内的“有效载荷数据”的长度,以字节为单位的。
这种数据帧的格式更详细地显示如下所示。
同样,一个“通告”数据包的有效载荷使用的也是一个16位的头部,后面跟的是通告的有效载荷数据,其完整的描述如下:
类型字段(Type)有效载荷内容的类型,通过这一字段确定该数据包是一个“通告”数据包,也可以是一个扫描请求或响应,或者是一个连接请求。“类型”字段中,大部分可能的值都会保留,以供将来使用。其中的“通告”数据包包括“有向通告”(directed advertisement)、“广播通告”(broadcast advertisements)、“非连接通告”(nonconnectable advertisement)或“通告征集扫描”(advertisement solicitation scan)。
发送地址字段(TX address)这个1位字段表示如果发送方将正在使用的生成的MAC地址用作私用,那该位就为“1”,否则如果MAC地址可以被无线接口使用,则该位就为“0”。
接收地址字段(RX address)这个1位字段意义同“发送地址”字段意义一样,但是应用于接收地址上。
有效载荷长度字段(payload length)这个6位字段指的是“有效载荷数据”(payload data)的长度(不包括头部内容的长度)。值得注意的是,尽管这个值在填写的时候,最大可以填到63个字节(26-1),但实际有效的值是0~37。
保留字段(Reserved)未使用的位。在“通告信道”头部,这个位是保留的,并且建议目前都填成“0”。注意,共有两个“保留”字段,一个在“类型”字段后面,另一个在头部的最末端,二者意义相同。
这种数据帧的格式更详细地显示如下所示。
“蓝牙规范”4.0中,描述了“逻辑链路控制及适配协议”有效载荷数据的格式,包括所有定义的数据帧类型的格式。就像前面各版“蓝牙规范”一样,“逻辑链路控制及适配协议”层句柄的数据被编码到顶层协议中。但与前面各版“蓝牙规范”不同的是,“低功耗蓝牙”中,“逻辑链路控制及适配协议”并不提供“重传”(retransmission)、“碎片整理”(fragmentation)、“数据重组”(reassembly)等功能,这样做的目的是为了在一个简单的协议栈中实现最基本的功能。“逻辑链路控制及适配协议”规范在蓝牙4.1设备中又得到了进一步扩展,新加了对带有“流量控制”(flow control)的“面向连接信道”(connection-oriented channel)的支持。
4、蓝牙支持协议规范
就像以前版本的蓝牙规范,“低功耗蓝牙”设备所提供的设备配置文件服务具有良好的结构,简化了蓝牙栈的实现。“逻辑链路控制及适配协议”的服务作为底层的基础,介于链路层规范和上层协议之间。
“属性协议”(Attribute Protocol,ATT)通过“逻辑链路控制及适配协议”的信道,用于传递少量数据。包括设备在功能形成时的数据交换。
“通用属性协议”(Generic Attribute Protocol,GATT)在“属性协议”的顶部,“通用属性协议”提供了一个用于对“属性服务器”(attribute server)和“属性客户端”(attribute client)实现“服务发现”、读取属性、写入属性的操作。
“安全管理协议”(Security Manager Protocol,SMP)用于在一个连接的“逻辑链路控制及适配协议”信道上,交换设备之间与安全相关的数据。
“通用访问配置文件”(Generic Access Profile,GAP)代表了“低功耗蓝牙”设备的基本功能,包括完成设备发现,启动和完成连接,完成服务发现的能力。
“低功耗蓝牙”协议的功能使用了基本的数据结构定义。这种结构定义可以适应众多厂商使用蓝牙技术的要求。比如,一个供应商实现了一个“低功耗蓝牙耐体温监测系统”,那么他就可以使用“通用属性协议”的特性定义一组数据,然后发送到接收设备上,该系统可以唯一地识别出这些数据,各数据之间可以相互区分开来。这个功能已经被用于蓝牙广告产品“Apple iBeacon”中了,在该产品中,Apple公司使用了针对iBeacon的特定属性定义这个协议。这使得Apple公司可以创建一个与其他厂商的竞争或合作协议。
5、低功耗蓝牙的安全控制
作为“通用访问配置文件”的这些属性,“低功耗蓝牙”提供了新的功能,用于通过物理层的无线接口(air interface)或者是高层的“属性协议”,保护机密性和数据完整性。产品设计师可以选择实现那些安全的功能,因为这些功能最适合他们的产品需求组合:没加密没认证、有认证但没有加密、既有加密也有认证。此外,“低功耗蓝牙”实现了私有人增强功能,对黑客通过拿到的“蓝牙设备地址”破解用户本地数据的攻击,具有减轻此类攻击的能力。
(1)加密和信息认证
“低功耗蓝牙”使用“高级加密标准-计数模式和密码块链消息认证码协议”(AES-Counter Mode Cipher Block Chaining-Message Authentication Code Protocol,AES-CCMP),采用128位密钥进行加密和完整性保护。这种加密支持力度类似于IEEE 802.11规范中的WPA2,所以该认证的全称是“基于‘高级加密标准-计数模式和密码块链消息认证码协议’的‘Wi-Fi保护访问下的预共享密钥版本2’认证”,简称WPA2 AES-CCMP。
使用加密“和”/“或”认证的决定,是由软硬件开发人员和“低功耗蓝牙”安全模式共同选择的。
1)安全模式1
“低功耗蓝牙”的“安全模式1”运行在无线的物理层接口(air-interface layer),提供三选一的安全级别:
安全模式1的级别1:不加密不认证。
安全模式1的级别2:通过未经认证的配对后衍生出的一个密钥;在密钥衍生之后,设备就加密数据。
安全模式1的级别3:通过经验认的配对后衍生出的一个密钥;跟在加密数据的后面。
安全模式1所使用的加密,依靠产品设计师选择实现的级别。但是该模式并没有使用消息真实性的检查,使其很容易受到“中间人的畸形数据”(malformed data man-in-the-middle)攻击和“重播”攻击(replay attack)。
2)安全模式2
安全模式2运行在“属性协议”层,主要提供对上层的支持,用于一个或两个安全级别上,提供完整性保护上的“数据签名”(data signing)。
安全模式2的级别1:通过未经认证的配对后衍生出的一个密钥;在密钥衍生之后,数据包的“有效载荷数据”是加密的,并且有效地使用了一个“消息认证码”(Message Authentication Code,MAC)。
安全模式2的级别2:同“安全模式2的级别1”一样,不同的是,设备必须是通过认证的配对。
在“安全模式2”的任一级别上操作,在信息的接收方会使用一个“消息认证码”验证数据的完整性。“消息认证码”的使用减轻了“中间人的畸形数据”篡改攻击的威胁,但这并不能减轻“重播”攻击。幸运的是,蓝牙规范也要求使用重播计数器,而在“安全模式2数据帧”下,重播计数器作为“消息认证码”MAC计算的一部分,如下所示。
“签名计数器”(signature counter)字段从零开始,每发送一个数据包,“签名计数器”都会自动增加1。接收设备验证数据包中的这个签名,是用实测的有效载荷内容计算“消息认证码”,然后再用计算出来的这个“消息认证码”和观察到的“消息认证码”作比较,如果这两个值是匹配的,那么接收方检查“签名计数器”的值,来保证数据以前没有看到过,以避免“重播”式攻击。如果“签名计数器”的值大于最后观察到的“签名计数器”的值,那么这个数据包的处理和接收方就会记录观察到的“签名计数器”,以便以后验证使用。
(2)私有特征
“低功耗蓝牙”规范引入很多只有这个版本才具有的“私有特征”(Privacy Feotur),这样做的目的就是为了使攻击者在一段时间内破解一个蓝牙设备变得更困难。比如,在以前的版本中,对于任意一个蓝牙设备,它在所有的连接中都会使用相同的“蓝牙设备地址”,这个地址不妨称为“静态地址”,而在“低功耗蓝牙”规范中,蓝牙设备使用一个生成的地址取代以前定义好并分配的“静态地址”,并持续一段时间。“私有特征”共支持两种生成的地址:
可以解析的“私有地址”(resolvable privacy address)设备可以选择生成一个“私有地址”,这个地址可以反推出“静态地址”,与该设备共享一个加密的密钥。要解析这个私有地址,允许客户端设备对每一个连接都产生一个新的“私有地址”,但是在与通信的另一个蓝牙节点之间,却是通过“静态地址”维持认证关系。
不可解析的“私有地址”(non-resolvable privacy address)不可解析的“私有地址”的使用情况是:在蓝牙设备建立连接的时候,连接的发送方并不想把“静态地址”透露给连接的接受方。因此不可解析的“私有地址”无法反推出“静态地址”。
二、扫描和侦听
对于“低功耗蓝牙”功能的设备,您可以通过扫描和枚举找到这些“低能耗蓝牙”,并将其列为目标设备。目前,有许多能够发现和列举“低功耗蓝牙”设备的工具还不太稳定,也不太可靠,不过,随着“低功耗蓝牙”设备越来越多,这些工具可能会变得越来越稳定,功能越来越丰富。
1、Android系统下的设备发现
Android版BlueScan软件可以使用“低功耗蓝牙”的接口,能够扫描和识别设备的基本信息。选择“低功耗扫描”(Low Energy Scan)提示条上面的“开始扫描”(Start Scan)按钮,程序就开始扫描,这个按钮也会自动变成“停止扫描”(Stop Scan),扫描的结果会记录到本地的数据库文件中,其界面效果如图1所示。
图1 BlueScan软件的“低功耗扫描”结果截图
BlueScan软件会记录蓝牙的“设备供应商名称”(这个值是通过MAC地址中的“组织唯一标示符”推算出来的)、“设备类型”(是“双模”类型还是只有“低功耗”类型)、“设备的友好名称”(device-friendly name)和接收到的“信号强度信息”(signal strength information)。在扫描到的结果列表中,单击某个扫描到的设备,可以列出该蓝牙设备的详细信息,包括“设备地址”和“历史扫描结果”(historical scan result),比如观察到的“接收信号强度指示”信息和“全球定位系统”坐标信息,如图2所示。
图2 BlueScan扫描到设备的详细视图
如果单击图1上的“数据库”(Database)按钮,BlueScan程序的显示界面就会由“实况扫描”切换到“历史扫描数据”上。在这个视图中,“数据下载”(Download Data)的按钮变成了可用状态,允许您取得数据库中的内容,并将其上传到其他应用服务中,比如上传给电子邮件的客户端程序,上传给Dropbox程序,上传给“谷歌驱动”程序(Google Drive),或者随便实施其他各种共享的操作。
2、iOS系统下的设备发现
与Wi-Fi扫描不同,Apple公司允许第三方应用程序开发人员使用蓝牙系统的“应用程序接口”来创建蓝牙设备扫描程序。“基于iOS系统的‘低功耗蓝牙’扫描器”(iOS app BLE Scanner)可以用来扫描“可发现的”模式下的蓝牙低功耗设备,并读取到“设备名称”“接收信号强度指示”和“通用唯一标识符”(Universally Unique Identifier,UUID),这些信息都是从“通用属性协议”服务中获取的,如图3所示。
图3 基于iOS系统的“低功耗蓝牙”扫描器的扫描结果
“基于iOS系统的‘低功耗蓝牙’扫描器”可以提供“可发现的”节点的基本信息,但却无法读取到该蓝牙设备上与所提供服务有关的更多信息。一个可选的iOS系统上的app应用程序名叫LightBlue,这款程序是通过“低功耗蓝牙发布的“通告信息”读到“信号强度”信息,并列举了“设备属性”,如图4所示。
图4 通过“通告信息”读取到的结果
虽然这些工具都可以用来发现和列举“低功耗蓝牙”设备,但是它们的能力都很有限。不过,要拿到“可发现的”设备的详细信息,我们可以使用Linux操作系统下包括在BlueZ开发包中的一些工具试试。
3、Linux系统下的设备发现和枚举
您可以使用BlueZ开发包中的hcitool工具发现处于“可发现的”模式下蓝牙设备的存在状况。在那里,要扫描“基本速率蓝牙”设备和“增强数据速率蓝牙”设备,需要使用一些参数,而在“低功耗蓝牙”的扫描中,不再需要那些参数,而只需要使用“lescan”参数,就可以扫描到这些低功耗的蓝牙设备。这个hcitool工具有个bug,即当您通过使用“lescan”参数使用hcitool命令时,经常会返回一个错误,不用管这些错误,再次重新运行这个命令,有时甚至需要多次重新运行这个命令,才能完成正常的低功耗设备扫描。如下面的例子所示。
与直接使用“hcitool scan”命令不同,当带上“lescan”参数以后,那么hcitool工具就在扫描和识别蓝牙设备,并对每一个“可发现的”蓝牙设备的扫描结果重复显示好几次。如果要将hcitool工具输出的内容重定向到文件中,并且每隔一分钟或几分钟,就中断一下扫描过程,那么就可以通过该文件查看扫描结果,不过,鉴于这个文件里有很多重复的扫描行,所以可以通过排序功能,从扫描结果中对每一种结果中各取一行,最终生成一个没有重复行的扫描结果,如下所示:
在这个输出结果中可以看到有些设备的重复信息,比如说,“蓝牙设备地址”为90:59:AF:28:17:A2的设备共出现了两次,第一次显示设备名称为“活动力监控器”(Activity Monitor),第二次显示的则是一个“(未知)设备”(unknown)。对于这样的扫描结果,您可以通过“可发现的”设备,借助于“蓝牙设备地址”进行服务枚举的扫描,以便获得更详细、更准确的内容。
在hcitool工具,通过“lescan”参数的输出数据中,那个“蓝牙设备地址”为90:59:AF:28:17:A2的设备是一个“iHealth牌活动力监控器”(iHealth Activity Monitor),设备实物图如图5所示,主要用于记录佩戴者所走的“步数”、“卡路里的消耗值”(calories burned)、“所走的距离”(distance traveled)和“睡眠的程度”(sleep pattern)。本设备会不停地在“通告信道”中“通告”(advertise)它的“蓝牙设备地址”,即使和某一个目标设备配对成功,该操作也不会停止,这样做显然使该设备很容易被识别和扫描。
图5 iHealth牌活动力监控器
对于Linux操作系统最新版本的BlueZ工具包中,包含了一个名为gatttool的工具软件,该软件可以列举一个“低功耗蓝牙”设备上的服务和个性化特点。这款gatttool工具可以在命令行中使用,也可以以交互的模式查询目标设备上的主要服务,其命令行的运行效果如下所示:
如果作为目标的蓝牙设备出于安全考虑,使用了一个随机地址作为自己的“蓝牙设备地址”,那么您需要在上面命令行的最后,加上一个“-t random”的参数告知gatttool程序。
对于gatttool程序来说,命令行版本的输出和交互式版本的输出,其结果和格式都是相同的。两者都可以显示出这个蓝牙设备上四个主要的服务。其中的服务信息,在显示的时候,是以“通用唯一标识符”格式显示的。“通用唯一标识符”格式所表示的是由标准的16位“通用属性协议”服务码组成的,该服务器又是通过“蓝牙技术联盟”定义的。这16位“通用属性协议”服务码定义如下所示。这些服务码中,每一位所代表的具体意义,可以通过“蓝牙技术联盟”的“开发者门户网站”(Developer Portal site)进行查询。由“iHealth牌活动力监控器”所展示的这四个“主要服务”信息的详细描述见表1所示。
表1“iHealth牌活动力监控器”设备主要的服务信息
除了“主要服务”信息,还可以识别目标设备的“服务特性”信息(service characteristic)。命令跟上面的命令一样,不过要获取服务特性,就不能使用“--primary”参数了,因为这个参数是读取服务信息,而要将参数换成“--characteristics”,其格式和效果如下所示:
“通用唯一标识符”信息是从上面带有“--characteristics”参数的“特性扫描”返回的。显示的格式和前面“主要服务”信息格式一样,同样是以16位的值作为“服务分配码”。这个特性模式下的“服务分配码”和“服务描述”显示如表2所示。为了格式的紧凑、节省显示的空间,其中“通用唯一标识符”这一列已删除掉了。
表2“特性服务”信息列表
有了“主要服务”信息,您可以继续评估目标设备,通过“--char-read”参数,可以拿到与每一个“通用唯一标识符”关联的信息。其显示效果如下所示:
在这个例子中,我们从“通用唯一标识符”中“服务分配码”为0x2a00的“服务描述”得知这个“服务分配码”的意义是:这是一个“设备名称”(Device Name),然后我们就可以从这个“服务分配码”中读信息了。结果读到的是一串十六进制的数字,这些十六字节的数字代表的是设备名的ASCII码,我们可以通过Python进行解码,可以看到解码后的内容是“Activity Monitor”。当我们评估目标设备时,我们应该测试所有返回的“通用唯一标识符”,这样可以识别潜在的信息泄露威胁。对于这个iHealth设备,一些“通用唯一标识符”返回基本信息,反之就返回其他的错误信息(就像目标设备所需要的认证状态可以获取一些敏感信息),如下所示:
关于“iHealth牌活动力监视器”的一个有趣的属性是,这个在特性列表中的设备使用一个保留的“通用唯一标识符”(“服务分配码”为0x2a30)。从这个“通用唯一标识符”返回的数据是一个ASCII字符串,内容是“com.jiuan.AMV10”。这个域名“jiuan.com”注册于Andon组织,这是一个专业从事共享健康信息的设备开发组织的OEM版。很显然,是该公司开发了这个“iHealth牌活动力监视器”。
4、扫描和侦查的应对措施
扫描和枚举“低功耗蓝牙”设备的信息是许多攻击的前兆,其目标就是利用低功耗蓝牙协议或规范在实现时的不足,将其作为目标实施攻击。从事蓝牙设计、生产的组织应该尽量限制扫描或侦查信息的搜集工具,使其尽可能少地暴露其他蓝牙设备上的信息。
不幸的是,可以用来限制这些信息暴露工具的可用项很少。将“低功耗蓝牙”设备配置为“非可发现的”模式,在一定程度上有助于限制信息暴露,但通过一些更复杂的攻击技术,可以克服这种级别的安全措施。在可能的情况下,一个单位组织应该配置“低功耗蓝牙”设备限制外界对其服务的访问,并按这里所描述的步骤应用,使对方不能从敏感设备上列举和解压数据,也使对方不能在设备投入生产使用之前查到他们的详细信息。
三、结语
“低功耗蓝牙”是蓝牙技术发展的一个重要变化,从根本上改变物理层、设备安全和协议的应用层组件。通过这些变化,“低功耗蓝牙”已经在一个新的应用和技术系列领域内变成了一个令人兴奋的无线技术,这些领域涵盖了医疗设备、体育设备、健身器材。
有多个工具可用于“低功耗蓝牙”设备的发现扫描,这些工具可以支持Android、iOS和Linux等多种操作系统。虽然iOS和Android的工具使用起来很方便,但在您确定了目标以后,这些工具能从这个蓝牙设备上读取的数据量很有限。
使用Linux操作系统中的BlueZ工具包,包括其中的hcitool程序和gatttool程序,可以通过枚举得到“低功耗蓝牙”设备上可用的服务列表,并可以将这些从设备上提取的数据作为您的侦察和扫描分析的一部分。
微信公众号:计算机与网络安全
ID:Computer-network
【推荐书籍】