正如你在第8章中所看到的,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)的信息。
注意
在这一节中,我们研究一个常见的部署场景,虽然这些场景中的攻击方式也可以适用于Android 4.3及以后版本的设备上,但至少在这里,我们是专为Apple公司的iBeacon技术而设计的。因为iBeacon是Apple公司的注册商标,所以看上去,这似乎只是Apple公司的产品上存在,但在Android设备上,如果这些技术是由Radius网络提供第三方Beacon开发库开发,那么这些技术同样会被支持。有关Radius网络提供第三方Beacon开发库方面的资料,可在http://developer.radiusnetwordks.com/ibeancom/android 网上查找。
首先我们从一个例子开始,有一个虚构的零售商店,我们称为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),其判断标准就是距离发射器的大致距离,如图10-4所示。
图10-4 iBeacon通知中的距离分类
先考虑一种情况,Bourne最近已经采购一种新的男装运动外套系列。以前的产品系列在商店卖得很好,但需要清理库存以便让出空间给新的系列。这时如果一个用户的iOS设备运行的移动应用程序检测到自己在Bourne老产品系列的“附近”,那么它可以在设定了该客户的性别以后,查询该客户的偏好、过去的购买记录(该用户是否已经购买过这个系列款式),以及支出分析(是否该用户购买过这个物品,在历史购买记录上是否打折或折扣的级别),动态地生成一个优惠券,或向其iOS设备提供其他通知,优惠券如图10-5所示。随后,移动应用程序可以确定,如果用户决定使用优惠券,那么Bourne决定给这个顾客这件运动夹克较大的折扣价;如果用户不使用优惠券,那么会给这个顾客在下次进入本店消费时,提供一个更优惠的价格。
图10-5 Bourne移动应用程序动态生成的优惠券
iBeacon协议的简单性,使得通过零售商和其他商人很容易就能掌握。而将移动应用技术整合到手机中,可以检测到iBeacon发射器发出的与特定制造商ID相关的信息,从安全的角度来看,通过iBeacon发射器发出的“有限”的数据,对黑客来说,提供不了多少有兴趣的内容,上面“有限”的数据指的是“蓝牙接入地址”、通告地址、“通用唯一标识符”、“主ID”、“次ID”,如图10-6所示。然而,这个iBeacon的用例和操作移动设备应用程序的交互能力,对于黑客来说,是有兴趣的,因为这时可以使用iBeacon的通知功能开发在不同移动应用程序之间变化的移动应用程序。
图10-6 通过数据包嗅探捕获到的iBeacon通告内容
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工具集配置适配器,让适配器使用低功率通告功能,其命令中各个数字的意义如表10-2所示。
表10-2 “低功耗蓝牙”通告数据的字段分解意义
即使不使用Linux操作系统的主机,攻击者可以在iOS操作系统内核上,使用具有低功耗iOS设备能够冒充任意的“通用唯一标识符”,“主ID”和“次ID”,将这三个值组合使用后,就可以冒充免费的xBeacon应用程序。xBeacon应用程序的一个应用实例如图10-7所示。需要说明的是,在图10-7中,xBeacon应用程序的“主ID”和“次ID”显示的是十进制的格式,而不是上面我们常用的十六进制格式。
当攻击者将自己的系统伪装成一个“iBeacon发射器”后,任何在距离上邻近的被攻击系统中,只要已经安装了iBeacon应用程序的,都将收到一个iBeacon的通告信息,这个时候,由于这里的“iBeacon发射器”是冒充的,不再考虑原来“店内的位置”因素,所以无论被攻击者实际的位置在哪,也无论被攻击的移动设备是否在Bourne的商店里,他们都将收到一个iBeacon的通告信息。一个通告的实例发送事件,显示如图10-8所示。
从安全的角度来看,攻击者通过愚弄的手段欺骗一个移动设备,使其相信自己就在一个合法的iBeacon发射器的附近,更确切地说是在某个商店的附近。虽然这肯定属于是一种潜在危险,但确实还算不上是一个重大的威胁,但我们还不能这么简单地看待这一问题。
·一个攻击者通过冒充iBeacon设备触发对被攻击移动设备上的应用程序的行为,的确算不得什么。但是如果在被攻击的移动设备的应用程序上,存在可以识别的漏洞,那么冒充iBeacon设备,发布内衣广告就算不得什么事,相反,这个带有漏洞的应用程序就会完全成为攻击的主角,攻击者后面要攻击的就是这个应用程序上的漏洞了。
·那些部署了iBeacon设备的机构,可能更关注的是发生攻击以后,自己的商店品牌被败坏了,因为这些都是攻击者以自己名义向购物者发送的消费让利信息,而对于店方,他们是无法兑现的。例如,在一个市场营销计划中,店方提供的商品折扣信息是让消耗者在店内消费的,攻击者偏要在飞机上或其他消费者不能使用的场所发了这样的商品打折信息,最终也只能石沉大海。
图10-7 通过xBeacon冒充iBeacon发送器
图10-8 Bourne移动应用程序上的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使用率这个值,但所用的却是另一个方法,如图10-7中可以获得解码后的“主ID”和“次ID”两个十进制值,将这两个值出现的次数,分别作为一个除法公式的左右两边,这时分子是“次ID”为通告数据包出现的总次数,分母为“主ID”为Bourne商店的“主ID”出现的次数,因为Bourne商店内所有的通信数据都使用这一个“主ID”,所以该总数即意味着所有的蓝牙通信数据包。相除以后,必然能生成一个浮点数,而这个商,也是通告数据包占所有数据包的比例,代表着CPU的使用率。
提示
还可以从“低功耗蓝牙”通告数据包中看到改变CPU级别数字的改变,不过,这需要在相同的系统上,通过在一个新的终端窗口中运行“hcidump-X”命令实现的。
另外,在“低功耗蓝牙”信标数据包的有效载荷中,还有一些与制造商有关的数据会被同时传送,这些数据最多可以达到31个字节,具体取决于不同制造商的ID。
在这个例子中,从有线网络接口eth0上发送和接收的字节数,其实表示的是“低功耗蓝牙”信标数据包进行编码和发送的内容。样例中的这个数据包与iBeacon系统中的数据包是不兼容的,因为其中代表“制造商的ID”(详见“表10-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和“低功耗蓝牙”信标数据包的产品在不断地涌入市场,有很多技术成员会议对“低功耗蓝牙”提出了新的要求,那就是电池寿命长、成本低,可以简单地集成到其他的系统中。可是,在黑客眼里,无论怎么变,只要你们仍然一如既往地不注意基本的安全问题,那么将来攻击者还会“我行我素”地攻击这些无线蓝牙目标系统。