蓝牙安全以及相关漏洞研究

admin 2022年1月6日01:05:37评论290 views字数 18233阅读60分46秒阅读模式

放大佬总结的一张图:

BLE安全

蓝牙是一种无线通信标准,工作在2.4~2.485Ghz的ISM频段,主要用于短距离的数据连接,可以建立所谓的PAN(Personal Area Network)网络。蓝牙设备最常见的应用是各种以手机和电脑为中心的外围设备,例如与手机配合使用的蓝牙耳机、手机与汽车音响的互联、蓝牙键盘和鼠标等。

0x00 蓝牙技术简介

蓝牙”,即Bluetooth,是斯堪的纳维亚语中 Blåtand / Blåtann 的英化版本。该词是十世纪的一位国王Harald Bluetooth的绰号,相传他将纷争不断的丹麦部落统一为一个王国,并引入了基督教。蓝牙技术开发者Jim Kardach于1997年提出用Bluetooth这个名词,据说他当时正在读一本名为The Long Ships的小说,讲述的就是维京人和Harald Bluetooth国王的故事。他认为蓝牙可以把各种不同的通信协议统一在一起,诚如这位国王做的事情一样。至于蓝牙的logo,取自国王Harald Bluetooth名字中的【H】和【B】两个字母的组合,用古北欧文字来表示:

0

蓝牙技术最早是1994年由爱立信发明的,最初的目的是用无线连接来代替RS-232线缆连接。目前蓝牙标准由Bluetooth Special Interest Group (SIG) 组织管理。这一组织有超过25000个成员公司,分布在电信、计算机、网络和消费电子领域。

蓝牙工作在2.4~2.485GHz频段,有79个频道,每个频道占据1MHz宽带。因为2.4GHz的ISM频段是非常繁忙的,为了对抗其他系统的干扰,蓝牙采取跳频式的扩频技术,通常1秒钟跳跃1600次。BLE(Bluetooth Low Energy)只有40个频道,每个频道占据2MHz宽带.

蓝牙是一种基于数据包通信的协议,使用主-从式的网络结构。在一个piconet中,1个主节点可以与多达7个从节点通信。所有的设备都共享主节点的时钟。数据包以312.5us的间隔互相交换,这个时间成为clock tick。两个clock tick构成一个625us的时隙,两个时隙构成一个1250us的时隙对。一种比较简单的时隙配置是,主节点在偶数时隙发送数据包,在奇数时隙接受数据包;从节点相反,在偶数时隙接受数据包,在奇数时隙发送数据包。这里讨论的是经典的蓝牙协议,BLE的空中接口协议与经典的蓝牙协议有很大的不同。蓝牙协议还支持多个piconet连接在一起,组成scatternet。在这种情况下,某些设备可以在一个piconet中担任主节点,在离另一个piconet中知识从节点。

蓝牙技术已经发展了很多年,蓝牙规范有很多个版本,从最早的蓝牙1.0到2014年发布的蓝牙4.2。早期的蓝牙标准只能支持几百Kbps的传输速率,而到了蓝牙3.0版本,已经可以支持最高24Mbps的传输速度。蓝牙4.0版本引入了BLE协议,即低功耗蓝牙,其功耗非常低,可以使设备的电池维持很长的时间,因此在很多可穿戴设备中得到了应用。

一文读懂蓝牙技术从 1.0 到 5.0 的前世今生 (https://zhuanlan.zhihu.com/p/37725574)

0x01 蓝牙安全概述

蓝牙协议有加密和鉴权功能。蓝牙的密钥产生是基于蓝牙的PIN码的。PIN码需要输入到蓝牙设备中,或者出场时就已经写入设备里。在美国国家标准技术研究所官网上有一份蓝牙安全指南Guide to Bluetooth Security(https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-172-draft.pdf)中介绍了如何安全的使用蓝牙技术。使用蓝牙技术非常简单、易用、但是也有明显的缺点,容易被拒绝服务攻击、窃听、中间人攻击、数据篡改、占用资源。所有在选用蓝牙技术时,必须充分评估能否接受这样的风险。这份指南同时也给出了一些知道,在创建和维护一个蓝牙系统时,如何去降低他的安全风险。

2001年,内尔实验室的Jakobsson和Wetzel发现了蓝牙配对协议中的缺陷,以及加密方法中的漏洞。2003年,A.L.Digital公司的两位研究人员Ben和Adam Laurie发现,在一些蓝牙产品中有严重的漏洞,能够导致个人隐私数据的泄漏。于是,接下来就出现了一种利用这种BlueBug攻击手法,开始展现出这一漏洞的危害性

2004年,第一个所谓的蓝牙病毒出现,它可以在Symbian操作系统的手机中传播。这个”病毒”是一个名叫”29A”的团队编写的PoC程序,写出来之后就交给了反病毒机构,因此它具有威胁性,但并没有真正的传播过。2004年8月,一项实验创纪录地把蓝牙连接的距离增加到了1.79公里,在实验中使用了方向性天线和功率放大器。这就增加了蓝牙病毒的危险性,使得它能够威胁到距离非常远的蓝牙设备

2005年1月,出现了一种名为”Lasco.A”的手机蠕虫病毒,也是针对Symbian手机的。用户一旦通过蓝牙接收这个病毒文件,病毒就会自动地安装在系统中,然后开始寻找周围其他的蓝牙设备去感染。另外这种病毒还能感染系统中的其他SIS文件。最终的后果是导致手机系统不稳定。

2005 年4月,剑桥大学的安全研究人员公布了他们发现的一种被动式攻击方式, 能够攻击基于PIN码的配对协议。这种攻击方式操作起来非常快,证实了蓝牙的对称密钥的建立方法是有缺陷的。为了抵御这种攻击,研究人员提出了-种更强的非对称密钥加密方法。

2005年6月,Yaniv Shaked和Avishai Wool发表了一篇论文,提出了被动式和主动式两种攻击方式,可以获得PIN码。在被动式攻击中,攻击者在蓝牙设备初始配对的时刻就能窃听到通信的内容:而主动式攻击则需要在某个特定的时刻发出一-种特殊构造的数据包,使主节点和从节点重复配对过程,之后就可以使用被动式攻击在配对过程中侦听密钥了。这种攻击的主要弱点在于,它需要受到攻击的用户在攻击期间重新输入PIN码,此时设备会有提示。另外,这种攻击还需要一些特别的设备在恰当的时刻发出一种特殊构造的数据包,现成的蓝牙芯片是不.能做到这一- 点的。

蓝牙地址还可以用于追踪设备的位置。2005 年8月,英格兰剑桥郡的警方发出警示说,有些小偷利用蓝牙来探查车内是否有被遗忘的手机或电脑等设备,提示人们在不使用蓝牙功能时尽量关闭它。

2006年4月,来自Secure Network和F-Secure的研究人员发布了一份报告,警告有大量留在“可见”状态的设备,还报告了各种蓝牙服务的普及程度,以及与蓝牙蠕虫传播的危险性有关的统计数据。

2007年10月,在卢森堡的Hack.lu Security会议上,Kevin Finistere和Thiery Zoller演示了通过蓝牙远程rootMacOSXv10.3.9和v10.4系统,还演示了一个蓝牙PIN码和Linkeys破解器。

维基百科.上介绍的以上这些蓝牙安全的案例都至少是9年以前的事情了。那么近些年来,在蓝牙安全领域又有什么攻击方式

0x02 BLE工作流程

1.工作流程

BLE低功耗蓝牙适用于短距离无线通信,正常与形式传输距离为10m(低功耗模式下为100m),频段2.4Ghz。先进行三个蓝牙术语介绍:

  • 配对:配对是指两个蓝牙设备首次通讯时,互相确认的过程。两个蓝牙设备之间一经配对之后,随后的通讯连接就不必每次都要做确认,非常的方便
  • PIN:个人识别码,蓝牙适用的PIN码长度为1-8个十进制位(8-128比特)
  • DB_ADDR:蓝牙设备地址。每个蓝牙收发器被分配了唯一的一个48位的设备地址,类似于PC机网卡的MAC地址。两个蓝牙设备在通讯开始时通过询问的方式获取对方的DB_ADDR地址

蓝牙的工作过程为:

​ 蓝牙启动 -> 扫描设备 -> 设备配对(未配对的设备) -> 数据传输

2.设备配对模式

  • Numeric Comparison:配对双方都显示一个6位数的数字,由用户来核对数字是否一致,一致即可配对。例如手机之前的配对。
  • Just Works:用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程。例如连接蓝牙耳机。
  • Passkey Entry:要求配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对。例如连接蓝牙键盘
  • Out of Band:两设备通过别的途径交换配对信息,例如nfc等。例如一些NFC蓝牙音响

3.设备配对过程

a PIN码配对

在老的蓝牙2.0协议中,配对过程需要输入一个PIN码,长度可以从4到16个数字。(很多设备默认为0000或者1234)

在配对的过程中通过PIN码来生成Linkkey。两个配对后的设备共享一个Linkkey,这个行为叫绑定。绑定之后下次两个设备接近后,用Linkkey进行认证,认证通过后生成EncryptionKey进行session的加密。认证的过程采用challenge-reponse的模式,以claimant and the verifier的方式来验证linkkey。认证完一方之后交换身份,在认证另一方。

b 密钥交换配对

后续蓝牙协议配对则通过密钥交换来完成,又分为生成初始密钥(Kinit)、生成链路密钥(Kab)和双方认证三个过程。

  • 生成舒适密钥(Kinit):初始密钥Kinit长度为128位,由E22算法产生。首先提出通信要求的设备成为主设备(Master),用A表示;被动进行通信的设备称为从设备(Slave),用B表示。E22算法的输入(明文)由以下三部分组成:
  1. 从设备的物理地址:BD_ADDR,在生成Kinit前,主设备通过询问方式获得从设备的地址BD_ADDR。
  2. PIN码及其长度,PIN码是双方设备预先设定的。
  3. 有一个128位的随机数(IN_RAND)。由主设备产生,并以明文方式传送给从设备。

由于主、从设备使用了相同的E22算法,如果双方设备以上三部分的值都相等,那么各自算出来的Kinit也应该相同。

0

  • 生成链路密钥(Kab):首先主设备A产生128位的随机数LK_RANDA,从设备B也产生128位的随机数LK_RANDB。在主设备A中,Kinit与LK_RAND进行位比特逻辑异或运算,异或结果发送给B设备;同样的,在B设备中,Kinit和LK_RANDB进行位比特逻辑异或运算,结果发送给A设备。通过这些交换后,A和B设备都具有相同的Kinit、LK_RANDA和LK_RANDAB。设备A和B分别用E21算法将LK_RANDA和LK_RANDB。设备A和B分别用E21算法将LK_RANDA和BD_ADDRA、LK_RANDB和BD_ADDRB加密,并将结果进行异或得到Kab。

0

  • 双方认证:双向认证采用challenge-response(挑战-应答)方式。主设备A位应答方,从设备B为请求方。作为应答方的A设备产生一个128位的随机数AU_RANDA,并以明文的方式传送至B设备。A、B设备都用E1算法将各自的到的AU_RAND、Kab和BD_ADDRB加密运算分别生成32位的SRESA和SRESB。B设备将结果SRESB传送给A设备,A设备比较SERESA和SERSB,如果两个的值相等,此次认证通过,如果两个的值不想等,则认证不通过。执行完此次认证后,A设备和B设备的角色对换,即A设备作为请求方,B设备作为应答方,采用同样的方式进行认证。

0

0x03 BLE常见问题

蓝牙(bluetooth)同WIF和zigbee等等网络协议一样,因此它的网络协议通信结构和它们大同小异。

因此,它的攻击手段不外乎鉴权攻击、密钥攻击、拒绝服务攻击等等几种手段,只不过随着具体的场景不同,这些攻击手段所赐啊去的具体方法也不同。

在上述的几种攻击方法里,蓝牙的安全问题可以分为两类:第一类是蓝牙协议本存在的问题。例如有攻击工具:Bluenarfing、Bluebugging、Hijacking等。

1.针对蓝牙协议本身的攻击

a.节点密钥攻击(中间人)

假设一个设备A和B之前已经通信过,当通信完成之后,A和B是互相知道彼此的链路密钥的。这里解释一下什么叫链路密钥:A和B之间的通信是需要加密的,怎么加密的不管,总之就是需要一个链路密钥这样的一个东西,每次通信的链路密钥是根据蓝牙本身自带生成的,这个链路密钥不是放在协议层生产的,而是蓝牙硬件自身就有的。那么B显然之后A所使用的链路密钥,那么B通过修改自身地址,把自己的地址改为A的地址后,伪装成A和C通信,那么C此时就以为自己和A通信。B也可以伪装成C和A去通信,因为B知道A的链路密钥,B是能够通过A的认证从而和A进行连接 。

这样 A和 C之间并没有进行实质的通信 ,都是B分别伪装和A,C通信。这样就造成了中间人攻击。

这种中间人攻击的主要原因在于蓝牙通信链路密钥在硬件层生产,而且每次认证都相同。

b.针对PIN码攻击

两个设备之间的链接,在应用层上使用PIN码,4位PIN码破解仅仅需要0.06秒,8位暴力攻击不到两个小时就能破解。

c.中继攻击

蓝牙设备使用中继以夸大传输距离,几乎所有的中继攻击,中继设备都有可能遭到信息窃取

d.鉴权DOS攻击

鉴权时的DOS攻击是从上一次鉴权失败到下一次可以发起鉴权期间,第三方通过伪装发起故意使鉴权失败,从而使间隔时间持续上升,知道达到允许的最大值,在此期间双方不能进行正常的鉴权。

还有一种形式的DOS攻击,快速不断的给远程蓝牙发送文件,而远端设备呗大量的是否要接收该文件的命令冲击直到瘫痪。

2.针对蓝牙实现过程发起的攻击

a. BlueBorne

image

是由armis爆出的一系列蓝牙的漏洞,只要手机开启了蓝牙,就可能被远程控制。当然根据上面的分析可以看到通过多种平台的漏洞综合利用,可以完成对大部分支持蓝牙的设备进行攻击。但是在安天的报告里有一句我没懂“不像其它驱动一样,每个操作系统都只有一个蓝牙协议栈,这导致一个漏洞的出现将会影响一系列基于此系统的设备。”其他驱动是啥样?大概的意思就是内核驱动的漏洞吧,不过能看到的是通过这组漏洞可以实现ios,android,linux的rce,以及windows下的中间人攻击。

b. GATT

从蓝牙4.0的低功耗蓝牙(BLE)开始到4.2开始支持GATT(Generic Attribute Profile)再到BLE5,蓝牙技术已经瞄准了物联网这个方向。所以很多特性都是针对物联网的情景而生的,比如GATT。GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,乃SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等用于让两个设备进行连接后的通讯。GATT 定义设备之间通过 Service 和 Characteristic 的东西来进行通讯,不同的 Characteristic 代表设备的不同功能。GATT协议可以在蓝牙设备不完成配对的情况下进行访问,因此,通信流量明文传输,如果应用层没有加密或者校验,则可以被轻易地嗅探和伪造数据。

相关paper:

c.Bluesnarfing

蓝牙定义了OBEX协议,只鹅个协议的重要目的是实现数据对象的交换。蓝牙早期规范定义了一个基于OBEX的应用,这个应用主要用来实现使用蓝牙来传输一些名片,这个过程并不需要使用鉴权机制,Bluesnarfing就是利用此漏洞连接到手机用户,并且不提示用户已连接。

当不使用蓝牙时,将设备设置成不可发现的模式,或者在通信时将设备设置成为安全模式3来启动链路鉴权,对一些蓝牙设备进行升级可以有效预防此类攻击。

d.Bluebugging

Bluebugging和Bluesnarfing相似,在事先不通知货提示手机用户的情况下,访问手机命令。

e.Peripheral Hijacking

有些设备尽管没有进入连接模式也会对连接请求进行相应,这类设备通常是一些没有MMI(Man Machine Interface)的设备。例如一些蓝牙耳机会被强制连接,还有一些设备有固定的PIN码,Peripheral Hijacking即是对此类设备进行攻击。

f.Bluejacking

Bluejacking是指手机用户使用蓝牙无线技术匿名向赴京的蓝牙用户发送名片或不许奥信息的行为。Bluejacking通常会寻找ping的通的手机或者有反应的手机,随后会发送更多的其他个人信息到该设备。现在市场上已经出现了很多Bluejacking软件。可以通过把手机设置成不可发现模式来避免此类攻击。

0x04 信道

BLE的物理通道即”频道”,分别是‘f=2402+k*2 MKz, k=0 , … ,39’, 宽带为2MHz的40个RF Channel。

其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date)

剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。

0x05 BLE数据包格式

在低功耗蓝牙规范中,分广播报文和数据报文这两种。设备利用广播报文发现、连接其它设备,而在连接建立之后,便开始使用数据报文。无论是广播报文还是数据报文,链路层只使用一中数据包格式,它由”前导码”(preamble)、”访问码”(access code)、”有效载荷”和”循环冗余校验”(Cyclical Redundancy CHeck,CRC)校验码组成。其中,”访问码”有时又称为”访问地址”(access address)

0

1.Preamble

1个字节长度,接受中用于频率同步、数据速率同步、自动增益控制调整,固定为 01010101或者10101010序列

2.Access Address

4个字节长度,广播报文接入地址为:0x8E89BED6,数据报文接入地址为:32bits随机数

3.PDU

i.广播报文(见嫌疑BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.3)

0

i. PDU Type: 有效载荷内容的类型,通过这一字段确定改数据包是一个”通告”还是”扫描请求”或”响应”等

0

ii. RFU 保留位

iii. TxAdd:发送地址字段

iv. RxAdd:接收地址字段

v. Payload Length:用来表示”有效载荷数据”(payload data)的长度,不包括头部内容

ii.数据报文(见协议BLUETOOTH SPECIFICATION Version 4.0 [Vol 6] Part B 2.4)

0

0

0

1.LLID(逻辑链路ID):0x01表示该数据包是一个帧的延续内容,或者这是一个空的“逻辑链路控制及适配协议”数据包;0x02表示一个“逻辑链路控制及适配协议”数据包的开始;0x03表示这是一个“逻辑链路控制”数据包的内容

2.NESN:下一个期望的序列号,用于对接受到的数据包进行确认

3.MD:更多数据字段,主要是为了说明发送发是否还有要发给接收者的数据

4.RFU 保留位

5.Payload Length:用以表示包含”信息完整性校验码”(Message Integrity Check,MIC)在内的“有效载荷数据”的长度

4.CRC

3个字节长度,“循环冗余校验”(Cyclical Redundancy Check, CRC),可检查数据的正确性

0x06 BLE 协议栈

BLE协议栈的结构图如下所示:

0

各个结构简述:

  • PHY:使蓝牙可以使用2.4GHz频道,并且能自适应的调频。
  • LL层:控制设备处于 准备、广播、监听、初始化、连接等5个状态
  • HCI层:向上为主机提供软件应用程序接口,对外为外部硬件提供控制接口
  • L2CAP层:对传输数据实行封装。
  • SM层:提供主机和客机的配对和密钥分发,实现安全连接和数据交换。
  • ATT层:对数据主机或客机传入的指令进行指令搜索处理
  • GATT层:接受和处理主机或客机传入的指令进行指令搜索处理
  • GAP层:向上提供API,向下合理分配各个层工作。

1. Physical Layer

任何一个通信系统,首先要确定的就是通信介质(物理通道,Physical Channel),BLE也不例外。在BLE协议中,”通信介质”的定义是由Physical Layer(其他通信协议也类似)负责。

Physical Layer是这样描述BLE的通信介质的:

​ 由于BLE属于无线通信,则其通信介质是实顶频率范围下的频率资源(Frequency Band) BLE的市场定位是个体和名用,因此使用免费的ISM频段(频率范围是2.400-2.4835Ghz) 为了同时支持多个设备,将真个频带分为40份,每份的宽带为2MHz,称作RF Channel

所以经过上面的定义之后,可以推测出BLE的物理通道,即“评到分别是’f=2402+k*2 MHz,k=0,…,39’,宽带为2MHz”的40个RFChannel。其中,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、舒适化连接(initiating a connection)和广播数据(broadcasting date);剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。

0

Link Layer用于控制设备的射频状态,设备将处于Standby(待机)、Advertising(通告)、Scanning(扫描)、Initiating(初始化)、Connection(连接)这五种状态中的一种。

0

  • 待机状态(Standby State):此时即不发送数据,也不接受数据,对设备来说也是最节能的状态;
  • 通告状态(Advertising State):通告状态下的设备一般也被称为 “通告者”(Advertiser),它会通过advertising channel(广播通道)周期性的发送数据,广播的数据可以由处于Scanning state或Initiating state的实体接受;
  • 扫描状态(Scanning State):可以通过advertising channel(广播通道)接受数据的装填,该状态下的设备又被称为“扫描者”(Scanner)。此外,更具advertiser所广播的数据类型,有些Scanner还可以主动向Advertiser请求一些额外数据
  • 初始化状态(Initiating State):和Scanning State类似,不过是一种特殊的状态。Scanner会侦听所有的advertising channel,而Initator(初始化者)则只侦听某个特定设备的广播,并在接受到数据后,发送连接请求,以便和Advertiser建立连接
  • 连接状态(Connection State):由Initiating State或Advertising State自动切换而来,处于Connection State的双方,分别有两种角色。其中,Initiater方被称为Mater(主设备),Advertiser方则称作Slave(从设备)。

3. HCI

主机控制接口层(Host Controller Interface,简写HCI):定义Host(主机)和Controller(控制器)之间的通信协议,这一层可以是软件或者硬件接口,入UART、SPI、USB等

4. Generic Access Profile(GAP)

前面Link Layer虽然对连接建立的过程做了定义,但它听没有体现到Application(或者 Profile)层面,而GAP则是直接与应用程序或配置文件通信的接口,它实现了如下功能:

  • 定义GAP层的蓝牙设备角色(role)

    • Broadcaster(广播者):设备正在发送advertising events
    • Obserber(观察者):设备正在接受advertising events
    • Peripheral(外设):设备接受Link Layer连接(对应Link Layer的slave角色)
    • Central(主机):设备发起Link Layer连接(对应Link Layer的master角色)
  • 定义GAP层的用于实现各种通信的操作模式(Operational Mode)和过程(Procedures)

    • Broadcastmode and observation procedure,实现单向的、无连接的通信方式
    • Discovery modes and procedures,实现蓝牙设备的发现操作
    • Connection modes and procedures,实现蓝牙设备的连接操作
    • Bonding modes and procedures,实现蓝牙设备的配对操作
  • 定义User Interface有关的蓝牙参数,包括蓝牙地址、蓝牙名称、蓝牙的PIN码等

  • Security相关的定义

逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol):为上层提供数据封装服务,允许逻辑上的点对点数据通信。

6. Security Manager(SM)

Security Manager负责BLE通信中有关安全的内容,包括配对(pairing,)、认证(authentication)和加密(encryption)等过程。

7. Attribute protocol(ATT)

在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。

谈起应用程序,就不得不说BLE的初衷——物联网。物联网中传输的数据和传统的互联网有什么区别呢?抛开其它不谈,物联网中最重要、最广泛的一类应用是:信息的采集。

这些信息往往都很简单,如温度、湿度、速度、位置信息、电量、水压、等等。

采集的过程也很简单,节点设备定时的向中心设备汇报信息数据,或者,中心设备在需要的时候主动查询。

基于信息采集的需求,BLE抽象出一个协议:Attribute protocol,该协议将这些“信息”以“Attribute(属性)”的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。

Attribute Protocol的主要思路包括:

  1. 基于L2CAP,使用固定的Channel ID
  2. 采用client-server的形式。提供信息(以后都将其称为Attribute)的一方称作ATT server(一般是那些传感器节点),访问信息的一方称作ATT client。
  3. 一个Attribute由Attribute Type、Attribute Handle和Attribute Value组成。
    1. Attribute Type用以标示Attribute的类型,类似于我们常说的“温度”、“湿度”等人类可识别的术语,通过UUID进行区分。
    2. Attribute Handle是一个16-bit的数值,用作唯一识别Attribute server上的所有Attribute。Attribute Handle的存在有如下意义:
      1. 一个server上可能存在多个相同type的Attribute,显然,client有区分这些Attribute的需要。
      2. 同一类型的多个Attribute,可以组成一个Group,client可以通过这个Group中的起、始handle访问所有的Attributes。
    1. Attribute Value代表Attribute的值,可以是任何固定长度或者可变长度的octet array。
  1. Attribute能够定义一些权限(Permissions),以便server控制client的访问行为,包括:
    1. 访问有关的权限(access permissions),Readable、Writeable以及Readable and writable;
    2. 加密有关的权限(encryption permissions),Encryption required和No encryption required;
    3. 认证有关的权限(authentication permissions),Authentication Required和No Authentication Required;
    4. 授权有关的权限(authorization permissions),Authorization Required和No Authorization Required。
  1. 根据所定义的Attribute PDU的不同,client可以对server有多种访问方式,包括:
    1. Find Information,获取Attribute type和Attribute Handle的对应关系;
    2. Reading Attributes,有Read by type、Read by handle、Read by blob(只读取部分信息)、Read Multiple(读取多个handle的value)等方式;
    3. Writing Attributes,包括需要应答的writing、不需要应答的writing等。

8. Generic Attribute profile( GATT)

ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。至于具体共享哪些信息,ATT并不关心,这是GATT(Generic Attribute Profile)的主场。GATT相对ATT只多了一个‘G‘,然含义却大不同,因为GATT是一个profile(更准确的说是profile framework)。

0

由上图可知,GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,乃SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等,可参照官方Profiles Overview,对分析并无大用。

Service和Characteristic则是比较重要的,Service可以理解为PHP中的“类”、功能对象的集合。Characteristic可以理解为PHP的“函数”,是GATT中具体的功能对象,每个Service都可以包含一个或多个Characteristic(特征)。Characteristic是GATT profile中最基本的数据单位,由一个Properties、一个Value、一个或者多个Descriptor组成。

以上除“Profile”外的每一个定义,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的,具备前面所描述的Attribute的所有特征:Attribute Handle、Attribute Types、Attribute Value和Attribute Permissions。

在理解了GATT后,就已经能够分析或是“黑掉”一些BLE设备了。这里拿小米手环做例子,当LightBlue连上小米手环后,可以看到一个名为FEE7的UUID,如下所示:

其中,FEE7是一个私有Service的UUID,里面的0xFE**则是私有Characteristic的UUID。下面的Immediate Alert 显示出了名称,代表其不是小米私有的Service,而是官方公开定义的Service。点击进入这个Characteristic,看到它的UUID为2A06。然后我们到蓝牙官网定义的列表Characteristics搜索2A06,进入Characteristic的详情页面。

0

0

其中,FEE7是一个私有Service的UUID,里面的0xFE**则是私有Characteristic的UUID。下面的Immediate Alert 显示出了名称,代表其不是小米私有的Service,而是官方公开定义的Service。点击进入这个Characteristic,看到它的UUID为2A06。然后我们到蓝牙官网定义的列表搜索2A06,进入Characteristic的详情页面。

0

于是,该Characteristic操作定义非常明确了。点击“Write new value”,可以写入新的值。若写入1或2,则可以引起手环的震动。

0x07 嗅探工具

商业级的Ellisys BEX400侦听工具最为符合对BLE流量捕获及分析的要求,然而售价过于昂贵;

其次,作为开源硬件且配有混杂模式追踪的“超牙”设备——Ubertooth One拥有二次开发和嗅探已建立连接的蓝牙通信数据包的能力;

而淘宝购买的廉价CC2540开发板则作为最佳替补方案。

1. 低功耗蓝牙SOC

低功耗蓝牙推出以来,众多厂商根据标准规范实现了不同的解决方案,包括TI的CC2540\2541、北欧Nordic的nRF51822、CSR的1000\1001、Quintic的QN9020\9021(现在被NXP收购)、Broadcom的BCM20732等。其中,在开发者当中比较知名的是TI的CC254x系列和Nordic的NRF51822,并且这两款产品当有着自己的开发板和用于嗅探的调试工具。

a. CC2540

德州仪器的CC2540,是一款高性价比、低功耗的片上系统(SOC)解决方案,适合蓝牙低功耗应用。它包含了一个8051内核的RF收发器,可编程闪存,8KB RAM和其他功能强大的配套特征及外设。CC2540有两种版本:CC2540F128 / F256,分别为128和256 KB的闪存,结合TI的低功耗蓝牙协议栈,CC2540F128 / F256形成了市场上最灵活,性价比也最高的单模式蓝牙BLE解决方案。
CC2540 USB Dongle的实物图如下,它可以配合TI的PacketSniffer软件实现对BLE无线抓包:

实际上,任意包含CC2540芯片的开发板都能实现BLE流量嗅探的功能。不过,TI官方并没有将侦听BLE的源代码放出,仅提供了烧写到USB Dongle的固件

在这个基础上,如果想要实现更多的功能,比如监听指定范围内所有的低功耗蓝牙设备的流量,就有必要对其进行逆向或者自己完全重写个程序。。

b. NRF51822

挪威Nordic Semiconductor(简称Nordic)公司的nRF51822,是一款多协议ARM内核蓝牙4.0低功耗/ 2.4GHz 专用RF的单芯片解决方案。它基于Cortex-M0 内核,配备16kB RAM,可编程闪存,提供128 KB和 256 KB Flash两种版本供用户选择。

nRF51822 USB Dongle及开发板套件如下所示:

img

刷入以下固件,配合官方的BLE sniffer程序,即可实现蓝牙流量的嗅探功能

img

不同与cc2540的Packet Sniffer,该程序无需事先在3个广播信道中指定其一进行守候,只要指定要监听的设备,就会自动进行追踪,并能够配合Wireshark解析BLE数据包,可以很直观的显示出内部的层级关系和各字段含义。比较遗憾的是,实际使用发现它并没有CC2540 USB Dongle稳定,经常会抓不到后面数据通信的网络包,不过这一问题应该是可以通过优化算法得到解决的,但需要对官方的固件进行逆向或自己根据Nordic公司提供的BLE协议栈重写代码。。

img

img

img

img

优点:

  • 价格便宜,USB Dongle淘宝价70元左右,整套开发板售价约200软妹币上下
  • 无需事先在3个广播信道中指定其一进行守候,只要指定要监听的设备,就会自动进行追踪
  • 官方提供的BLE Sniffer程序可配合Wireshark工具对嗅探到的低功耗蓝牙数据包进行解析,能够很直观的显示出内部的层级关系和各字段含义

缺点:

  • 不用指定广播信道,确实操作起来比较方便,但与之相对的是经常无法抓到后面的通信数据包。无论是作为开发用的调试工具,还是分析用的嗅探工具,都不够理想

2. 商业侦听工具

a. Frontline BPA® 600

Frontline Test Equipment——“前线测试设备”(简称“前线”,Frontline),主要是针对各种各样的协议所做的一个“协议分析器”。“前线”系统的销售策略是“卖硬件,送软件”,而软件自然是和硬件相关联的,其侦听范围包括SCADA系统、RS-232串口通信、Ethernet以太网通信、ZigBee网络通信,以及蓝牙网络技术。Frontline旗下的BPA® 600双模蓝牙协议分析仪,能够把从空中获取到的基础速率/ 增强数据速率(BR/EDR)的传统蓝牙无线通信和低功耗蓝牙无线通信数据同时直观的显示出来。

img

img

优点:

  • 无角色指定链路抓取意味着在初始化设置时不再需要指定哪个设备是主设备(master),哪个设备是从设备(slave)
  • 能够同时可视化的监视低功耗蓝牙技术所使用的三个广播信道
  • 同时抓取和解密多条蓝牙链路
  • 链路密钥可自动从第三方软件或调试工具导入到BPA 600
  • 支持蓝牙SIG组织发布的所有的协议和应用层协议,完全支持蓝牙4.1版本

缺点:

  • 十分昂贵,官网上虽并未公布具体的价格信息,需要与对方进行联系,但淘宝价格在15万左右
  • 需要捕获到蓝牙的“连接建立”过程,对于已经建立好连接的蓝牙网络,无法从一个正在处理的进程中,嗅探到这个“微微网”里面的通信数据包

b. Ellisys BEX400

Ellisys公司的BLuetooth Explorer 400(简称“BEX400”),是个独特的蓝牙数据通信捕获系统。它使用了一个wideband的接收器,能够同时侦听蓝牙整个79MHz的所有频谱。通过这种无线接入方法,嗅探蓝牙数据包以及对蓝牙活动的评估变得很容易。在BEX400强大的宽带接收能力支持下,我们能够同时捕获蓝牙的所有活动,且无需指定“蓝牙设备地址”信息。此外,该设备在捕获一个“微微网”中的蓝牙通信数据时,既可以是在连接建立前,也可以在连接建立后

img

优点:

  • 对于BLE的流量捕获没有必须在建立连接前就开始嗅探的限制
  • 能够同时侦听蓝牙的所有信道,且无需指定“蓝牙设备地址”信息

缺点:

  • 价格极其昂贵
  • 除价格外,几乎完全符合需求,暂未发现明显缺点

3. 开源侦听工具Ubertooth

“超牙项目”(Project Ubertooth)是一个开源的硬件项目,由Great Scott Gadgets团队的Michael Ossmann开发。超牙的硬件系统,目前处于版本为1的阶段,称为“超牙一号”(Ubertooth One)。通过这个工具,可以创建属于自己的“传统蓝牙”和“低功耗蓝牙”底层通信数据包捕获工具。

img

此外,Ubertooth的固件源代码,可以直接从github:https://github.com/greatscottgadgets/ubertooth下载到最新的发布版。

image-20200928121643528

优点:

  • 售价约120美元,比较亲民
  • 本身是一个开源的硬件和软件工程,其设计目的就是用来进行蓝牙网络的嗅探,便于研究员和黑客使用
  • 针对不同的蓝牙规范,具有不同的应对工具,支持传统蓝牙和低功耗蓝牙两种数据包的捕获
  • 能够在混杂模式下进行跟踪,通过ubertooth-btle程序对捕获的数据包进行识别和匹配,进而确定“访问地址”、“循环冗余校验”初始值、“跳转间隔”、“跳转增量”等,并还原出数据包的值

缺点:

  • 说是支持“传统蓝牙”,但其实只能捕获“基本速率蓝牙”在网络中的活动,并不支持后来的“增强速率蓝牙”在规范改进后的设备。不过这与我们的工作没有太大联系,主要关注的应是低功耗蓝牙

0x08 移动端工具

1. Android手机抓取app蓝牙数据

a .Android蓝牙HCI日志

在部分Android机型为开发人员提供了保存蓝牙日志的选项,即可保存手机向设备发送的数据和设备响应的数据,打开方式如下:

开发者模式→蓝牙HCI日志

image-20200930155140338

不同的平台存放HCI log的路径会不一样,MTK存放HCI log的路径为/sdcard/mtklog/btlog/btsnoop_hci.log,高通的存放路径为/sdcard/btsnoop_hci.log

如果上面提到的路径下都没有HCI log,还可以通过手机上的蓝牙配置文件bt_stack.conf来查看路径

bt_stack.conf位于/etc/bluetooth/路径下,HCI log路径通过BtSnoopFileName=/sdcard/btsnoop_hci.log`来进行设置的

另外如果没有bt_stack.conf文件,设备也会在默认路径下生成日志:/data/misc/bluetooth/logs/btsnoop_hci.log

之后导出到wireshark查看即可,如图清晰的展示了蓝牙各协议栈的内容,分析时候重点关注发送的数据内容即HandleuuidValue等值即可

img

b. Bluez调试工具hcidump

虽然Android 4.2已经将蓝牙协议栈替换为Bluedroid,但仍可使用BlueZ调试工具(需自行编译,或网上下载),且hcidump输出的数据与开发者模式里的蓝牙HCI日志基本一样,源码如下:

https://android.googlesource.com/platform/external/bluetooth/bluez/+/android-4.1.2_r1

hcidump抓取 log :

  • 打开蓝牙
  • 用adb shell 登陆android设备 并且用 hcidump -w /sdcard/hcilog
  • 开始测试
  • 测试完成,停止hcidump
  • 导出到wireshark分析 hcilog 文件

2. 扫描器

a. LightBlue

LightBlue使用简单,打开蓝牙和app,即自动扫描蓝牙设备,未连接之前,大部分设备都是UnnamedNo services,选择其中一个会尝试连接,连接成功后即可获取蓝牙设备的设备信息、UUID、服务等信息了,选择其中一个服务,还可以尝试对其读写数据

image-20200930161720845

b. nRF Connect

nRF Connect的使用方式和LightBlue基本一致,优点在于对设备服务信息展示更为直观:

image-20200930161645370

0x09 针对利用蓝牙的应用攻击(私有协议)

目前针对私有协议的分析基本都是通过蓝牙dongle抓包例如CC2540,并且逆向app进行分析应用实现是否安全。

0x10 可以研究的点

经过多年的历史发展,蓝牙本身已经变成一个比较复杂的协议了,如果需要整理完整的攻击面需要对整个蓝牙的实现有很清晰的梳理,网上大部分的文章都是关于协议本身的,对于协议的实现还是说的不是很清楚。而且协议本身的发展方向就是IOT方向,例如GATT这种很明显就是支持物联网设备的协议。所以搞清BLE5.0在真实的物联网设备上的架构以及实现我认为非常关键。

0x11 参考链接

https://xuanxuanblingbling.github.io/wireless/ble/2018/08/01/ble/

http://www.gandalf.site/2019/02/ble.html

https://www.ndss-symposium.org/wp-content/uploads/2019/02/ndss2019_06B-4_Xu_paper.pdf

http://drops.xmd5.com/static/drops/tips-10109.html

https://blog.csdn.net/u013183495/article/details/51736605

https://www.secpulse.com/archives/75963.html

更新中…

FROM :ol4three.com | Author:ol4three

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:05:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   蓝牙安全以及相关漏洞研究http://cn-sec.com/archives/721000.html

发表评论

匿名网友 填写信息