攻击蓝牙网络

2019 年 4 月 9 日 计算机与网络安全

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587


微信公众号:计算机与网络安全

ID:Computer-network

许多机构通常都不会太重视蓝牙设备所具有的安全威胁。他们宁愿花费大量的精力,通过“漏洞评估”(vulnerability assessment)、“渗透测试”(penetration test)或者“道德入侵约定”(ethical hacking engagement)来部署和加固Wi-Fi无线网络,但是在蓝牙网络的安全上却置若罔闻,很少有所作为。


至于为什么几乎没有机构愿意花费资源来评估他们蓝牙网络上的威胁,其中的原因是他们有这样一个普遍的风险意识的误区:“我们漠视蓝牙安全是因为蓝牙网络根本就不会威胁到我们的重要财产。”即使有机构意识到了蓝牙所带来的威胁,也很少有人具备蓝牙软硬件开发方面的技能,以及专业知识来成功地进行蓝牙渗透测试,或者由在道德约定的前提下,对指定的蓝牙设备进行入侵测试。


在这里,我们会消除人们对于“蓝牙技术不会带来威胁”的误解,给予您攻击蓝牙网络所需要的指导和专业知识。我们也会通过几个针对蓝牙网络不同的攻击方式,来测试和验证出在蓝牙网络中,既有某个蓝牙设备在设计实现时存在漏洞,还有在蓝牙规范的设计中存在漏洞,在老掉牙、即将淘汰的蓝牙产品中存在漏洞,在新兴的、刚设计出不久的蓝牙产品中也存在漏洞,包括最新的Apple iBeacon产品。我们会体验很多攻击工具,您也可以应用这些技术成功地攻击某一个蓝牙网络,识别和暴露出蓝牙技术中存在的风险,同样也可以成功地进行一次渗透测试


一、蓝牙网络中的“个人身份码”攻击


传统的蓝牙设备,主要是指“蓝牙规范2.1版”以前的各版蓝牙设备,以及使用“安全简化配对”(Secure Simple Pairing,SSP)协议的蓝牙设备。这些传统的蓝牙设备仅仅依赖于“个人身份码”(Personal Identification Number,PIN)的有效性作为唯一的认证规则,只要通信双方的蓝牙设备使用了相同的“个人身份码”,就认为通过认证,否则就认为没有通过认证。“个人身份码”只是一个由1位到16位数字组成的一个号码。在很多产品中,“个人身份码”都是在产品生产的时候,直接由产品静态定义的,终端用户也无法修改。在“安全简化配对”的蓝牙设备中,主要是指“基本速率蓝牙”和“增强数据速率蓝牙”,而二者在这里统称为“传统蓝牙”,并且,这两种蓝牙设备都支持多种认证方式,主要有如下几种。


“数字比较”认证(Numeric Comparison)在两个蓝牙设备上显示一个六位数字,提示用户判断两个数字是否相同,相同就选“配对”(Yes),否则就选“不配对”(No)。


“只比较不确认”认证(Just Works)尽管这种认证方式同“数字比较”的认证方式使用了相同的认证策略,但这种方式下并不提醒用户来验证这两个六位数字是否相同。


“密码输入”认证(Passkey Entry)在特殊场景下的认证方式,该场景中,一方设备有一个显示器,而另一方有一个数字输入键盘。这时,有显示器的一方会在显示器上显示一串六位数字,然后要求用户通过另一方设备的键盘上输入所看到的这个六位数字来进行验证。


“带外认证”OOB认证(Out of Band)“带外认证”OOB认证利用第三方的技术交换“认证数据和派生的密钥”,这种第三方技术如:近场通信(Near Field Communication,NFC)。


传统蓝牙”中,基于“安全简化配对”功能的设备通常使用“数值比较”认证方式、“只比较不确认”认证方式,或者是“密码输入”认证方式。无论是哪种认证方式,都使用“Diffie-Hellman椭圆曲线密钥”(Elliptic Curve Diffie-Hellman,ECDH)算法加密通信的数据,以便防御侦听攻击。此外,“数值比较”认证方式和“密码输入”认证方式都对防御“中间人的畸形数据”(MitM)攻击提供了保护措施,而“只比较不确认”认证方式并不能对防御“中间人的畸形数据”攻击提供保护;“带外认证”认证是否对防御“中间人的畸形数据”攻击提供保护,则取决于所选用的第三方的“带外认证”协议是否对于被动式侦听和“中间人的畸形数据”攻击提供防御措施。


随着“低功耗蓝牙”的引入,“蓝牙技术联盟”(Bluetooth Special Interest Group,SIG)简化了对设备认证的支持,其目的是为了降低“蓝牙控制器”(Bluetooth controller)的成本,并将“从设备”的复杂度降到最低。“低功耗蓝牙”设备上仍然还保留有“数值比较”“只比较不确认”和“带外认证”等认证方式,但“密码输入”认证方式在“低功耗蓝牙”上并不支持“安全简化配对”功能。虽然“低功耗蓝牙”支持上面多种认证方式,但是在“低功耗蓝牙”设备上,由于不再支持“Diffie-Hellman椭圆曲线密钥”加密算法,所以缺乏对被动式侦听攻击的防御保护措施。


从实际开发的角度来看,蓝牙“安全简化配对”SSP功能是难以利用。在蓝牙“安全简化配对”SSP功能处理过程中,被动式侦听也不能获得足够的信息可以发起一次还原“派生的加密主键”(derived encryption key)的攻击,很显然,这个“主键”正是数据可以解密的最关键元素。


尽管使用“Diffie-Hellman椭圆曲线密钥”加密算法,但蓝牙“安全简化配对”功能已在几个实例中证明,该功能是容易受到“中间人的畸形数据”的攻击的,主要是当攻击者可以干扰2.4GHz频谱,使原来处于活动状态的一对蓝牙设备不得不重新配对(re-pairing),加之在“只比较不确认”认证方式中,配对方式是“哑状态”(dumb down)下进行的,所以“中间人的畸形数据”就可以通过强制双方蓝牙设备使用“只比较不确认”认证方式静悄悄地完成攻击,有时,这种合二为一的攻击也称为“BT-NINO-MITM攻击”。虽然这种攻击方式被几个学术论文证明肯定是存在的,但到目前为止,还没有公开的、实际的工具是可以直接拿来使用的。


尽管存在这样的限制,仍然有基于蓝牙数据包捕获的公开、可访问的攻击工具,可以用来攻击“传统蓝牙”和“低功耗蓝牙”设备上的数据交换。这里所说的数据包捕获,主要是指超牙设备的数据包捕获功能。


1、传统蓝牙中的个人身份码攻击


两个设备可以通过配对,派生出来的一个128位的连接密钥(128-bit link key)。该密钥用在认证中,用于识别“呼叫设备”(claimant device)和加密所有通信的数据。这个“配对交换”(pairing exchange)只能在“传统蓝牙”中通过一个“个人身份码”值进行保护。


两个“传统蓝牙”设备之间的配对过程存在一个重大的漏洞,那就是攻击者在观察整个配对交换过程的前提下,可以加载一个离线的、针对“个人身份码”选择的暴力攻击。在配对过程完成后,后续的连接可以使用之前保存的128位的连接密钥用于认证和密钥派生。这种技术在当前对于攻击来说是有点不切实际的。


为了破解“个人身份码”的信息,攻击者必须首先单独地还原如下信息:


“发起随机数”IN_RAND,由“发起方”(initiator)向“响应方”(responder)发送。


两个“COMB_KEY值”,“发起方”和“响应方”都会发送。


“认证随机数”AU_RAND,由“认证呼叫方”(auchentication claimant)发送


“签署响应”SRES(Signed Response),由“验证确认方”(authenticaLion verifier)发送


在这里我们使用术语“发起方”和“响应方”,主要是想表明这是两个完全独立的“实体”(entity),其中一方发起了一“配对交换”,而另外一方对“发起方”进行了响应。在大多数情况下,从“配对”的角度来看,“主设备”是“发起方”,“从设备”是“响应方”,但是这个不是绝对的。“从设备”也有可能发起“配对交换”,“主设备”对此作出响应。


由于“传统蓝牙”的认证机制属于是“相互身份验证”(mutual-authentication),也就是说“从设备”的身份由“主设备”进行认证,反之亦然,所以攻击者有两次机会识别“发起随机数”值和“签署响应”值。这时的攻击者主要的精力全部放在完成认证的操作上,对于“配对交互”本身,攻击者反而不必关注太多,势在必得的重要数据是“主设备”或者“从设备”的“蓝牙设备地址”。此外,攻击者既要知道“从设备”的“蓝牙设备地址”,也要知道“主设备”的“蓝牙设备地址”,因为这两个地址“配对交换”的过程中并不会进行无线传送,所以只能通过上面“相互身份验证”过程中,捕获“发起随机数”值和“签署响应”值。


要想加载一个针对“个人身份码”的暴力攻击,攻击者需要有完整的“蓝牙设备地址”。只知道“低位地址部分”和“高位地址部分”是不够的,还需要指定正确的“非必要地址部分”。


 使用BTCrack攻击“个人身份码” 


BTCrack是一款Windows操作系统中的蓝牙“个人身份码”PIN破解工具,工具的开发者是Thierry Zoller。


要使用BTCrack软件,首先要进行“配对交换”数据包的捕获。在这一点上,可选的工具非常多,超牙系统、Wireshark软件、“前线蓝牙协议分析器600通信探测”设备、Ellisys公司的“蓝牙资源管理器400”,都可以在两个通信的蓝牙设备之间捕获“配对交换”数据包,并从中识别出“发起随机数”、两个“COMB_KEY值”、“认证随机数”、“签署响应”等值,一旦这些字段的值被捕获到或计算出,随后就可以确定“个人身份码”的最大长度,通过这个值,BTCrack软件就可以发起一起还原“个人身份码”的攻击了。对于BTCrack程序来说,上面的操作只需要单击“破解”(Crack)按钮即可,随后Crack程序就会通过暴力破解的方式对“个人身份码”进行破解,直到最终破解成功,拿到“个人身份码”的值;或者将字典中,所有可能的“个人身份码”全部用完,仍然没有正确的“个人身份码”,这时就意味着破解失败。


BTCrack程序允许指定一个程序所要破解的最大“个人身份码”长度,无论什么情况下,最大的“个人身份码”长度值只能达到16个字符的长度。但实际使用中几乎没有什么人会设置这样的长度,因为大量蓝牙产品,在基于“个人身份码”的认证中,通常都只使用4位长的数字“个人身份码”值。


BTCrack的图形用户界面GUI在实施“个人身份码”攻击的时候,会让用户感觉反应很迟钝,有时会在某个“个人身份码”破解的时候,程序看上去像“卡死”在那里。


但这只是程序界面响应上没有处理好,程序还是会继续运行,并最终完成破解工作。


在BTCrack程序的界面上,就像从程序的输出看到的一样,在成功地破解“个人身份码”值之后,BTCrack程序会显示出正确的“个人身份码”值,同时,作为攻击的一部分,程序还会将128位的“连接密钥”(link key)一同显示出来。同时,如果BTCrack程序破解成功,界面上还会显示出破解密钥所花费的总时间;如果BTCrack程序破解失败,那界面上显示的就是将密码字典中所有可能的“个人身份码”值都用完所花费的总时间。此外,在程序底部的状态栏上还会显示每秒破解的“个人身份码”的数量。在图1的这次攻击实例中,2.7GHz主频的i7-2620M系统,每秒进行了大约50万次“个人身份码”破解。

图1  BTStack攻击实例

 使用BTCrack OSS攻击“个人身份码” 


BTCrack OSS是BTCrack引擎的开源版本,程序剥离掉图形用户界面,而改用命令行程序,该程序是由Eric Sesterhen和Thierry Zoller共同开发,并由Mike Ryan进行了改进以实现跨平台使用(cross-platform use)。BTCrack OSS工具最常用于Linux操作系统和其他UNIX的变体系统。在Windows版的BTCrack程序中,还增加了一个小的性能方面的改进,并且这个针对Windows所做的改进版,其源代码也可以到Linux操作系统下编译运行,并正常使用。

就像前面提到的BTCrack软件,必须先识别出“发起随机数”、两个“COMB_KEY值”、“认证随机数”、“签署响应”等值,以及“主设备”的“蓝牙设备地址”和“从设备”的“蓝牙设备地址”,才能进行随后的破解工作。其中命令行中的“#threads”参数所表示的是程序所用“线程”(thread)的数量,主要是告诉BTCrack OSS程序同时使用多个CPU内核来加速破解的进程;要想获得最好的破解效果,可以指定一个比系统中CPU数量大“1”的一个值作为“线程”的数量。


在BTCrack OSS软件的输出结果中,各项字段数据的排列顺序很古怪,因为数据结果的输出顺序,与我们在进行破解操作时按时序流程“数据先发送再接收”的自然顺序不一样。举例来说,在指定顺序的时候必须按“主设备认证随机数”、“从设备认证随机数”、“主设备签署响应”、“从设备签署响应”的顺序,而不是按实际破解过程中,原本的“主设备认证随机数”、“从设备签署响应”、“从设备认证随机数”、“主设备签署响应”的顺序。在本例中,我们使用下面的“配对交换”数据值作为BTCrack OSS软件还原“个人身份码”的参数,其中的“顺序”字段(Order)是按使用该字段出现的先后顺序排列,所有参数如下所示:

其实,BTCrack OSS程序奇特的参数输入顺序有时会造成一定的误解,表面看,这些参数使用信息表明,在这些字段顺序中,“主设备”总要是放在第一位的,即“主设备”总是先发起“配对交换”,然后“从设备”对其响应。然而,事实上,“从设备”也可以发起“配对交换”,在这种情况下,所有“从设备”和“主设备”的数据将会发生互换。如果真的是这样,“从设备”首先发起了“配对交换”,那么只需要在使用BTCrack OSS程序的时候,将本来应该给“从设备”的参数,替换成“主设备”的,反之亦然,对于本来应该给“主设备”的参数,现在替换成“从设备”即可。


如果按BTCrack OSS程序所要求的顺序指定了配对数据,那么就可以获得想要的结果,如下所示:

尽管从“配对交换”过程捕获到的数据包中,我们能够获得大部分用来攻击“个人身份码”选择的数据,但是攻击者还是需要手工提供完整的“蓝牙设备地址”信息。如果参与“配对”的蓝牙设备处于“可发现的”模式(discoverable mode),那么通过hcitool工具的扫描,就可以从扫描结果中轻易地找到这些地址信息。但如果两个设备中的一个或两个都配置为“非可发现的”模式(non-discoverable mode)下,那么问题就变得麻烦了。


幸运的是,在连接建立过程中,捕获到的数据包可以帮助我们在“跳频同步”(Frequency Hop Synchronization,FHS)数据包内获得“蓝牙设备地址”信息。如果是在连接建立之前,这些数据包所包含的是“主设备”的“蓝牙设备地址”,同样,如果“主设备”和“从设备”交换角色的话,那么泄漏的就是“从设备”的“蓝牙设备地址”了。使用超牙工具,可以对“基本速率蓝牙”的数据包进行解码输出,我们从“跳频同步”数据包中,通过拼接“非必要地址部分”、“高位地址部分”和“低位地址部分”三部分的数据获得“蓝牙设备地址”。


 防止个人身份码被攻击的措施 


蓝牙自身存在的漏洞导致了“个人身份码”遭到攻击,同时这也是开发“安全简化配对”(Secure Simple Pairing,SSP)认证机制的主要动机之一。如果可能的话,用户应该尽可能地使用“安全简化配对”来取代传统“个人身份码”认证,这样做主要是在”配对交换”过程中,削弱针对“个人身份码”认证的攻击。


通常情况下,用户在蓝牙产品的“配对”机制上,并没有选择的余地。考虑到黑客在使用BTCrack和BTCrack OSS这样的工具进行攻击的时候,他需要捕获蓝牙设备之间的“配对交换”,所以要避免在这段时间内受到攻击,用户应当尽量选择在攻击者无法实现侦听的区域内再进行配对过程。换句话说,用户不要在商店、购物中心或者其他公众场合内进行蓝牙的配对过程。


另外,如果必须使用这一机制,那么用户应在设置“个人身份码”值的时候,选择使用最大的长度,也就是16位长度的“个人身份码”。这对于愿意花足够时间进行破解攻击的黑客来说虽然无效,但是,这个足够大的“个人身份码”熵值会大大增加黑客在没有密码的情况下加速破解该资源的困难程度。


2、低功耗蓝牙中的个人身份码攻击


“低功耗蓝牙”的“配对”很容易遭到脱机“临时密钥”(Temporary Key,TK)攻击,该攻击主要针对“低功耗蓝牙”中的“只比较不确认”和“密码输入”这两种“配对”认证方式。攻击者在两个设备之间通过捕获“配对交换”,可以还原“临时密钥”,然后由该值派生出“长期密钥”(Long Term Key,LTK),“长期密钥”用于加密随后“低功耗蓝牙”的数据交换。


 通过Crackle工具破解低功耗蓝牙 


Crackle程序是一款“低功耗蓝牙”的“临时密钥”破解和数据包解密工具,是由Mike Ryan编写。该程序的设计初衷,是能对libpcap格式的数据包捕获文件进行分析和解密,至于这个格式的数据包,可以是通过超牙或其他兼容的工具进行捕获的。Crackle程序可以用直接的方式,对“低功耗蓝牙”中“只比较不确认”和“密码输入”这两种“配对”认证方式中的“临时密钥”TK进行还原。


要在系统中安装的Crackle程序,需要从GitHub库中检查代码,然后编译和安装Crackle程序,步骤如下所示:

如果运行crackle命令的时候,没有附带参数,那么将会显示Crackle程序的使用信息:

要还原“临时密钥”,所捕获的数据包,必须包括整个“配对”过程;任何“配对交换”部分的缺失(比如说因为一个CRC校验错误而导致的系统将一个或一些数据包直接扔掉),都会将阻止攻击者还原“临时密钥”。一个通过Crackle程序对“临时密钥”TK成功的还原过程如下所示:

在这个例子中,“临时密钥”TK的值被成功地还原出来,为“000000”,这是一个在“只比较不确认”认证方式中也使用的一个公共值。可以有选择地使用Crackle程序解密捕获到的数据包,也可以指定一个文件名,将其捕获的数据包输出到一个文件中。

当一个数据包的捕获通过Crackle软件进行解密的时候,Crackle软件也会显示“长期密钥”。这个值在即使蓝牙设备完成“配对交换”的情况下,也可以用来解密“低能耗蓝牙”的通信数据包。

在上面这个例子中,第一次尝试使用Crackle软件还原“临时密钥”是失败的,失败的原因是在“配对交换”过程中缺少必要的数据包。然而因为我们在前面的步骤中,已经捕获到“长期密钥”,所以我们可以在命令行程序中通过“-l”(小写字母L)参数指定这个“长期密钥”,然后再破解这些数据。


作为一个攻击工具,Crackle程序是简单而有效的,但是只能在“配对交换”已经捕获到的前提下,或者是“长期密钥”已经被破解的前提下,才有效。这个条件制约了该产品对于“低功耗蓝牙”的攻击效果,因为“配对”过程通常只发生在蓝牙设备初始化的时候,同时,不是每次设备在加电开启的时候,或者连接到另一个蓝牙外设的时候,黑客都能事先等在旁边架好了设备,不断侦听,随时等着“配对”的出现。


 防止临时密码被攻击的措施 


既然“低功耗蓝牙”的“配对交换”容易招来“临时密钥”猜测攻击(TK guessing attack),那么用户应该只在黑客无法从事侦听攻击的场所进行“配对交换”的操作。比如在工作单位、在自己家里,对于极端要求安全的情况下,甚至可以考虑在一个“法拉第笼”(Faraday cage)里进行。反过来,不合适的场所,当然就是那些咖啡店、商店,和其他黑客可以以合理的角色很方便参加的活动场所,在这些地方,都是不鼓励进行蓝牙“配对交换”的。


3、实用的个人信息码配对破解


如同前面看到的那样,如果攻击者能够对“配对交换”进行捕获,那么对“个人识别码”进行破解,或是对“低功耗蓝牙”的“临时密钥“TK进行就简单的多了。然而,这个威胁只是短暂的,一旦设备“配对”成功之后,就不再使用“配对”策略了,因而对于这种基于“配对”的攻击方式下,蓝牙通信的漏洞就不存在了。


从机会主义攻击者的角度来看,我们经常会看到人们在公共场合进行蓝牙“配对”操作,如购物中心的美食广场,以及咖啡店。经常有消费者走进咖啡店,一边喝着咖啡,一边拆掉产品的包装,将新买的手机同蓝牙耳机进行“配对”。


如果您正在攻击一个已经完成“配对”操作的“微微网”,那么,还有一种其他的方法能够迫使设备进行“重新配对”(re-pair)。对于攻击者,可以使用“重新配对攻击”(re-pairing attack),操纵事先保存好的两个设备之间的配对状态冒充两个蓝牙通信设备中的一个或两个“蓝牙设备地址”。


 重新配对攻击 


在“重新配对攻击”中,攻击者先假定“微微网”中一个或两个蓝牙设备的“蓝牙设备地址”。一旦他假设的地址同被攻击的目标蓝牙地址相匹配,那么攻击者就会尝试与这个目标蓝牙设备进行连接。这个连接理所当然会失败,因为攻击者并不知道初始时的“配对交换”中使用的“连接密钥”(link key)。连接失败之后,许多蓝牙设备会因为有攻击者的新的“蓝牙设备地址”而废弃掉之前所保存的“连接密钥”,并认为远程蓝牙设备上肯定也会删除这个“连接密钥”。对于不同的蓝牙设备,略有不同的是“传统蓝牙”设备使用的是“连接密钥”,而“低功耗蓝牙”设备使用的则是“长期密钥”。然而,这时对方的合法蓝牙设备并不知道这些,于是当这个合法蓝牙设备与被攻击蓝牙设备的再次尝试连接的时候,被攻击蓝牙设备上,之前与合法蓝牙设备所共同创建的“连接密钥”就不再有效了,最终导致当前的连接失败,然后双方的蓝牙设备都会提示各自的用户重新进行“配对”,而这一机制,正好为攻击者创造了一次捕获“配对交换”的机会。


要加载一个成功的“重新配对攻击”,那么攻击者同时获取到如下几个值。


基于CSR芯片的蓝牙接口:不是所有的蓝牙无线设备都可以改变自己的“蓝牙设备地址”,但是基于CSR芯片的无线蓝牙设备却通过Linux操作系统下的bdaddr工具普遍支持这一功能。所以,实施这种攻击,我们需要有一个基于CSR芯片的蓝牙接口。


之前配对的“主设备”的“蓝牙设备地址”:攻击者必须知道之前“配对”成功的那个“主设备”的“蓝牙设备地址”。这个“蓝牙设备地址”也正是攻击者在对被攻击蓝牙设备进行连接时所要冒充的“蓝牙设备地址”。


被攻击设备的“蓝牙设备地址”:攻击者必须知道要攻击设备的“蓝牙设备地址”,在攻击中,这个设备处于“从设备”的位置。攻击者需要使用“主设备”的“蓝牙设备地址”攻击被攻击者,强迫其“重新配对”。


蓝牙数据包的捕获:攻击者必须能够捕获到随后的“配对交换”数据包。捕获数据包的工具可以使用超牙设备,或者是其他商业蓝牙侦听设备。


在物理距离上接近被攻击设备,并且可以建立连接:攻击者必须能够发起一个连接到被攻击设备上,才能发起“重新配对攻击”方式。也就是说,攻击者的蓝牙设备,要在物理距离上离被攻击的蓝牙设备很近,近到双方可以建立一个连接的距离之间,“重新配对攻击”才有实施的可行性。


标准Linux操作系统上,并没有能够冒充“蓝牙设备地址”功能的工具。而要完成这种攻击,就得从第三方工具中查找,比如,我们可以使用bdaddr工具。bdaddr程序是由Marcel Holtmann编写的,这个人也是Linux操作系统上BlueZ程序的作者。目前这个程序已被作者多次修改,解决了软件中的多个bug。如果要手工下载和从源代码的级别上创建应用程序,其步骤显示如下。

使用bdaddr工具以及标准Linux上的hcitool工具,我们将加载一个“重新配对攻击”。第一步,我们开启数据包的捕获,然后使用被攻击设备的“蓝牙设备地址”作为目标地址,并在随后与该设备同步进行跳频操作。接下来,改变我们本地的基于CSR芯片的蓝牙接口,将其原来的“蓝牙设备地址”改成“主设备”的“蓝牙设备地址”,而“主设备”的“蓝牙设备地址”则可以从本攻击之间,侦听到的“主设备”与“从设备”的“配对”通信中计算出来并保存的。最后一步,我们通过领先的“蓝牙设备地址”创建一个到被攻击设备上的连接,以便使用hcitool工具强制发起“重新配对攻击”。在这个例子中,我们伪造的“蓝牙设备地址”是00:00:33:E4:f2:80,这是一块智能蓝牙手表的“蓝牙设备地址”,要攻击的蓝牙设备是商标为Nexus 7的Android操作系统平板电脑,其“蓝牙设备地址”是d8:50:e6:31:49:4b。

在攻击者连接到Android平板电脑之后,就尝试通过协议协商支持加密的通信,这个协议协商必然会因为地址错误而导致“连接密钥”失败的事件,更重要的是Android设备会在随后废弃以前的密钥数据,并且拒绝手表设备使用以前建立的密钥值进行随后的数据通信。当这个被攻击的设备确认到对方设备不会再连接后,就会启动“重新配对”的连接,重新生成密钥。而这样做,对于攻击者来说,是正中下怀的事,因为攻击者正好可以趁着这个设备“重新配”的时候进行侦听。所以对于这时的手表来说,它的“重新配对”将自己暴露在了侦听者的圈套里。侦听者在捕获到“重新配对”过程之后,就可以发动针对“个人身份码”和“临时密钥”的还原攻击。


要将攻击者的蓝牙加密狗返回到原始的“蓝牙设备地址”BD_ADDR配置,我们可以使用Linux下bccmd工具中的coldreset命令实现,其操作步骤如下。

 重新配对攻击的防御措施 


假设收到一个请求,该请求看上去“很像”(seemingly)以前的“配对”设备,但是没有“连接密钥”,该怎么办?幸运的是,不是所有的蓝牙设备都会在收到这样一个请求时废弃当前的连接,这一机制,对于抵御“重新配对攻击”来说,无疑是一个好的作用,因为它限制了您的设备暴露在这种攻击的危害性。如果攻击者的攻击是成功的,那么用户就会被迫同设备进行“重新配对”,并重要创建一个窗口,在该窗口中,重新输入“个人身份码”的值。


我们建议用户只在那些没有潜在安全威胁的场所输入他们的“个人身份码”PIN。比如说,如果在公众场合,或者黑客会议上,您的蓝牙设备突然提示您去输入“个人身份码”PIN值,那么我们的最佳建议是立即停止使用蓝牙功能,直到返回那些不会受到蓝牙侦听攻击的地方,再重新启动该功能,进行蓝牙数据通信。


通常情况下,在“杀机四伏”的场所,比如黑客大会上,禁用蓝牙功能是一个明智的选择。不过,一个非常普遍,且有点令人不安的现象是:我们常看到有黑客大会的参与者手拿移动设备,它的移动设备甚至被设置为“可发现的”模式。请记住,这相当于向满屋的黑客发出“攻击我吧”的请柬!

二、伪造设备的身份


蓝牙设备采用多种身份机制向外界传达本设备的各项信息,比如“设备功能”(capability)、“服务分类”(service classification)、“设备地址”(address)以及“友好名称”(friendly name)。根据想要攻击设备所处的目标环境,可能会发现修改攻击系统的身份对于攻击目标是非常有帮助的。


每个蓝牙接口都是用一个“服务类别标识符”(service class identifier)和“设备类别标识符”(device class identifier)来表示,分别被称为“服务类型”(Class of Service)字段和“设备类型”(Class of Device)字段,二者总共有24位,如图2所示。“服务类型”信息是一个11位的字段,它通常表示蓝牙设备上运行的服务,可以分成多种类别,包括定位设备(位置识别)、渲染设备(打印机、扬声器)、采集设备(光学扫描仪、麦克风)等。

图2  蓝牙设备的“服务类型”字段和 “设备类型”字段

“设备类”信息又可以分为两个子字段,它们分别是“主要设备类型”(major class)和“次要设备类型”(minor class)。“主要类型”字段定义了10种不同的设备类型,如表1所示。

表1“主要设备类型”的类型

“次要设备类型”字段表示是给定的“主要设备类型”设备之下,再进行的二级细分。比如说,当主要类是“电话类型”(“主要设备类型”的值为0x02)时,根据“次要设备类型”字段就可以区分到底是移动电话(“次要设备类型”的值为0x01)、无绳电话(“次要设备类型”的值为0x02)、智能电话(“次要设备类型”的值为0x03)或者是有线调制解调器(“次要设备类型”的值为0x04)。


通常情况下,“服务类型”、“主要设备类型”和“次要设备类型”字段对于一个具体的设备来说都是一成不变,但是一个例外的设备类型,就是“网络接入点”(即“主要设备类型”是0x03),当“主要设备类型”是0x03时,“次要设备类型”经常会动态地变化,变化的原因是因为其使用率的变化。比如,现在“次要设备类型”为蓝牙网络链接的,有1%~17%的使用率将“次要设备类型”归为0x01,而另外83%~99%的“次要设备类型”使用0x06。


在“服务类型”字段和“设备类型”字段的最后两位是“格式类型”(format type)字段,主要用于表示版本标识符。当前这个数值都为“00”,但是“蓝牙技术联盟”需要其他字段来区分更多的设备,就会在重新定义以后,修改这里的版本标识符,所以这个字段在未来也可能是其他的值。


通过蓝牙侦听类的扫描器,对每一个扫描到的设备,都可以获得设备的“服务类型”和“设备类型”信息。在Linux操作系统的命令行下,我们可以扫描“可发现的”模式下的“基本速率蓝牙”和“增强数据速率蓝牙”蓝牙设备,并且读取它们的“服务类型”和“设备类型”信息。完成读取命令,是通过hcitool命令完成的,命令格式如下:

在上面输出的结果中,这个设备的“蓝牙设备地址”为00:1B:63:5D:56:6C,并且它的“服务类型”和“设备类型”字段是0x3a010c。我们可以将这个值转换成二进制形式,然后依次检查每个独立的字段,从而获取“服务类型”和“设备类型”信息,对应的信息如下所示:


0x3a010c=001110100000000100001100

服务类型 00111010000 设置了音频,对象传输,采集和网络

主要设备类型 00001(0x01) 主要类型是电脑

次要设备类型 000011(0x03) 次要类别是笔记本电脑

格式类型 00 目前一直为00


我们可以通过使用btclassify工具自动对类型信息进行解码,该程序由Mike Ryan编写。该命令的使用格式如下所示:

一旦知道了“设备类别”和“服务类型”字段的意义,就可以识别对方是什么设备,也可以使用这样的信息来伪装作为攻击者的“设备类型”,以便迷惑被攻击者。


 修改服务类型和设备类型信息 


许多设备使用“服务类型”和“设备类别”信息来区分蓝牙设备的功能。许多蓝牙设备对与自己连接的蓝牙设备类型还是比较“挑剔”的,如果对方的“服务类型”和“设备类型”信息与自己所要求的类型不匹配的话,这些蓝牙设备会拒绝远端设备的连接请求,或者会显示本地设备不存在的信息给对方。


举例来说,iPhone手机的蓝牙功能非常“挑剔”,除了蓝牙音频设备或蓝牙耳机之外,其他的外围蓝牙设备统统不予支持。也就是说,iPhone手机的蓝牙模块通常会忽略那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”不匹配的外围蓝牙设备的连接,而只会支持那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”相匹配的外围蓝牙设备的连接。


Linux操作系统上,我们可以使用hciconfig命令检查本地的蓝牙设备的类型信息,如下所示:

幸运的是,hciconfig也同样能够对“服务类型”和“设备类型”信息进行解码,在上面的例子中,我们可以看到这个蓝牙设备的配置的“服务类型”是“网络服务”(即上面的输出结果中的“Networking”),它的“主要设备类型”是“计算机”(即上面的输出结果中的“Computer”),“次要设备类型”是“笔记本电脑”(即上面的输出结果中的“Laptop”)。


在root权限下,我们可以修改“服务类型”和“设备类型”信息,然后伪装系统的身份,变成我们想要的效果。举例来说,我们将“服务类型”和“设备类型”信息修改为Oxf00704,根据上面的定义,这时我们的系统的“主要设备类型”为“可穿戴的设备”(wearable device),“次要设备类型”为“腕表”(wristwatch)。

通过修改“服务类型”和“设备类型”信息,当该设备出现在iPhone的蓝牙设备扫描结果的时候,其扫描实例如图3所示。从中可以看到,设备的名称“NotReallyAWatch”是在上一步操作中定义的。由于该设备的类型不是iPhone设备的蓝牙能接受的类型,所以iPhone拒绝了该设备的连接。

图3  扫描结果

 对修改服务类型和设备类型信息攻击的防御措施 


不幸的是,对任何一个特定的蓝牙设备,在蓝牙规范中并没有使用任何机制来约束“服务类型”和“设备类型”信息要怎么写,必须怎么写。这就意味着攻击者只要将设备类型设置为“其他任何蓝牙设备类型”,就可以任意配置或修改自己系统中的蓝牙设备信息。正常情况下,这个缺点并不一定代表是个多大的问题,最多只能算是个bug,因为“设备类型”的值本身也只是仅供参考。不过,如果您的系统涉及安全类的信息,比如设备远程类信息验证,那么,应该认识到,攻击者可以冒充任何装置,规避过滤机制,对您发出连接的请求,所以一个较为安全的办法就是向iPhone手机学习,在设计蓝牙连接的时候,只接受特定“设备类型”的连接。


三、蓝牙规范的滥用


许多有关蓝牙设备在软硬件实现中的漏洞识别和报告,其成因实际上都是蓝牙规范本身在设计实现上存在的漏洞。有各种各样蓝牙“服务发现”类的工具,可以读取蓝牙设备上的所有服务,以及指定服务以后,可以读取该服务的详细信息。BlueZ开发包中的sdptool程序可以浏览目标蓝牙设备上的服务,也可以在明确地指明某个服务后,向目标蓝牙设备发出请求服务信息,然后借助于读取到的目标蓝牙设备服务信息,我们可以发现,这些服务都是各自为政,独立地使用系统的安全控制参数,而这些服务中,经常会有某个服务会为攻击者提供未授权的访问权限。


在蓝牙设备上,有些服务通常会要求身份认证或者数据加密,比如耳机规范,或者蓝牙免提规范中要求用户的通信必须进行数据加密,并且通信前必须经过认证,这本身当然是好事。但是蓝牙设备的开发者除了遵守上面的约定之外,为了自己的需要,会加入一些其他的规范,这些新增的规范却需要更低的安全性要求。比如,如果要通过“对象交换规范”(Object Exchange Profile,OBEX)接收一个由远端蓝牙设备上以“推送”(Push)的方式发来的名片(business card),这看起来应该是一个在安全方面平淡无奇的服务。这个服务不需要远端蓝牙设备在本地进行的认证,所以使用凡是能最大程度地保证了信息共享的简便性的协议就可以。这时,设计者往往会从其他服务中进行选择,比如“文件传输规范”(File Transfer Profile,FTP)成为首选,并且为了简易性,蓝牙的设计者在使用这个协议的时候可能也不要求简单验证,并且在蓝牙接收方发现并扫描文件内容之前,还会选择将所有要传输的文件暂时存放在一个他自己认为是已“隔离”的目录中。


针对上述情况,一旦用户通过工具发现这些“虽然不是蓝牙规范设计上,而是蓝牙规范使用上”的漏洞,攻击者就可以绕过那些在蓝牙设备上精心配制的安全措施,在目标设备设置触发“拒绝服务”(Denial of Service,DoS)的条件,然后在要攻击的目标系统上执行任意命令。尽管历史上,蓝牙规范中存在着不少漏洞,但是由于移动手机的快速发展,这些漏洞的寿命越来越短暂,因此,在下面的内容中,我们不会讲解那些已经被修补的漏洞,因为它们在最新的设备中几乎已经不存在了,我们会将关注点转向利用已知或者从前没有公开的漏洞,配合以恰当的工具对重要数据进行枚举(enumeration data)的方式,对目标蓝牙设备实施入侵。


1、测试连接访问


要想进入某个蓝牙系统,并对其进行评估,我们面临的第一个障碍是判断是否可以在“逻辑链路控制及适配协议”层上同远程蓝牙设备建立一个连接。如果在“逻辑链路控制及适配协议”的访问被对方所拒绝,那么就不要想获得更高一层的协议上的各项功能了。


对于一个给定的目标,创建一个到远程系统的连接,就可以通过“主机控制接口协议”层的嗅探工具hcidump命令查看一个连接状态。hcidump工具通常是一个对Linux操作系统发行单独的工具包,但是,它也是Linux操作系统上BlueZ开发包的一个组件。在基于Debian的系统中,可以安装hcidump工具,其命令格式如下所示:

一旦hcidump程序安装完毕,我们就可以检查在本地蓝牙接口和远程蓝牙设备之间,“主机控制接口协议”层以及更高层之间的连接性。运行不使用任何参数的hcidump命令,工具就开始收集和显示hci0接口上的信息。hci0接口是该命令在默认情况下的选择,如果想改变这个默认值,让命令检测其他hci端口上的值,则需要使用“-i”参数,并在后面跟上要改变的端口值,就可以指定显示其他的接口上的信息。另外,如果再在命令行后附加上“-t”参数,我们还能够在结果中增加显示读取时的“时间戳”(timestamp)信息,命令的格式及实例效果如下所示:

再打开一个窗口,并在新的这个窗口中运行hcitool命令,并附带一个“cc”参数。该参数的作用是指定的是远端设备的“蓝牙设备地址”。这是创建一个与所指定这个目标蓝牙设备之间的连接。

回到前面的hcidump命令所在的窗口中,会看到程序尝试连接的状态。在这个例子中,通过hcitool命令所建立的连接是成功的,因为本地设备执行了“主机控制接口协议”的“Create Connection”命令,这表示这两个蓝牙设备之间的连接会话支持这两个蓝牙设备之间建立这个层次的连接特性。另外,这里的改变后的“传送时隙”(transmission slot)的个数也可以设置为默认值,以便将来使用,通过该值可以查询远端设备的“友好名称”(friendly name)信息。在整个命令序列的最后,程序终止了会话。

在hcidump命令的结果中,“小于号”和“大于号”表示的是“主机控制接口协议”层数据通信数据包的流向。从“高堆栈层”(upper-stack layer)流向低堆栈层(lower-stack layer)的时候,就用“小于号”(即实例中的“<”);从“低堆栈层”流向高堆栈层的时候,就用“大于号”(即实例中的“>”)。另外,这些符号除了表明数据在本地设备上协议栈之间的流向之外,也同时表明了数据在本地蓝牙设备和远端蓝牙设备之间的流向,通常情况下,“小于号”表示数据通信数据包从本地蓝牙设备流向远端蓝牙设备,“大于号”表示从远端蓝牙设备返回到本地蓝牙设备。不过,在某些情况下也有例外,比如“命令”状态(即实例中部分“Commmand”)中,数据是直接由“主机控制接口协议”层本身而来,而不是从远程蓝牙设备发送而来的。


下面显示的是一个在连接尝试中失败的例子。由于在命令行中添加了显示详细信息的“-V”参数,所以该命令在之后返回的结果中,以尽可能详细的格式显示所接收命令的状态。

在上面的例子中,可以看到远端蓝牙设备拒绝了我们尝试连接的请求,返回的原因代码是“无法接受的‘蓝牙设备地址’所导致的拒绝连接。”(即实例中最后一行的“Error:Connection Rejected due to Unacceptable BD_ADDR”)。这样的结果表明远端蓝牙设备使用了“蓝牙设备地址”过滤措施,这为攻击者同远端蓝牙设备进行连接多设置了一道障碍。


如果我们知道拒绝连接设备所在“微微网”的“主设备”蓝牙地址,那么可以使用BlueZ测试工具集中的bdaddr工具来伪装成授权设备,从而绕过这个限制。


一旦同目标蓝牙设备建立了一个基本的“逻辑链路控制及适配协议”连接,我们就可以继续攻击远端设备上可用的服务了。


2、未授权访问个人局域网


蓝牙“个人局域网”(Personal Area Networking,PAN)的规范被设计为一个或多个设备之间创建ad-hoc网络连接。如果再与“蓝牙网络封装规范”(Bluetooth Network Encapsulation Profile,BNEP)组合,那么使用蓝牙通信的设备可以通过蓝牙接口模拟出一个以太网络,无缝地(seamlessly)通过蓝牙的网络介质传输以太网格式的数据帧。通过“个人局域网”和“蓝牙网络封装规范”,两个设备可以使用任何上层协议交换数据,就像IP堆栈的分层结构一样,只是将IP堆栈的最低层换成了蓝牙“个人局域网”。“个人局域网”的规范会在以下两种情况下用到。


对于蓝牙“个人局域网”来说,第一种部署是在“网络接入点”(Network Access Point,NAP)服务中,在这种情况下,既然是作为接入点服务,那么这时的蓝牙设备所担当的角色往往是负责访问授权控制的设备形式,桥接器(bridge)、路由器(router)或者代理服务器(proxy),蓝牙设备传输的一端是蓝牙“微微网”,另一端是一个上游网络(upstream network),如一个以太网的局域网LAN。在这种情况下,蓝牙“个人局域网”规范的外在表现形式,就不一定非得是我们想象的蓝牙设备的模样了。比如这时的这个蓝牙设备从外表看上去,完全可以是一个Wi-Fi的AP接入点装置,但其内部运行的仍然是蓝牙“个人局域网”的规范,只是将蓝牙作为了无线通信的介质而已。

对于蓝牙“个人局域网”的第二种部署是在“组间ad-hoc无线自组网络”(Group Ad-hoc Network,GN)服务中,用于“微微网”中两个或者多个无线蓝牙设备之间创建“点对点”(point-to-point)的连接。这种使用案例和IEEE 802.11 ad-hoc网络配置很相似。“组间ad-hoc无线自组网络”服务和“网络接入点”在部署时的选项上有很大的差别,“组间ad-hoc无线自组网络”服务允许“微微网”中横向的“主设备”参与到与其他设备的数据交换中,而“网络接入点”服务只是负责在纵向的“上游设备”(upstream device)和“下游设备”(downstream device)之间转发数据帧。


许多蓝牙设备都支持通过“网络接入点”和“组间ad-hoc无线自组网络”这两个协议来使用蓝牙介质为上层的协议堆栈服务。其中,“网络接入点”服务通常用在向上游网络提供授权和提供资源,比如我们通过笔记本电脑上的蓝牙接口与手机的蓝牙接口连接后,就可以借助于手机建立“全球移动通信系统”模式的网络连接,使得笔记本电脑达到上网的目的。由于“组间ad-hoc无线自组网络”服务和“网络接入点”服务很相似,所以“组间ad-hoc无线自组网络”服务也支持ad-hoc文件共享,或者其他“短时网络服务”(short-term networking service)。尽管默认情况下这两种服务都处于关闭状态,但是在OS X操作系统的10.4版本和之后版本的设备中都提供这两种服务,一旦开启之后,我们就可以通过标准“服务发现协议”扫描发现它们,其格式和效果如下所示:

从攻击者角度来说,“网络接入点”服务为攻击者提供了一个机会,通过这个机会攻击者可以跨越目标蓝牙设备访问在蓝牙设备另一侧的网络资源。由于另一侧的网络资源可以是蓝牙资源,也可以不是蓝牙资源,所以这意味着,攻击者还可能利用蓝牙连接通过以太网或者IP网络攻击其他主机。对于“组间ad-hoc无线自组网络”协议,攻击者的兴趣就相对弱一些了。因为尽管这时攻击者发现某个蓝牙设备上也存在漏洞的话,也可以对这个目标设备可以枚举出它的服务,以及使用这个蓝牙设备,但归根结底,这时的攻击者也只能攻击目标设备本身而已。


“蓝牙技术联盟”的规范文档中,对于“个人局域网”规定了一个高强度的安全措施,那就是在“个人局域网”中应该应用“网络接入点”服务和“组间ad-hoc无线自组网络”服务,并且还要包括“连接管理器协议”认证和加密。同时还包括高层的认证选项,比如IEEE 802.1X也不例外。不过,尽管有这些建议,最终并不是所有的“个人局域网”都实现了这些所需要的认证方式,也不是所有的“个人局域网”都在访问的时候建立了加密的密钥值。


Blekin F8T030是一个使用蓝牙作为其无线传输介质的“网络接入点”,当然也是遵照“网络接入点”服务规范运行的。默认情况下,F8T030设备并不会尝试认证或对连接进行加密,而只是“桥接”到一个本地的以太网接口上。同时,它也会在设备的“友好名称”中泄露网络IP地址信息,如下所示:

我们可以使用BlueZ开发包中的pand工具,将Linux操作系统的蓝牙接口连接到蓝牙AP接入点上:

在这个例子中,我们通过“modprobe bnep”命令,装载了基于“蓝牙网络封装协议”的Linux内核模块,然后我们又运行了pand命令,并通过“-c”参数指定目标蓝牙的“蓝牙设备地址”,然后通过“-n”参数在进程中延时(delay)等待一会儿,直到连接建立成功后将其变成后台守护进程。pand进程对自身进行通告广播,并在数秒后识别出一个新的接口bnep0已经被创建好。这时我们使用ifconfig命令将这个接口设置为“开放”(up)状态。


作为一个可以取代bnep命令的命令行工具,Blueman程序可以提供一个图形界面。通过Blueman程序,可以建立“个人局域网”连接。


一旦我们创建好bnep0接口,下面就可以通过Belkin F8T030拥有一个以太网网桥,通过这个网桥可以连接到位于Belkin F8T030后面的有线网络。在本例中,我们可以运行tcpdump工具,跟踪IPv6和IPv4在网络中的广播通信数据包在网络上的传送。或者,我们也可以在局域网上,为bnep0接口手工配置一个IP地址,或者使用“动态主机配置协议”客户端自动请求一个动态的IP地址,其步骤如下所示:

当想要关闭pand命令所创建的接口时,可以在再次运行pand工具时,指定“-K”参数来结束所有的pand连接:

关于使用pand工具,获得更多的调试信息,可以通过“/var/log/syslog file:tail–f/var/log/syslog”命令进行查看。


一旦我们通过“个人局域网”规范获得对局域网LAN的访问,那么就可以访问那些存在漏洞的网络设备,尽管数据传送的速率很低,就好像不存在蓝牙设备,而是直接与那个局域网建立了物理连接一样。


恶意的蓝牙网络


Belkin F8T030蓝牙AP接入点不太可能成为目标网络中的“弱点短板”(stumble)。比起蓝牙接入点来说,笔记本、台式电脑和手机等蓝牙设备,更有可能被黑客发现正在运行“个人局域网”服务而视为弱点攻击对象。然而,类似Blekin接入点这样的设备,虽然不会成为“弱点短板”,但却完全有可能会出现在另一种无线攻击手段中:恶意的“骗子”接入点。


恶意的“骗子”接入点其实就是一个“骗子”无线设备,它被“放置”到要攻击的某个目标机构的网络中,其目的就是借助于这个“骗子”接入点,使攻击者能够从“安全的距离”访问该网络。上面所说的“放置”接入点,对于攻击者来说,可以有多种途径:突破对方物理安全设备的保护,然后安装一个接入点,比如将接入点偷偷部署在大厅的某个隐蔽的角落中;欺骗业务不精的员工(less tech-savvy staff)让他们在不知情或被误解的情况下帮您部署接入点;或者买通那些意在报复雇主的内鬼,让他们操刀完成部署。


越来越多的机构开始使用“无线入侵检测系统”(Wireless Intrusion Detection System,WIDS),其目的就是在他们的设备中监控无线设备的活动。对于黑客来说,要逃避对方的检测,在对方的目标网络中部署一个属于自己的恶意的“骗子”接入点,变得比以前更加困难了。然而幸运的是,对于黑客来说,现在基于IEEE 802.11的“无线入侵检测系统”目前并不太适合鉴别蓝牙无线设备的本质特点。因而如果能成功部署一个基于蓝牙的“骗子”接入点到目标网络中,相对于基于Wi-Fi的“骗子”接入点要容易很多。


如果攻击者想要在一个使用了“无线入侵检测系统”的目标机构中部署一个恶意的“骗子”接入点,那么他只需要简单地将蓝牙代替Wi-Fi作为传输机制就可以了。只是通过微小的硬件改动,或者商用适配器,Belkin的接入点就可以转变成一个恶意的“骗子”接入点,甚至,这款设备可以通过“以太网加电”(Power over Ethernet,PoE)端口通过网络远程开机。更进一步来讲,F8T030的电路板非常小,它足以隐藏在任何“看似无害”(innocuous-looking)的设备中,比如烟雾探测器(smoke detector),或者其他环境监测设备,增加了攻击者躲避检测的可能性。


3、对文件传输的攻击


另一种蓝牙设备通信中常见的服务,是向远端蓝牙设备传输文件。有两种蓝牙规范支持文件传输功能,可以在多种使用场合。


第一种支持文件传输功能的蓝牙规范,叫作“对象推送规范”(Objecc Push Profile,OPP),“对象推送规范”使用“对象交换”(Object Exchange,OBEX)协议进行有限的文件传输操作。“对象交换”为“对象推送规范”所用,主要用于在“对象交换”客户端和服务端之间建立和中止会话。同时也会保存和读取文件,中止进程中的文件传输。“对象推送规范”并没有实现列出远端蓝牙设备上的文件系统的功能,所以要想获取一个文件,必须是基于事先就知道要获取的文件名,而获取文件名又只能借助于其他第三方的协议,因此客户端通过“对象推送规范”读取服务端上的文件这一应用使用不多。相反,使用这个规范实现的简单的文件交换方式是客户端主动通过“推送”(push)的方式将一个本地文件传送到蓝牙通信远端的服务端,或者通过“电子名片”(VCards)规范进行单向(unidireccional)或者双向(bidirectional)的联系信息的交换。


第二种支持文件传输功能的蓝牙规范就是“文件传输规范”(File Transfer Profile,FTP)了。与“对象推送规范”简单地交换模式相反,“文件传输规范”具有更多访问远端文件系统的功能,比如允许用户浏览、传送和修改远端文件系统上的文件。它还允许用户在远端文件系统上导航式浏览,以及创建新目录,尽管这些功能在“文件传输规范”中并没有明确地要求做到,但这些功能在实现蓝牙文件传输的时候通常都会实现。“文件传输规范”同样允许用户在远端蓝牙设备上创建一个新的空文件,或者将一个已经存在的文件由一个蓝牙系统传送到另一个系统上,删除任意的文件或者目录。同时,“文件传输规范”也实现了通过蓝牙网络实现“远程文件系统管理”(remote filesystem management)的功能,如果再与一个具有导航的用户界面(User Interface,UI)组合使用,那么用户就能够在远程蓝牙系统上(当然也包括在本地蓝牙系统上)识别已存在的文件和目录,快速地浏览和导航了。


可以通过“服务发现协议”中服务枚举的方式,确认在某个远端蓝牙设备上,“对象推送规范”或“文件传输规范”这两个服务是否存在,操作步骤和显示实例如下所示:

在这次输出结果中,有三个文件传输服务得到确认。第一个是“文件传输规范”的服务(即实例中的“FTP”),之后是两个“文件推送规范”服务。第一个“文件推送规范”(即实例中的“Phonebook Access PSE”)用于指定电话簿的访问权限,通过“文件推送规范”可以授权或拒绝用户访问目标设备上的电话簿记录。第二个“文件推送规范”服务(即实例中的“OBEX Object Push”)用来授权对远端目标蓝牙设备上文件系统的普通访问权限。


从安全角度来说,“文件推送规范”服务通常会由多个子服务组成,而每一个子服务又都有独立的安全等级。比如,在上面通过“服务发现协议”的服务枚举扫描结果中,这里的“文件推送规范”服务就是由“Phonebook Access PSE”和“OBEX Object Push”两个子服务组成,并且这两个服务具有不同的安全策略。第一个“Phonebook Access PSE”服务用来接收新的电话簿记录,或者允许远端设备下载现在已有记录,所以安全级别较高,而第二个“OBEX Object Push”服务的用途是实现标准的文件系统访问,所以安全级别相对较低。另外,蓝牙设备也会使用“文件推送规范”服务实现名片的传送,并且为了简化信息交换的过程,蓝牙系统会设定这个服务为不需要进行验证的权限。通常情况下,一旦这些协议可以在不需要进行认证的条件下使用的时候,这些存在规范或服务中因访问权限而出现的漏洞黑客所攻击的重要性和可能性也加强了。


无论是在“文件推送规范”中,还是在“文件传输规范”中,还有另一层安全措施可以用来限制远端设备能够访问的本地文件系统的位置。比如,对于“文件推送规范”,每个服务都在目标文件系统上配置了一个独立的目录,这个目录主要用于存储传入的文件,并在接到文件请求的时候,将这个文件输出。有时,我们会看到一个名为“蓝牙文件目录”(Bluetooth Files Folder),这个目录就是为了和其他文件系统目录区分开来,告诉用户这个目录中的文件都是服务所创建和自用的。对于“文件传输规范”,管理员会指定一份目录列表,列表之中的目录都可以被远程FTP客户端进行访问,但是不在列表中的目录则会拒绝FTP远程客户端的访问。


在过去的几年时间里,大量的漏洞黑客识别和使用,有很多都是“文件推送规范”和“文件传输规范”这两个服务在实现时,因为权限问题而导致的,这使得黑客从远端设备上访问要攻击的这个设备时,不需要访问权限,因而就可以无限制地访问本地文件系统。这些被黑客发现和执行的漏洞技术,对于理解现代蓝牙技术,实现现代蓝牙服务是很有价值的。


 文件传输目录的遍历漏洞 


迄今为止,多种蓝牙协议栈都被爆出会遭受“目录递归攻击”(directory recursion attack)。在“目录递归攻击”中,黑客会在目标设备系统的文件名前加上“目录递归字符”(“..\”)。如果目标蓝牙协议栈对传输的文件名中目录部分的权限不进行验证的话,那么通过“目录递归字符”的多重组合,攻击者就可以通过多级组合,在目标文件系统的任意目录中存储文件。举例来说,假设某蓝牙设备的存在目录是“C:\My Documents\Bluetooth Files”,在这个目录下,蓝牙设备可以将所有的文件合法地存储在这个目录,以及这个目录下的子目录中,而一旦攻击者指定要保存的文件名是“..\..\Windows\Startup\Pwned.exe”,那么存在漏洞的蓝牙协议栈就会不经路径审核地将Pwned.exe文件写入到“C:\Windows\Startup”目录下,后者目录很显然不在“C:\My Documents\Bluetooth Files”目录中,因而跳出了受限制的蓝牙文件目录,对于该用户来说,这很显然是非法操作。


“目录递归攻击”曾经出现在Widcomm、Toshiba、Bluesoleil、Affix和多种移动设备的蓝牙接口上。它们之间的漏洞细节都很类似,基本都出现在“文件推送规范”和“文件传输规范”中。


我们可以使用ussp-push工具,使用“目录递归漏洞”攻击“文件推送规范”。第一步,我们需要选择要上传到目标系统上的黑客工具。比如最常用的rootkit后门程序,或其他系统的后门程序,还可以是用来修改系统获取访问权限的shell执行脚本。下一步,我们指定要使用文件的名称,确定它的执行目录,将文件传输到目标系统上,这个文件必须是个可执行文件,并且是原有蓝牙系统中存在的可执行文件,这样做的原因是,上述操作会将我们自己的黑客工具以文件覆盖的方式取代该蓝牙原有的可执行文件,并且为了避免蓝牙系统瘫痪或崩溃,该文件应该是系统启动时,肯定会用到但不是蓝牙系统是最重要,最常用的文件。在下例中,文件名是acrd32up.exe。比较常见的攻击方法是将上述黑客工具上传到C:\Windows\Startup目录下,这样当系统启动时,我们的代码就会得到执行,如下所示:

尽管没有执行成功的回显,ussp-push程序已经成功地把pwned.exe文件传送到了目标系统上,将它写入“C:\windows\startup”目录中,新的文件名是acrd32up.exe(起这样一个中性无害的名字,很显然是伪装文件原来的企图)。需要额外说明的是,“反斜杠”(即字符“\”)在UNIX/Linux操作系统的shell中表示“转义字符”(meta-character),也就是说在一个命令串中遇到“反斜杠”时,并不将其作为一个单独的单符,而要与后面的字符一起当成一个特殊的字符,比如“\n”表示回车,但如果确实要表示“反斜杠”本身时,则要用两个“反斜杠”,也就是说字符串中每一个“\\”表示一个字符“\”,其中前一个“\”是转义字符,后一个是要转义的字符,所以在上面表示路径的地方,我们需要输入每连续的一组“\\”,表示一个“\”,以避免Linux操作系统shell误将“\”以其后面的字符相结合,产生不是我们想要的结果。


如果不知道当前目录所在层次,怎么办?其实,任何一个操作系统在目录切换的过程中都有“容错”机制,比如已经处于根目录下,再要“退出该目录,返回到上一级目录”的时候,系统仍然还是回到根目录。鉴于此,如果不知道当前需要从多少层的子目录中退到根目录,可以在上面“目录递归”攻击命令中,任意指定要返回的层数,这并不会产生什么负面结果。也就是说,如果不知道需要递归的路径的具体层数,可以指定一个大于或等于实际层数的适当数量值,就可以确保在构造文件目录时到达整个文件目录的根目录处。体现在shell的命令中,就是上面命令中“\\windows”之前,加足够多的“..\\”,总能找到根目录。


尽管在“文件推送规范”中,“目录递归”漏洞是一个巨大的威胁,然而在“文件传输规范”中,问题更严重,因为这里的“目录递归”漏洞会暴露目标文件系统的内容。在“文件推送规范”中,“目录递归”漏洞允许攻击者向目标系统的任意目录上传文件。而在“文件传输规范”中,攻击者可以利用这个漏洞列出目标文件系统上的所有目录和文件,上传任意文件并且能够获取任意的文件内容。总之,无论是“文件推送规范”服务,还是“文件传输规范”服务,二者中存在的“目录递归”漏洞最终都会被用来攻击蓝牙设备主机,只是对于攻击者来说,要想获取目标设备上敏感资源,“文件传输规范”中的漏洞更容易利用。


Linux操作系统上,我们可以使用obexftp工具攻击有漏洞的“文件传输规范”服务,其操作步骤及效果如下所示:

然后使用“-g”参数,我们可以通过指定文件名的方式获取到该文件。

最后,我们还可以使用“-p”参数将我们文件上传到目标设备上,以及通过“-c”参数指定将这个文件复制到的目标目录路径,如下所示:

 文件传输规范中目录递归攻击的缓解措施 


要想成功地运行文件传输“目录递归”攻击,攻击者首先要知道目标设备的“蓝牙设备地址”,并且,如果目标设备使用认证时,他必须对该蓝牙设备具有对应服务的访问权限。当然,最重要的是,目标设备上还必须存在“目录递归”漏洞。要对抗这种攻击,我们可以采取的最佳措施就是将设备配置在“非可发现的”模式,这可以作为初级防御的措施。如果设备要求所有的输入连接都需要进行认证的话,提醒您的用户拒绝接受不请自来的蓝牙连接,留心之前没有见到过的系统提示信息,这可以作为中级防御的措施。最后,如果可能的话,及时给蓝牙协议栈打上最新的补丁,通过开发商来积极修补漏洞


四、攻击Apple公司iBeacon通信模块


Apple公司的iBeacon技术使用“低功耗蓝牙”的“通告信道”(advertising channel)向外发送一个独一无二的ID值(identifier),其他设备也正是通过这个ID值唯一识别标识这个无线蓝牙设备。这个ID值就是“通用唯一标识符”(UUID),代表的是一个商业机构或特定公司的编号。iBeacon所发送的“通告信道”信息中,除了上面的“通用唯一标识符”之外,还包括两个额外的值,其中一个叫“主ID”(Major ID),主要用于识别一个个体商店,或者是一个相对较小的地理区域内的一个“iBeacon发送器”(iBeacon transmitter)的集合。另外一个叫“次ID”(Minor ID),主要是用于识别一个独立的“iBeacon发送器”。每一个“iBeacon发送器”均发送自己的“通告”信息到那些同在这个“iBeacon发送器”信号功率范围内的所有监听设备上,发送的频率为每秒多次,并且发送的“通告”中,都以明文的方式包含“通用唯一标识符”、“主ID”、“次ID”这3个值。一个机构或公司建立这样的一个iBeacon设备的目的是要在这个基础上开发一些应用程序。较以前的应用程序,这里的应用很特殊,那就是实现您在室内的定位,其原理是:当进入这个iBeacon的区域内,您的无线蓝牙设备必然会与该区域内的无线蓝牙数据进行通信,这里的通信不一定是数据交换的通信,大多数还是由iBeacon设备发出的“通告”信息,和自己的蓝牙设备对iBeacon设备的回复信息。借助于通信形成的“微微网”,iBeacon设备可以读取您和它之间的“信号强度”(signal strength),通过信号强调就可以估算出一个您的无线蓝牙设备和他之间的距离数据,而借助于这个距离数据,iBeacon设备就可以对您的蓝牙设备进行定位。有了定位,就可以与iBeacon设备达成互动,那就是iBeacon设备可以有针对地向您发送通告信息、“不同地方不同应用”(location-aware)类信息,以及其他“到特定位置才发”(location-specific)的信息。


1、iBeacon部署实例


首先我们从一个例子开始,有一个虚构的零售商店,我们称为Bourne。它是一家美国连锁百货店,销售各式各样的货品,从服装到易腐食品。作为一个营销计划的一部分,Bourne为用户开发了一个基于Apple产品的iOS应用,提供主要商店库存的查询服务、当地商店确切位置的方位指向服务和营业时间服务,并在自己的店内提供“不同地方不同应用”服务,比如交互式存储地图指导和电子优惠券打折物品推荐等功能。


为了允许iOS应用程序能够在该连锁商店的内部识别出顾客的位置,Bourne店内已经事先部署了大量的iBeacon传感器,遍布于整个商店各处,并且在特别促销物品的位置,部署了更大密度的传感器区域,所有Bourne店内的传感器都共用同一个“通用唯一标识符”,各蓝牙设备都可以通过这个标识,将iBeacon发射器识别为Bourne的商店设备。其中“通用唯一标识符”本身的查询,可以通过Mac的OS X操作系统中的uuidgen工具来完成,其命令如下:

通过对整个商店内“通用唯一标识符”的使用,Bourne移动应用程序的开发者将程序的逻辑设定为:任何时候,当有一个顾客进入Bourne商店范围之内的时候,由于该商店使用的是“Apple核心定位框架”(Apple Core Location Framework),所以这个顾客的手机就会注册一个iOS应用,通过该应用就会收到一个提醒消息(alert)。这个“Apple核心定位框架”是用Objective-C编程语言开发的,其部分核心代码如下:

在上面这段代码中,Bourne的“通用唯一标识符”被用来分配给一个NSUUID对象,这个对象然后被用于分配了一个属于beacon的区域。下一步,Apple的“定位管理器”(location manager)开始监测带有特定“通用唯一标识符”的iBeacon设备。当一个顾客的iOS设备进入到Bourne的商店,关联到Bourne“通用唯一标识符”的通告就会通过应用程序发出,这个应用程序在此之前通过注册获得了通告的控制权力,发出的通告信息会在进入顾客的移动iOS设备之后,向用户设备上发出一个锁屏式提醒信息(lock-screen alert),伴随着提醒信息的显示,还会有通告类事件的发生,比如会有一个提示音的提醒,或者是一个震动提醒。


每个Bourne商店都通过iBeacon的“主ID”,有一个唯一标识,这个“主ID”是由国家统一规定的。而“次ID”标识则只是在这个商店中的iBeacon发射器的唯一标识,通过“次ID”只能具体到一个店铺边墙、过道或其他特定的区域。对于一个特定iBeacon发射器的“通用唯一标识符”、“主ID”、“次ID”,三个值组合起来,就表示商店里某一个具体的位置,有了这个位置,就可以对症下药地向在这个位置的顾客发送他可能要用的位置通告、优惠券、其他店内营销内容。基于Bourne的动态营销和业务优先级,用户的无线手机终端上还可能会显示出一些各种销售或其他服务的信息,店家通过这些鼓励买家购买其特色商品。


Bourne的移动应用程序之所以可以获取顾客在店内的位置信息,主要是通过基于iOS操作系统中收到的通知获取的。当一个iBeacon发射器发出的“通用唯一标识符”被店内遍布于某位置的无线设备接收到的时候,这个无线设备的移动应用程序会收到一个背景状态的通知,该通知显示那个使用某“通用唯一标识符”的顾客正在距离自己在0.5~30米的位置。按照iOS的iBeacon公约,应用程序并不识别客户移动设备的准确距离,而只是粗略地将距离识别为“很远”(far)、“附近”(near)或“紧贴”(immediate),其判断标准就是距离发射器的大致距离,如图4所示。

图4  iBeacon通知中的距离分类

先考虑一种情况,Bourne最近已经采购一种新的男装运动外套系列。以前的产品系列在商店卖得很好,但需要清理库存以便让出空间给新的系列。这时如果一个用户的iOS设备运行的移动应用程序检测到自己在Bourne老产品系列的“附近”,那么它可以在设定了该客户的性别以后,查询该客户的偏好、过去的购买记录(该用户是否已经购买过这个系列款式),以及支出分析(是否该用户购买过这个物品,在历史购买记录上是否打折或折扣的级别),动态地生成一个优惠券,或向其iOS设备提供其他通知,优惠券如图5所示。随后,移动应用程序可以确定,如果用户决定使用优惠券,那么Bourne决定给这个顾客这件运动夹克较大的折扣价;如果用户不使用优惠券,那么会给这个顾客在下次进入本店消费时,提供一个更优惠的价格。

图5  Bourne移动应用程序动态生成的优惠券

iBeacon协议的简单性,使得通过零售商和其他商人很容易就能掌握。而将移动应用技术整合到手机中,可以检测到iBeacon发射器发出的与特定制造商ID相关的信息,从安全的角度来看,通过iBeacon发射器发出的“有限”的数据,对黑客来说,提供不了多少有兴趣的内容,上面“有限”的数据指的是“蓝牙接入地址”、通告地址、“通用唯一标识符”、“主ID”、“次ID”,如图6所示。然而,这个iBeacon的用例和操作移动设备应用程序的交互能力,对于黑客来说,是有兴趣的,因为这时可以使用iBeacon的通知功能开发在不同移动应用程序之间变化的移动应用程序。

图6  通过数据包嗅探捕获到的iBeacon通告内容

2、iBeacon的冒充


一个攻击者只要通过他的“低功耗蓝牙”无线接口配以合适的软件就可以冒充iBeacon发射器来操纵其他各蓝牙移动端站上的应用程序。


例如,考虑这样一种情况,通过逆向工程和网络通信数据包的捕获分析,攻击者识别到在Bourne商店的应用中,为到店顾客中逛到店内女性内衣摆放区的顾客提供一种优惠券。一旦有顾客满足这个条件,逛到了内衣区,那么她的行为就激发Bourne的应用程序,这时iBeacon发射器,就会发送“通用唯一标识符”为72C898A3-8F29-493B-8A34-41297FIB17B5,“次ID”为Ox4D49。那么攻击者就可以修改代码为如下代码段:

在这段节选的代码中,Bourne应用程序中注册了“通用唯一标识符”,之后监测iBeacon通告的程序也会使用这个“通用唯一标识符”。当一个iBeacon被邻近的Bourne应用程序识别出来时,Bourne应用程序会检查这个iBeacon设备的“次ID”。由于“主ID”用于表示该商店的标识,在这个店中,任何一个位置触发的事件,都会使用这个相同的“主ID”,所以在本例中,“主ID”并不具有区分的作用。如果这个iBeacon的“次ID”设置为BOURNE_BEACON_MIN_LINGERIE,那么在用户的移动终端上就会显示一个广告信息,该广告的内容是一个由应用程序指定的一张图片。


认识到这一行为,攻击者可以冒充这里的iBeacon发射器,触发应用程序中的这一事件,只要所用的“通用唯一标识符”是这个Bourne商店的,“次ID”是上面这个BOURNE_BEACON_MIN_LINGERIE值即可。

hciconfig工具主要用于禁用“通用查询”(traditional inquiry)和“页面扫描”(page scanning),以及打开“低功耗蓝牙4”的适配器的低功耗通告功能。通过hcitool工具集配置适配器,让适配器使用低功率通告功能,其命令中各个数字的意义如表2所示。

表2“低功耗蓝牙”通告数据的字段分解意义

即使不使用Linux操作系统的主机,攻击者可以在iOS操作系统内核上,使用具有低功耗iOS设备能够冒充任意的“通用唯一标识符”,“主ID”和“次ID”,将这三个值组合使用后,就可以冒充免费的xBeacon应用程序。xBeacon应用程序的一个应用实例如图7所示。需要说明的是,在图7中,xBeacon应用程序的“主ID”和“次ID”显示的是十进制的格式,而不是上面我们常用的十六进制格式。

图7  通过xBeacon冒充iBeacon发送器

当攻击者将自己的系统伪装成一个“iBeacon发射器”后,任何在距离上邻近的被攻击系统中,只要已经安装了iBeacon应用程序的,都将收到一个iBeacon的通告信息,这个时候,由于这里的“iBeacon发射器”是冒充的,不再考虑原来“店内的位置”因素,所以无论被攻击者实际的位置在哪,也无论被攻击的移动设备是否在Bourne的商店里,他们都将收到一个iBeacon的通告信息。一个通告的实例发送事件,显示如图8所示。

图8  Bourne移动应用程序上的iBeacon冒充实例截图

从安全的角度来看,攻击者通过愚弄的手段欺骗一个移动设备,使其相信自己就在一个合法的iBeacon发射器的附近,更确切地说是在某个商店的附近。虽然这肯定属于是一种潜在危险,但确实还算不上是一个重大的威胁,但我们还不能这么简单地看待这一问题。


一个攻击者通过冒充iBeacon设备触发对被攻击移动设备上的应用程序的行为,的确算不得什么。但是如果在被攻击的移动设备的应用程序上,存在可以识别的漏洞,那么冒充iBeacon设备,发布内衣广告就算不得什么事,相反,这个带有漏洞的应用程序就会完全成为攻击的主角,攻击者后面要攻击的就是这个应用程序上的漏洞了。


那些部署了iBeacon设备的机构,可能更关注的是发生攻击以后,自己的商店品牌被败坏了,因为这些都是攻击者以自己名义向购物者发送的消费让利信息,而对于店方,他们是无法兑现的。例如,在一个市场营销计划中,店方提供的商品折扣信息是让消耗者在店内消费的,攻击者偏要在飞机上或其他消费者不能使用的场所发了这样的商品打折信息,最终也只能石沉大海。


在iBeacon冒充攻击方式中,也会有一些变种。比如,Bourne商店的竞争对手也可以注册一个应用程序,然后当安装有Bourne商店中iBeacon应用程序的消费者来到这个竞争对手应用程序的功率覆盖范围内的时候,这个应用程序就会采取一定的行动。下面用例子来说明,同样还以运动外套为例,当Bourne商店的竞争对手检测到Bourne商店的购物者距离这个冒充的iBeacon发射器非常接近的时候,Bourne商店的竞争对手会向Bourne商店的客户提供比Bourne商店更大的折扣比例或价格,但这时所指的商店却不再是Bourne商店,而是Bourne商店的竞争者所在的商店,其目的就是借这样的手段,努力地说服购物者改换门庭,不再去Bourne商店购买这件运动外套,而到Bourne商店的竞争对手所在的商店购买。这就成了另一种意义上的威胁。


iBeacon设备未来的部署也还是会受到侦听攻击的。在这种攻击中,通告信标的数据包中,侦听者所关注的有效载荷的内容包含的不仅仅是“通用唯一标识符”、“主ID”和“次ID”,还会包含其他的一些值。例如,使用Linux操作系统中的hcicool命令,我们可以频繁地检查一个Linux主机的CPU的状态,从中可以看到“低功耗蓝牙”通告数据包中通告数据包的总CPU使用率,该操作很简单,也很直观。另外,Apple公司的iOS设备可以获取到通告数据包的总CPU使用率这个值,但所用的却是另一个方法,如图7中可以获得解码后的“主ID”和“次ID”两个十进制值,将这两个值出现的次数,分别作为一个除法公式的左右两边,这时分子是“次ID”为通告数据包出现的总次数,分母为“主ID”为Bourne商店的“主ID”出现的次数,因为Bourne商店内所有的通信数据都使用这一个“主ID”,所以该总数即意味着所有的蓝牙通信数据包。相除以后,必然能生成一个浮点数,而这个商,也是通告数据包占所有数据包的比例,代表着CPU的使用率。

还可以从“低功耗蓝牙”通告数据包中看到改变CPU级别数字的改变,不过,这需要在相同的系统上,通过在一个新的终端窗口中运行“hcidump-X”命令实现的。


另外,在“低功耗蓝牙”信标数据包的有效载荷中,还有一些与制造商有关的数据会被同时传送,这些数据最多可以达到31个字节,具体取决于不同制造商的ID。

在这个例子中,从有线网络接口eth0上发送和接收的字节数,其实表示的是“低功耗蓝牙”信标数据包进行编码和发送的内容。样例中的这个数据包与iBeacon系统中的数据包是不兼容的,因为其中代表“制造商的ID”(详见“表2”)中,对于Apple电脑,该值为“004C”,但这里却随便写了一个任意值“4A 57”。但相比于两次单独使用“主ID”字段和“次ID”字段,这个数据包却可以发送更多的数据。


在这些例子中,我们都是用来传送一些基本系统的使用信息,但是我们更希望更多的厂商在自己的产品中利用“低功耗蓝牙”的信标数据包传送一些敏感数据,那才是更合理的做法。在“低功耗蓝牙”中,潜在可以使用的敏感数据用途包括患者医疗遥测信息,如“血压”(blood pressure)、“脉搏血氧饱和度”(pulse oximetry)、“心率”(heart rate)、“血糖水平”(glucose level)等;还可以包括一些环境数据,如“温度”(temperature)、“湿度”(humidity)、“空气颗粒计数”(air particulate count);一些安全系统,如“振动传感”(vibration sensing)、“自动打开控制门”(door open event)、“玻璃破碎探测器”(glass break detection)、“邻近报警”(proximity alerting);以及自动化控制系统,如“温度报告”(temperature reporting)、“每千瓦时的成本”(cost per kilowatt hour)、“电能使用监测”(power utilization monitoring)等信息。


在这种情况下,从被动式侦听的角度来看,捕获到传输的明文数据是没有价值的。即使捕获到了“心脏率报告系统”,但这个病人的“通用唯一标识符”对于攻击者来说,是不知道所代表的意义的,所以不会为侦听者带来很大利益。然而,任何的动作都有两面性,侦听就意味着可以获得一些信息,而借助于获得的这些信息,又意味着我们可以对其进行修改,进而意味着我们可以操纵对方的系统。


使用iBeacon和“低功耗蓝牙”信标数据包的产品在不断地涌入市场,有很多技术成员会议对“低功耗蓝牙”提出了新的要求,那就是电池寿命长、成本低,可以简单地集成到其他的系统中。可是,在黑客眼里,无论怎么变,只要仍然一如既往地不注意基本的安全问题,那么将来攻击者还会“我行我素”地攻击这些无线蓝牙目标系统。


五、结语


我们集中地分析了攻击和使用蓝牙的各项技术,蓝牙“个人身份码”攻击是通过在“配对”过程中,侦听无线蓝牙设备之间的数据通信数据包实现的。一旦侦听到了“配对交换”,攻击者就能够还原出“个人身份码”或者“长期密钥”的值,进而从捕获的蓝牙网络数据包中解密数据。


我们还介绍和验证了多种识别蓝牙设备信息的方法,这些信息包括“蓝牙设备地址”、“服务类型”和“设备类型”,以及“友好名称”。通过修改这些字段,我们能够改变远端蓝牙设备对我们自己蓝牙系统的认知,使其对系统本质产生出我们想要的“误导”效果。在某些时候,这样做是有必要的,比如在iPhone蓝牙浏览器接口的那个示例中,iPhone只接受耳机和音频类设备,于是我们就修改自己的“设备类型”,最终为它所接受,为下一步的攻击清除了障碍。其他情况下,类似的例子也有很多,例如我们就曾经根据识别到的“友好名称”得知对方蓝牙设备的型号和版本,并根据这些信息查询到这个版本的蓝牙设备上有哪些可以为我们所用的漏洞


我们还介绍了多种攻击蓝牙规范的方法,各种蓝牙设备在按照蓝牙规范实现其蓝牙设备的软硬件协议栈的时候,常常会因为实现方式的误区或滥用,最终导致在某型号蓝牙设备或某个版本蓝牙设备中,存在某种弱点和漏洞。相比于其他针对蓝牙设备的攻击技术,尽管基于蓝牙规范的攻击方式目前仍是攻击者所采用的最广泛的攻击手段,但这些攻击技术通常并不适用于所有的蓝牙设备。


有关“低功耗蓝牙”的介绍,主要集中于一些新兴技术中,比如Apple公司的iBeacon设备就在不断地将“低功耗蓝牙”引入到很多新的市场中,并不断寻找自己更合适的接受方式。尽管iBeacon设备本身的使用并不一定会威胁到蓝牙设备的安全性,但是iBeacon设备上存在的漏洞本身就代表了一种针对最终用户的潜在威胁。这种漏洞对于攻击者来说,是一个在被攻击移动设备上操纵应用程序行为的绝对机会。


对于攻击者来说,蓝牙技术保留了很多不可抗拒的攻击诱惑,使黑客们愿意投入精力不停地开发新的攻击工具,这些攻击工具包括使用超牙进行数据包的嗅探。其实,只要使用蓝牙通信的机构不改进和完善现有的蓝牙技术,那么攻击者就会百尺竿头,更进一步,不断地寻找新的方法,利用其弱点和漏洞攻击这些流行的无线传输机制。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】
登录查看更多
17

相关内容

[ICML-Google]先宽后窄:对深度薄网络的有效训练
专知会员服务
34+阅读 · 2020年7月5日
华为发布《自动驾驶网络解决方案白皮书》
专知会员服务
125+阅读 · 2020年5月22日
【ICLR-2020】网络反卷积,NETWORK DECONVOLUTION
专知会员服务
38+阅读 · 2020年2月21日
【NeurIPS2019】图变换网络:Graph Transformer Network
专知会员服务
110+阅读 · 2019年11月25日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
ZigBee 网络安全攻防
计算机与网络安全
14+阅读 · 2019年4月15日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
被动DNS,一个被忽视的安全利器
运维帮
11+阅读 · 2019年3月8日
威胁情报驱动:F3EAD 之利用
计算机与网络安全
4+阅读 · 2018年12月28日
IPSec | IKE密钥交换原理
计算机与网络安全
18+阅读 · 2018年12月23日
网络舆情分析
计算机与网络安全
20+阅读 · 2018年10月18日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
Deflecting Adversarial Attacks
Arxiv
8+阅读 · 2020年2月18日
Geometric Graph Convolutional Neural Networks
Arxiv
10+阅读 · 2019年9月11日
Arxiv
24+阅读 · 2018年10月24日
Arxiv
6+阅读 · 2018年10月3日
Arxiv
6+阅读 · 2018年1月14日
VIP会员
相关资讯
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
ZigBee 网络安全攻防
计算机与网络安全
14+阅读 · 2019年4月15日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
被动DNS,一个被忽视的安全利器
运维帮
11+阅读 · 2019年3月8日
威胁情报驱动:F3EAD 之利用
计算机与网络安全
4+阅读 · 2018年12月28日
IPSec | IKE密钥交换原理
计算机与网络安全
18+阅读 · 2018年12月23日
网络舆情分析
计算机与网络安全
20+阅读 · 2018年10月18日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
相关论文
Deflecting Adversarial Attacks
Arxiv
8+阅读 · 2020年2月18日
Geometric Graph Convolutional Neural Networks
Arxiv
10+阅读 · 2019年9月11日
Arxiv
24+阅读 · 2018年10月24日
Arxiv
6+阅读 · 2018年10月3日
Arxiv
6+阅读 · 2018年1月14日
Top
微信扫码咨询专知VIP会员