一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:460500587
微信公众号:计算机与网络安全
ID:Computer-network
尽管在商业环境中,Z-Wave协议在提供无线连接的方面取得了很大的进步,但Z-Wave协议的目标也还仅限于智能家居市场。通过使用Z-Wave设备,消费者可以将传统的设备与Z-Wave设备进行互连,这些传统的设备如灯光、电器、门锁、运动传感器等。随着一些智能设备,如智能灯泡、智能门锁、智能运动传感器等的出现,人们设想,这些智能设备最终会连接到一个“中央控制设备”(central control device),而这个“中央控制设备”也会最终连接到互联网上。这样一来,这些智能设备就与互联网处于互联互通的状态,就可以从网络另一端的移动设备和传统计算设备控制和监测这些智能设备。
“Z-Wave联盟”(Z-Wave Alliance)是一个由数百个独立的设备制造商组成的团体,该团体同时参与设计和销售使用Z-Wave技术的设备。也就是说,“Z-Wave联盟”负责Z-Wave产品的设计、测试,以及Z-Wave技术的市场营销。“Z-Wave联盟”承诺消费者:Z-Wave会为智能家居提供生活便利、能源管理、远程设备监测与控制,为消费者节省能源,且Z-Wave设备易于安装,像网上银行一样安全。全世界有超过2千万的Z-Wave产品应用于家居领域。在“智能家居设备”(smart-home-device)的互联互通领域(interconnectivity),Z-Wave技术有机会成为“事实上”的选择。
一、Z-Wave技术简介
Z-Wave是“西格玛设计”(Sigma Designs)公司的专有协议,并且除非其他的设备制造商与“西格玛设计”公司签署了“保密协议”(Nondisclosure Agreement,NDA),否则“西格玛设计”公司不会公开Z-Wave协议的细节,与此同时,“西格玛设计”公司控制所有Z-Wave芯片的制造和交付,全球除了“西格玛设计”以及其授权的日本三美(Mitsumi)公司之外,其他公司都无权向产品制造商提供Z-Wave芯片。由于这些原因,现在许多Z-Wave的细节未被公开,这也导致针对Z-Wave安全的分析工具相对不是很成熟。
1、Z-Wave协议的层次
与ZigBee协议类似,Z-Wave芯片使用电源保护技术以延长电池的待机时间,使用mesh网络模型以适应更大的设备通信的范围。但总的来说,Z-Wave也是一个相对简单的协议,在基本框架的基础上支持主动的“确认”(acknowledgement)和“数据帧重传”(frame retransmission),提供“自形成”(self-forming)和“动态路由拓扑更新”(dynamic routing topology updates),以及“应用程序特定的配置文件”(application-specific profile)等技术。Z-Wave采用结构化的协议栈,其堆栈结构如图1所示。我们将逐个检查这些组件,以便在我们通过技术攻击Z-Wave部署的时候,能更好地了解协议的每一个功能。
图1 Z-Wave协议栈结构
(1)Z-Wave的物理层
Z-Wave协议是在使用“低于1GHz频率”(sub-1-GHz)频段作为无线连接频率的协议之一。这个频段曾经一度受很多流行的无线应用所钟爱,包括用作Wi-Fi网络三个介质使用频段中的一个,最初就想选该频段作为其使用频段,不过随后,该波段改用2.4GHz频段,以便与全球共用的频段相兼容。近年来,许多标准实体已经回归到使用“低于1GHz频率”作为其通信频段,以避免在2.4GHz上跟其他无线网络冲突。同时,这样做的好处也很明显,那就是由于使用了较低的频率发射功率电平,所以在相同功率下可以发射更远的距离。不过,目前来说,使用“低于1GHz频率”频段通信的网络协议还多是一些专有协议供应商的协议,比如“西格玛设计”公司的Z-Wave协议。
“低于1GHz频率”主要是用来指由政府相关实体分配的,低于1GHz且位于1GHz附近的850~950MHz频段的频率分配。由于是政府分配,所以这个频段就与2.4GHz频段的使用存在差异,那就是2.4GHz频段的使用全球统一,而“低于1GHz频率”的频段的使用情况会因全球国家和地区的不同而有所不同。例如,在美国,“美国联邦通讯委员会”(FCC)将902~928MHz的频段设置为“不需授权的使用”(unlicensed use),但这种分配存在很大的问题,因为除美国以外的“全球移动通信”(GSM)使用的是900MHz的频率(确切地说,是890~960MHz的频段),并且这个频率在全世界很多地方都在使用,包括欧洲、中东、非洲、澳大利亚、亚洲等地。另外,在欧洲,“低于1GHz频率”指的是可以在850MHz附近提供的“不需授权的使用”的频段,而这个频段又与美国以及其他使用824MHz和894MHz地区中,使用850MHz频段的“全球移动通信”相重叠。
对于制造商来说,面临的挑战是:在世界不同国家中允许使用的频率不一样,要想使用“低于1GHz频率”这个频段,自己的产品就必须能适应所有这些不同的频率。“西格玛设计”公司的处理办法是:为了应对频率不同这一挑战,根据国家和地区设计和生产相应的芯片,所以对于某一个指定的地区,该区域内的Z-Wave和其他单一频段源制造商在选择芯片的时候,只要选择支持该区域芯片的优质加工商即可。相应地,Z-Wave产品内部也能够使用多种频率,只是在出厂前,根据当地所在区域设置使用的频率即可。具体可用的频率如表1所示。
表1 不同国家和地区的Z-Wave使用频率表
Z-Wave协议还可以根据物理层的解调和使用率的方案,允许操作人员对所用的频率进行微调。比如,据报道,欧洲的Z-Wave设备的实际使用频率是868.42和868.4MHz,美国的Z-Wave设备实际的工具频率是908.42和908.4MHz。
2012年,“国际电信联盟”(International Telecommunication Union,ITU)发布了ITU-T G.9959推荐规范《短距离窄带数字无线通信物理层收发器和介质访问控制层规范》(Short range narrow-band digital radiocommunication transceivers——PHY and MAC layer specifications)。这个文档描述了Z-Wave协议的低层功能,重点对“物理层”(physical layer)组件、“介质访问控制层”(Media Access Control,MAC)的数据帧结构,以及数据包的发送和接收的操作要求进行了详细的介绍。
从“国际电信联盟”的这个规范中,我们得知Z-Wave的规范共分为3个参数配置方案,分别称为R1配置、R2配置和R3配置,每一个Z-Wave设备都是根据自己的需要,按照三个无线射频规范中的一个进行操作。这些射频规范定义了物理层无线调制方式、编码机制,以及数据的速率,如表2所示。有消息称,最慢的Z-Wave“R1配置”,正在或已经被“Z-Wave联盟”拒绝通过,虽然遵从该协议的新设备仍在销售的过程中使用此版本的配置。
表2 Z-Wave射频规范参数表
Z-Wave设备在发送无线射频信号的时候,采用发射功率的组合方式,所以其无线信号的功率覆盖范围是3英尺~75英尺,具体取决于被发送的信息量和发送器的发射功率。在一个mesh网络配置的操作中,Z-Wave能够在大多数家庭实现合理的区域覆盖,加上一个持续供电的“中继器”(repeater)设备,还可以将发送到“非本网络节点”的数据包转发到其他网络上。之所以要使用“中继器”是因为出于电池保护策略的一部分,由电池供电的Z-Wave设备只负责数据的收发操作,而不会参与网络数据包的转发操作。
(2)Z-Wave的介质访问控制层
Z-Wave的“介质访问控制层”负责Z-Wave协议中的几个属性,具体如下:
数据包的帧结构和格式
对请求的主动确认
错误检测
重传数据包
单播、广播,以及组播的处理
地址的选择和分配功能
Z-Wave网络的基本架构由“控制设备”(controller device)和“从设备”(slave device)组成。一个单一的“主控制设备”(primary controller device)负责建立网络,并选择一个独一无二的“网络标识符”(network identifier),或者说一个HomeID。“控制设备”能够在网络上初始发起一个传输操作,以“推送”(polling)或“要求对方更新”(updating)的方式向目标设备发送数据包;“控制设备”还负责维护网络的路由信息。相比之下,“从设备”则被动得多,它只需要按照“控制设备”的指令执行即可,既不需要担心网络上的路由,也不需要针对其他的Z-Wave设备主动初始发起一次连接或传送的操作,但“从设备”可以对途经的数据包进行中转。
Z-Wave规范中的“控制设备”根据定义可以进一步分为“便携式控制设备”(portable controller device)和“静态控制设备”(static controller device)两种:
“便携式控制设备”通常由电池供电,当该设备在家中移动的时候,设备能够自动重新测算网络的拓扑结构。“便携式控制设备”是Z-Wave网络所包含设备中的一个重要组成部分。
“静态控制设备”由于不需要移动,所以该设备的供电是直接通过电源统一供电,比如通过一个交流电的适配器供电。该设备除了连接本网设备之外,也可以连接到其他的网络上,比如,该设备可以同时连到Z-Wave网络和IP网络上,在这两个网络之间提供网关服务。
无论是“静态控制设备”,还是“从设备”,都使用统一的电源设备,并且都可以参与网络上数据包的转发。这些设备都会侦听网络上的通信数据包,一旦侦听到一个数据包,并且发现该数据包不是给自己的,该设备就会形成一个“mesh网格化”(meshed)的“桥接基础设施”(bridging infrastructure),然后对该数据包进行转发,这种转发无疑扩大了网络的范围。不过,为了避免路由表过于复杂,所以Z-Wave限定这种转发的次数是有上限的,最多只能使用4跳。
根据Z-Wave设备所用的射频规范不同,Z-Wave数据帧的格式也会有所变化。基本的单播数据帧格式适用于R1配置和R2配置的Z-Wave网络,如图2所示。使用R3配置的R1配置和R2配置单播数据帧,其格式如图3所示。
图2 Z-Wave规范R1配置和R2配置中,“介质访问控制层”单播数据帧格式
图3 Z-Wave规范R3配置中,“介质访问控制层”MAC单播数据帧格式
每个Z-Wave网络都有一个随机选择的值作为网络的唯一标识符,称为HomeID。该值出现在Z-Wave网络通信的所有发送数据包中,并且位于数据包的前4个字节中。从功能上来看,HomeID很像是IEEE 802.11网络中的“基本服务集标识”和ZigBee网络中的“个人局域网”的ID值。其主要作用是当有多个不同的Z-Wave网络在物理位置上交织在一起时,所有的Z-Wave节点可以区分出哪个网络是自己所处的网络,哪个网络不是,以及哪个数据包属于是自己网络的,哪个数据包不是给自己网络的,还可以协助某些节点加入到一个相同的网络中。HomeID的值是在网络建立伊始,由“主控制设备”随机选择的。
跟在“HomeID”字段后面的是1个字节长度的“源节点ID”(Source NodeID)字段,该字段表示的是Z-Wave节点在本地独有的源地址,Z-Wave节点的分配策略详见表3。当一个Z-Wave节点添加到某个Z-Wave网络时,该设备的“节点ID”应该设置为0,“主控制设备”会在范围1~232中找一个未使用的值分配给该新加入节点,供其作为“节点ID”使用。而该设备也会在随后的通信中,自始至终地使用这个值作为其“节点ID”,直到网络关闭或退出网络。因此,一个Z-Wave网络中,节点的最大数目是232个,如表3所示。
表3 NodeID的分配策略
Z-Wave设备在进行地址分配的时候并没有完全遵守上述“介质访问控制层规范”中的地址分配规则,最常见的现象是有些“控制设备”的“节点ID”使用了“保留”字段区间中的保留值。
16位的“帧控制”(Frame Control)字段还可以再分成几个以“位”为单位的子字段,其中包含两个保留位,如图4和图5所示代表几个子字段。
图4 Z-Wave规范R1/R2配置中,“帧控制”字段的格式解释
图5 Z-Wave规范R3配置中,“帧控制”字段的格式解释
“路由”(Routed)子字段:用来表示该数据包是从上一个节点处通过路由转发而来,而不是由上一个节点主动发起连接后发送来的。同样由于自己也不是连接发起方,所以在向下一个节点发送的时候,应该也设置这个字段。
“确认请求”(AckReq)子字段:用来表示这是一个接收节点,对发送节点所发“请求”数据包的一个确认数据包。
“低功耗”(Low Power)子字段:用来表明该数据包以低功率的方式发送,以便减小发送范围。
“速度调整”(Speed Modified)子字段:该字段仅用于“R1配置和R2配置”,表示的意思是如果源节点和目的节点都支持速率调整的话,那么二者之间采用较低的数据发送速率进行传输。
“头类型”(Header type)子字段:该字段用来表示一个数据包的类型,有效的类型有:单播(unicast或singlecast)、组播(multicast)、确认(acknowledgement)三种。值得一提的是,如果想使用广播(broadcast)方式,那么在这里要选择“单播”,然后在“介质访问控制层”单播数据帧格式(图2或图3)的“目的节点ID”中输入0xFF即可。
“电子束控制”(Beam Control)子字段:表示该节点应该在一连串连续的“电子束”提醒下,从省电的“节能”(power-conservation)状态下苏醒过来,进入正常的工作流程。
“顺序号”(Sequence number)子字段:该字段仅用于“R1配置和R2配置”,用于识别某一个数据包发送后,对方对该数据包的确认数据包,只有响应数据包中该字段与发送数据包中该字段的值相等的两个数据包,才会将前者识别为后者的确认数据包。需要说明的是,一些老的Z-Wave设备中并没有使用此字段,在这些老版本的实现方式中,所有数据包的该字段都为零。
“帧控制”字段后面的“长度”(Length)字段表示整个数据包的长度,包括数据包的头部(“HomeID”字段到“目的节点ID”字段)、有效载荷、“帧校验序列”等信息。整个内容,有时也称为“介质访问控制层协议数据单元”(MAC Protocol Data Unit,MPDU)。
“目的节点ID”(Destination NodeID)表示的是当前的发送方式使用的是“单播”还是“组播”。注意,跟“帧控制”字段中的“头类型”子字段不同的地方是,这里没有“确认帧”一说,“目的节点ID”所表示的只是接收方的地址。再下一个字段就是“数据负载”(Data payload)字段,即本数据包所传的具体内容。如果是“Z-Wave规范”中的R1配置和R2配置版本,如果数据为“非多播数据包”(nonmulticast packet),那么其“有效载荷”的长度为0~54个字节,如果数据为“多播数据包”(multicast packet),那么其“有效载荷”的长度为0~25个字节。如果是“Z-Wave规范”中的R3配置版本,那么其“有效载荷”的长度为0~158个字节,同时,除非该数据包为“多播数据包”,否则其“有效载荷”的长度不能超过129个字节。
最后,“帧校验序列”的作用是对数据包内容的完整性进行检查。如果是“Z-Wave规范”中的R1配置和R2配置版本,那么该校验算法使用“异或”(XOR)算法;如果是“Z-Wave规范”中的R3配置版本,则使用16位的“循环冗余校验校验”(CRC)校验算法,简称为CRC-16算法。
现在,我们已经从内容上涵盖了“介质访问控制”层,所提供的内容细节已足够解释针对Z-Wave网络的攻击了。
(3)Z-Wave的网络层
Z-Wave协议的“网络层”定义了三大功能。其一,定义了网络中各种设备类型的职责,例如“控制设备”和“从设备”的作用;其二,定义了网络中各设备对于其他网络组件所应做出的责任,如选择“HomeID”的值以便将本网络与其他网络区分开,分配“节点ID”以便网络中应对网络路由建立时的处理;还有一个区域,那就是从安全的角度来看,攻击者特别有兴趣的,对于网络上Z-Wave节点“纳入”(inclusion)和“排除”(exclusion)的概念。
当用户想要添加一个Z-Wave设备到某个Z-Wave网络中,那么这个用户就必须完成Z-Wave节点的“纳入”处理。通常情况下,这涉及将“控制设备”设置到“纳入”模式,在这一模式下,允许其他新的节点加入到本网络中。按一下设备面板上的按钮,或者选择一个菜单项,在新设备节点上按下按钮,就可以将该“控制设备”设置为“纳入交换”(inclusion exchange)状态。当一个新的节点初始化“纳入”处理时,该设备会发送一个Z-Wave“节点信息数据包”(node information frame),在该数据包中,“HomeID”字段是0x00000000,目的设备“节点ID”是0x00,这意味着这是一个“广播”方式下的“节点ID”。“节点信息数据包”最终到达“控制设备”以后,“控制设备”根据以前给新设备分配过的“节点ID”数字,按“先来后到”的顺序,将“节点ID”数字递增,也给这个新设备分配一个“节点ID”,使其可以在随后的网络中使用。然后更新路由表,以便以后发送给这个设备的数据包也能传送到这个新节点上。
和“纳入”处理类似但功能相反的过程就是Z-Wave节点的“排除”处理。一个已经通过“纳入”处理加入到某个Z-Wave网络的节点,在没有经过允许加入到网络的节点的“排除”操作之前,是不能退出该网络而加入到另一个Z-Wave网络的。就像进入“纳入”状态一样,要进入“排除”状态通常也是在“控制设备”上按一下设备面板上的按钮,这时,这个设备节点切换到“排除”状态,然后在之前加入网络的节点上也按一下面板上的按钮,那么这个设备就会返回到“未分配节点ID”的状态,也就是说这时该设备的“HomeID”会变成0x0000。
“纳入”和“排除”过程的简单化,加上必须要到设备上按两个设备的按钮这一要求,共同构成了Z-Wave网络整体安全模型的一个重要组成部分。对于攻击者来说,不到“控制设备”上按一下按钮(即“排除”处理),这个设备就无法离开这个网络,同样攻击者也无法操纵一个新设备进入到这个网络中。由于Z-Wave设备出自同一家公司,所以良好的举止使得Z-Wave设备都会共同遵循这些规则。不过,如果通过低层访问Z-Wave的介质访问控制层和网络层,那么该攻击者还是可以实现“节点ID冒充攻击”(NodeID spoofing attack),通过一个未加密的Z-Wave网络与其他节点进行交互。为了弥补这一不足以及避免或减弱其他相关的攻击,Z-Wave网络也提供了一个可选的逻辑上的安全层,该层是在“应用层”上实现的。
(4)Z-Wave的应用层
Z-Wave的“应用层”负责的是解析和处理请求数据包及响应数据包中作为有效载荷的数据部分。应用层所能控制的数据中,既有应用层特定的数据,也有Z-Wave应用控制的数据,最基本的应用层有效载荷数据的格式如图6所示。
图6 Z-Wave应用层有效载荷的格式
Z-Wave网络使用应用程序“命令分类”(command class)的方式来区分网络上的“行为”(action)和“响应”(response)。然而“Z-Wave联盟”对于“命令分类”本身并没有公开的文档说明,只是在一些开放源码项目中可以找到一些蛛丝马迹,比如在一个开源的“OpenZWave Library”项目的一些源码中给出了许多提供给程序员用于识别命令功能的“命令分类”;在表4中列出了这些“命令分类”的一个简短的列表。
表4 Z-Wave规范中“命令分类”的一些实例
每个“命令分类”支持一个或多个命令,这些命令归属于这个“命令分类”中,每一个命令定义了“应用层”的一个基本功能。比如,CLASS_SWITCH_ALL这个基本“命令分类”的作用是通过Z-Wave设备来控制多个网络设备的电源“开/关”控制的命令,所以消费者可以通过按下一个单一的按钮,把所有加入到Z-Wave网络中的电灯或其他电器一次性全部关掉。CLASS_SWITCH_ALL支持多个命令,在设备加入到这个“命令分类”的时候,会对该“命令分类”中的各个命令分别定义一个对应的功能。
SWITCH_ALL_SET命令:配置设备加入或退出某个“并行处理命令”的成员列表,这里的“并行处理命令”指的是打开或关闭某一个命令功能。
SWITCH_ALL_GET命令:要求设备报告自己是否加入或退出某个“并行处理命令”的成员列表的当前状态。一个具体的设备,可以加入到某个“并行处理命令”的成员列表中,也可以不加入到该“并行处理命令”的成员列表,或者只加入“并行处理命令”中的某一个命令的成员列表中。以电灯开关为例,某一个电灯,可以加入”同时开关”的成员列表,这样接到同时开的命令就开,接到同时关的命令就关;也可以不加入“同时开关”的成员列表,无论是否接到同时开或同时关的命令,都不予处理;还可以只加入“同时开”或“同时关”的成员列表,但不加入“同时开和关”的成员列表。
SWITCH_ALL_REPORT命令:跟在SWITCH_ALL_GET命令的后面,作为该命令的响应命令,一次性向查询方回复当前设备上所有开关的状态。
SWITCH_ALL_ON命令:命令网络上所有的设备都将开关切换到“打开”(ON)状态,该命令只会向那些加入到自己“并行处理命令”的成员列表的设备发送。
SWITCH_ALL_OFF命令:命令网络上所有的设备都将开关切换到“关闭”(OFF)状态,该命令只会向那些加入到自己“并行处理命令”的成员列表的设备发送。
每个Z-Wave应用程序都有一组定义好的功能,这个功能基于Z-Wave的设备类型,对制造商的应用程序的“命令分类”提供支持。在数据有效载荷中,跟随着“命令分类”字段和“命令”字段,后面的“命令分类数据”的长度是变长的,具体取决于前面“命令”字段中具体命令的需要。
虽然没有公司的协议文档的支持,但毕竟我们还有“国际电信联盟”ITU-T G.9959规范和一些开放源码项目(比如OpenZWave项目),这些规范和源码都有助于我们理解和用文档记录Z-Wave这个专有协议。但对于接下来我们要看的有关Z-Wave网络中目前的安全功能,则几乎无章可循了。
2、Z-Wave协议的安全
在第四代“Z-Wave规范”中,“Z-Wave联盟”添加了对协议的安全控制。这种现象对于其他协议来说是司空见惯的现象,但对于关键的Z-Wave部署中,在要求了低成本和简单化的部署前提下再要求安全,就显得很奇怪了。当初在设计Z-Wave协议的时候,一个显而易见的事就是“Z-Wave联盟”认为需要在安全和操作使用方便性方面仔细斟酌,所以在随后所创建的协议上,在使用的限制范围内提供合理的安全性考虑。
“Z-Wave联盟”并不提供任何公开的文档用于描述Z-Wave协议中所用的安全机制。2013年,SensePost信息安全咨询公司的两位安全顾问Behrang Fouladi和Sahand Ghanoun在美国拉斯维加斯(Las Vegas)黑帽子大会上发表了一篇对Z-Wave协议的安全性研究的报告和论文。对于Behrang Fouladi和Sahand Ghanoun的研究结果,“Z-Wave联盟”并没有证实或否认。
Z-Wave协议采用“高级加密标准-输出反馈模式”(Advanced Encryption Standard-Output Feedback Mode,AES-OFB)协议为自己提供网络上数据的保密性,同时,使用“高级加密标准之密码块链消息认证码”(Advanced Encryption Standard Cipher Block Chaining Message Authentication Code,AES CBC-MAC)协议提供数据完整性的保护。这些协议都可以很好地被创建,并且可以和“密码块链消息认证码”(CBC-MAC)协议在许多其他重要的密码套件中很好地配合使用。不过“高级加密标准-输出反馈模式”协议并不常见,所以尽管该协议仍然是一个“美国国家标准与技术研究院”(National Institute of Standards and Technology,NIST)批准的分组密码的操作模式,但是在Z-Wave数据帧发送的时候,节约所发送数据包中有效载荷的长度是一个聪明的选择。
有关Z-Wave协议,更有趣的是“高级加密标准之密码块链消息认证码”和“高级加密标准-输出反馈模式”协议是怎么使用的,特别是密钥生成以后是如何应用到Z-Wave网络安全中去的。
如表4所示,Z-Wave协议实现了一个CLASS_SECURITY的“命令分类”,该“命令分类”用于在设备之间交换安全信息。当一个支持这个安全类的Z-Wave设备处于当前网络时,这两个设备完成密钥交换的过程,并且将得到的密钥用于此后这两个设备的加密和数据完整性保护。其完整的交换流程如图7所示。
图7 Z-Wave密钥交换流程
在密钥交换过程的第1步和第2步,“控制设备”和“安全设备”准备好了密钥交换。这是该过程中至关重要的一步,允许“控制设备”建立的设备所应支持的CLASS_SECURITY“命令分类”。随后“控制设备”请求“安全设备”返回一个随机数,很快“安全设备”也返回“控制设备所需要的随机数Nonced(Nonced即“Device Nonce”,意指由设备产生的随机数)。有了这个随机数Nonced,“控制设备”就可以使用“临时密钥”(temporary key)K加密“网络密钥”(network key)Kn。“网络密钥”是在网络创建的时候,由“控制设备”随机选择的,并且该值对于每一个Z-Wave网络来说都是独一无二的。相比之下,“临时密钥”是由16个字节组成的,每个字节的值都是0x00的数组。
本处的Nonce、Nonced以及后面的Noncec并没有本质的区别,都表示一个随机数。为什么一方要的是Nonce,另一方返回的却是Nonced和Noncec,二者是否相等?我们只要理解为流程中的第一个Nonce和Nonced是同一个值,第二个Nonce和Noncec是同一个数即可。一般来说以Nonce命名的随机数,虽然并不一定是协议要求的,但通常都与时间有关。
当“安全设备”从“控制设备”处接收到加密的网络密钥Kn和“消息认证码”之后,“安全设备”会验证“消息认证码”,并使用K解密所接收到的消息。然后“安全设备”会注册解密后的Kn,并将其作为当前的密钥。下一步,“安全设备”反过来请求“控制设备”给一个随机数,“控制设备”也会返回一个随机数Noncec(Noncec即“Controller Nonce”,意指由“控制设备”产生的随机数)。拿到这个随机数以后,“安全设备”会使用Kn加密一个“密钥设置完毕”(该消息的“命令”字段值为0x07)的消息发送给“控制设备”。“控制设备”在接收到“密钥设置完毕”消息以后,使用Kn,加上“消息认证码”一起对数据内容进行解密,解密后看到消息是“密钥设置完毕”就知道双方的密钥交换过程成功。
然而,上面Z-Wave密钥的交换过程存在着漏洞,很容易受到几种攻击。
中间人攻击(MitM attack)“安全设备”除了在使用“临时密钥”K加密和“网络密钥”Kn消息时,会验证“消息认证码”值,其余的时间,“安全设备”都不验证“控制设备”的身份。所以对于一个攻击者来说,可以使用任意支持SECURITY“命令分类”的Z-Wave“控制设备”拦截该“控制设备”与目标设备之间的“纳入”过程,这会导致被攻击的设备关联到一个恶意网络上。
密钥还原攻击(Key recovery attack)因为“临时密钥”K的值是众所周知的,并且通过网络传送“网络密钥”Kn的时候,并没有提供机密性保护。所以攻击者只需要被动式地观察“纳入”过程中含有CLASS_SECURITY的通信数据包,就可以还原出“网络密钥”Kn。通过这个密钥值就可以解密随后的所有通信数据包,并且可以在这个网络上伪造任意的数据包。
最有可能的是,“Z-Wave联盟”在早期这些漏洞安全框架开发的时候,就承认在密钥交换过程中存在这些漏洞。但是这种Z-Wave密钥交换过程中的漏洞并不是Z-Wave网络中独有的漏洞,如果没有对系统的体系结构进行重大改变,以及重要协议复杂化设计,一般很难解决。为了在最小代价的前提下从整体上解决这些漏洞,“Z-Wave联盟”在过程中增加了一个新的处理,那就是“低功率纳入模式”(low power inclusion mode)。
“低功率纳入模式”更贴切的解释应该是:“控制设备”和“安全设备”使用最小的发射功率收发数据,这就要求这两个设备在间隔不超过3英尺(约为1米)的情况下完成密钥交换过程。也就是说,这种方式使用现代无线发射器的动态“发射功率控制”(Transmit Power Control,TPC)能力,在“控制设备”和“安全设备”临时切换到最小的发射输出功率状态的时候进行数据交换,其目的就是减少入侵者在“纳入”过程中发生密钥交换的时候进行侦听的机会。虽然这不是一个完美的安全解决方案,但是将“低功率纳入模式”与新设备入Z-Wave网络这种本来就极少遇到的行为相结合,也会在一定程度上使攻击者在密钥交换协议的设计上攻击这些漏洞成为不可能。
“低功率纳入模式”的使用有一个假定的前提,那就是在这个Z-Wave网络中至少有一个Z-Wave设备是便携式设备,且在两个设备需要进行“纳入”操作的时候,该便携式设备可以移动到离需要交换密钥的设备足够近的距离,然后完成“纳入”操作。但在实际系统中,两个设备之间最有可能的情况是有固定的距离。为了实现通信,许多Z-Wave装置都包括一种“重载模式”(override mode),在该模式下,“纳入”过程不但不会使用“低功耗模式”,反而是用更高的发射功率级别。因而有些设备如果要进行这样的“纳入”操作,反而使系统更容易受到攻击,但从设备的“纳入”操作本来就很少见的角度来看,这样的设计对于减少被黑客攻击的可能性来说还是有一定的好处。
在加载“网络密钥”Kn以后,“安全设备”生成两个额外的密钥,Kc和Km,(其中,Kc是“数据包加密密钥”,Km是“信息认证密钥”),然后使用“高级加密标准-电子密码本模式”(Advanced Encryption Standard-Electronic Codebook Mode,AES-ECB)加密算法生成密码。
在论文中,Behrang Fouladi和Sahand Ghanoun指出Passwordc和Passwordm的值都是静态的,定义在Z-Wave固件文件中,并且所有设备对该值的定义都是一样的。不过,即使这样,也不足以威胁Z-Wave协议中各安全套件的机密性和完整性,因为现在的Kn值仍然还是一个秘密。
当一个“控制设备”想要发送一个消息到一个安全的“从设备”上,那么这个“控制设备”必须首先向这个“安全设备”请求一个随机数,然后使用这个随机数作为“消息认证码”MAC的一部分参与运算,并将其回复给“从设备”。当“从设备”返回随机数后,“控制设备”会选择自己的随机数,将该随机数与从“从设备”发送给“控制设备”的随机数组合起来,生成一个“初始向量”(Initialization Vector,IV)值。通过“初始向量”值,“控制设备”可以使用“初始向量”和“数据包加密钥”Kc加密数据包的有效载荷(简称P),然后使用“信息认证密钥”Km计算“消息认证码”。“消息认证码”的计算包括“初始向量”,“安全头”(HDR),“源节点ID”(SRC),“目的节点ID”(DST),“有效载荷的长度”(LEN)和“加密的有效载荷”(ENC(P))。这个交换过程如图8所示。
图8 Z-Wave解密数据包的传送过程
在计算“消息认证码”的时候,通过包含“源节点ID”和“目的节点ID”的值,Z-Wave挫败了数据包伪造的尝试,因为这种攻击方式可以操纵“目的节点ID”字段,从而达到向任意设备发送伪造数据包的目的。同时,这个Z-Wave协议可以在发送之前,通过从“安全设备”请求随机数的方式,实现对拒绝“重播攻击”的可能性。当“安全设备”接收到来自“控制设备”发送的数据,“安全设备”就会将“初始向量”最后8个字节的数据与之前选择的随机数进行比较,在处理数据包剩下的内容之前,先确保这两个值是匹配的。如果一个攻击者后来“重播”之前发送过的加密包,接收方可以根据“初始向量”最后8个字节与随机数不匹配的结论,导致“控制设备”丢弃掉该数据包。
对于Z-Wave设备技术实现,由于没有权威的安全信息来源,评估设备的功能和行为的所有细微差别是很困难的,而这又正是协议攻击的关键。由于缺乏这种文档资料的来源,所以我们不得不借助于手头现有的资源和工具,通过针对Z-Wave设备的攻击实验来发现设备中存在的漏洞。
二、攻击Z-Wave网络
接下来,我们对Z-Wave网络的技术实现实施多种攻击,借此发现和检验漏洞。作为一个专有的和介绍资料少得可怜的技术(除了不必与“西格玛设计”公司签署“保密协议”的技术),能够用于攻击Z-Wave网络的工具也显得尴尬和相对不成熟。
1、对Z-Wave网络的侦听攻击
对任何无线网络,最常见的攻击技术就是窃听网络上通信的数据包,以观察其中以明文方式传送的敏感数据。在对Z-Wave攻击技术的覆盖范围内,我们将通过多种技术利用三个主要工具,开始我们的侦听攻击。
Z-Force侦听工具
Z-Force是一款Windows操作系统上的工具,是由Behrang Fouladi和Sahand Ghanoun共同开发的,这是二人研究Z-Wave网络漏洞的一部分。Z-Force工具作为一款基本的数据包嗅探器,还有对Z-Wave网络攻击的附加功能。
对于嗅探器的硬件,Behrang Fouladi和Sahand Ghanoun为德克萨斯仪器公司的“CC1110芯片的迷你开发套件”(CC1110 Mini Development kit)开发了一个定制的固件程序。该固件程序的产品编号是CC1110DK-MINI-868。该套件包括两块“CC1110开发板”和用于对CC1110芯片进行编程的德克萨斯仪器公司的“CC Debugger”调试器。这两个开发板和“CC Debugger”调试器的实物图如图9所示。
图9 CC1110芯片的迷你开发套件
“CC1110芯片”是一个“片上系统”设备,包括一个8位8051微处理器,有一个支持868MHz和915MHz频段的无线接口。由于Z-Wave开发板没有与“Z-Wave联盟”签署“保密协议”就不能使用,所以“CC1110芯片的迷你开发套件”是在一个合理的价位上的不错的选择,其单价是75美元。
作为一个开发套件工具,该CC1110DK芯片是为开发人员设计的,目的是向使用Z-Force技术的开发人员提供一些一些额外的组件:
基本通孔焊接工具,包括烙铁(iron)、焊锡丝(solder wire)、助焊台(helping hand)、老虎钳(vise)。
双面0.1厘米间距2排7列(2×7)“公头对公头”的连接头,外形如Adafruit.com网站上产品编号为1539的产品(该产品是2×36的连接头,由于没有2×7的连接头,所以只能用这种2×36的连接头手工切成5个2×7排列的连接头)。
6根“母头对母头”成型跳线,外形如Adafruit.com网站上产品编号为266的产品。
1根“USB转串口”桥接转接头,主要用于串行访问,如Adafruit.com上名称为“飞特帝亚公司之友”(FTDI Friend)的产品,产品编号是284。
首先,需要使用Z-Force固件程序刷新CC1110DK芯片的接口,然后需要将CC1110DK接口连接到“USB转串口”的转接头上,通过笔记本电脑的USB接口连接到Windows操作系统上,接下来,我们来看看这些步骤。
(1)刷新CC1110DK接口的固件程序
CC1110DK在出厂时就预装了基本的“主/从”模式固件,可以通过发送或接收功能来估计测试距离。为了通过CC1110DK接口使用Z-Force工具,必须在双方的接口中刷上新的固件程序。
Z-Force的设计可以同时容纳两个CC1110DK接口,通过“USB转串口”的适配器进行连接,连接的原则就是:每一头的“发送引脚”(TX)连接另一头的“接收引脚”(RX)。需要将两头的固件文件都刷上最新的固件程序,每一个不同的CC1110DK芯片都要使用Z-Force固件程序的全部功能。
支持欧洲Z-Force频率的固件文件
默认的固件文件主要就是向Z-Force提供对868.4MHz频率的支持,所遵从的规范是“Z-Wave无线规范”的R2配置版本,传输速率是40 Kbps(详见表2)。发送TX和接收RX的固件文件可以从Z-Force工具的SVN仓库处下载。
Z-Force固件文件是以二进制格式发布的,但是我们需要将它们转换为Intel公司十六进制格式,然后才能刷新到“CC1110DK记忆棒”的内存中。要完成这种固件文件内部格式的转换,需要下载一个SRecord-Win32转换工具,下载成功后,解压缩所下载的srecord-X.YY-win32.zip文件(X.YY表示的是SRecord-Win32软件的最新版本号),然后将解压后的srec_cat.exe二进制文件复制到Z-Force固件文件所保存的目录中。打开命令shell外壳程序,由于是Windows操作系统,所以也就是打开“命令提示符”,然后在命令提示符中切换到上述Z-Force固件文件所保存的目录,这样就可以在命令行中将二进制文件转换为Intel公司的Hex格式文件了。其操作系统的格式及运行效果如下所示:
接下来,我们可以将这两个固件文件刷新到CC1110DK的电路板上芯片中了。
(2)CC1110DK固件的刷新
无论使用支持哪个洲Z-Force频率的固件文件,在CC1110DK硬件上刷新固件文件的过程都是一样的。首先,通过DBG_CONNECTOR板,将CC1110DK与“CC Debugger”调试器连接起来,如图10所示。在连接硬件的逻辑上,跳线桥的第3、第4引脚应该连接在CC1110芯片的下面;“CC Debugger”调试器的USB接口应该连接到计算机主机系统上,然后在计算机主机上运行“SmartRF固件烧录程序”(SmartRF Flash Programmer)。
图10 CC1110DK与“CC Debugger”调试器的连接
“SmartRF固件烧录程序”允许直接与得克萨斯仪器公司的CC1110芯片以交互的方式完成读取和写入固件文件的刷新操作,“SmartRF固件烧录程序”工具可以从得克萨斯仪器公司的官网上下载,下载并解压所下的压缩文件,然后运行其中的安装程序(installer)完成安装过程。下一步,运行“SmartRF固件烧录程序”软件。
当启动“SmartRF固件烧录程序”工具以后,会出现通过“CC Debugger”调试器升级固件之类的提示信息,按照提示就可以完成固件的更新。
随着“SmartRF固件烧录程序”工具的打开,可以选择或输入要刷新的Z-Force固件文件,然后在“动作”(actions)分组框中选择“擦除、写入并验证”(Erase,Program And Verify)单选框。再在所选接设备的列表中选择“CC Debugger”调试器接口,并且查看一下使用的芯片是CC1110,然后单击“动作完成”(Perform Actions)按钮,其效果如图11所示。在上述过程中,如果“SmartRF固件烧录程序”没有在所连接设备的列表中列出要刷新固件程序的CC1110芯片,那就先检查确认DBG_CONNECTOR连接器的连接线连接是否正确,该连接图如图10所示,以及跳线的位置是不是在第3和第4引脚上。
图11“SmartRF固件烧录程序”设置主界面
CC1110DK固件的刷新操作与CC1110固件的刷新操作一样,故不再重复,并且下面改用CC1110DK进行介绍。
在成功地使用CC1110DK芯片完成对Z-Force固件的刷新工作之后,该设备上的红色和绿色的LED指示灯都会被点亮。
重复上面为电路板上CC1110DK芯片的刷新过程,每个电路板所对应的设备功能不一样,所以刷的内容也不一样。一边接收方要刷的是接收固件RX,另一边发送方要刷的是发送固件TX。因为两者之间没有视觉上的差异,为了防止混淆,我们建议直接在板子上贴上一个标签,明确标明这个电路板是刷新了发送固件TX的电路板,还是刷新了接收固件RX的电路板。
下一步就是在CC1110DK接口中刷新欧洲Z-Force固件,或者刷新北美洲Z-Force固件,可以从电路板上断开“CC Debugger”调试器接口,然后将“USB转串口”的桥接转接头连接到电路板上,对使用Z-Wave协议的设备进行处理。
(3)连线CC1110DK接口
要使用CC1110DK接口,首先要将双面“公头对公头”的连接头焊接到CC1110DK主板上标有INTIO的socket引脚插座上,主板上的插座是2×7引脚布局。现实中很难找到这种引脚排列的连接头,一个简单的办法就是买一个其他布局的,比如2×36排列的连接头,然后手工切割一个2×7的连接头使用。接下来,使用成型跳线连接CC1110DK公头引脚的“USB转串口”桥接连接线上,连接示意图如图12所示,引脚的连线对照表详见表5。
图12 CC1110DK与“飞特帝亚公司之友”的连线示意图
表5 CC1110DK与“飞特帝亚公司之友”的连线对照表
我们在这里详细地介绍“飞特帝亚公司之友”(FTDI)的“USB转串口”桥接转接头连线方式,只要连接正确,那么从电脑主机向“USB转串口”桥接转接头发送的数据都会导致该设备上的LED灯闪烁。比如,从终端仿真器上按下一个回车键,由于有数据传输,所以设备LED灯就闪烁一下后灭掉。间接地,使用这个方法也可以知道当前数据是否通信。如果使用的是另外一个不同型号的“USB转串口”的适配器,要查阅该产品的文档来确定正确的引脚,特别是其中的地线GND、发送线TX和接收线RX。
要在两个设备上分别应用正确的固件程序,我们需要使用两节AAA电池为CC1110DK主板供电。将主板上P1插线排上的引脚1和引脚2通过跳线连接到电池的两端,使其向主板提供电源。再将刷新过接收固件RX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上,通过Windows的“即插即用”功能自动安装所需要的驱动程序。关注这里用于接收RX接口的串口的端口号。重复上述步骤,再将刷新过发送固件TX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上,自动安装所需要的驱动程序。并同样关注一下这个用于发送RX接口的串口的端口号。
这里的“USB转串口”其实只是一种接口转换线,就是外形是USB口的线,但实际上运行的是串口的协议。对于操作系统来说,看到的是一个串口,而不是一个USB口,从软件的角度来看,这个串口与实际的物理串口并没有什么区别。这里所说的“关注串口的端口值”,在Windows操作系统上,是依次打开“开始/控制面板/设备管理器”,然后查找其中的“端口(COM和LPT)”(如果没有此项,则表示计算机中没有任何串口),然后就会列出该主机上所有的串口,其中名字的最后通常都是“(COMn)”结尾,其中的n就是上面要关注的串口端口值,以后所有对该串口的操作也都要使用该值。即使同样多个的“USB转串口”,插入顺序不同,各连接线的串口值也不一样,所以需要“关注”并记下来。
对于CC1110DK设备,还可以不使用电池供电,而改由“飞特帝亚公司之友”的“USB转串口”桥接转接头供电。要这样做,需要进行一些改装。首先,将板上的5伏电源(即标有“5V VCC”的位置)连线剪断然后连到“飞特帝亚公司之友”板背面的3V跳线焊点处将其焊上,然后将四个跳线针中的引脚1连接到“飞特帝亚公司之友”电源VCC引脚上,这样CC1110DK的供电将通过USB由主机电源供电。主机电源给USB口供电,USB口再通过“飞特帝亚公司之友”板给CC1110DK设备供电,但注意不要将第2根电源线连接到CC1110DK设备上。
所有的工作完成以后,就可以开始运行Z-Force应用程序了。单击“选项(Options)|射频板(RF Boards)”菜单,分别选择和设置前面发送固件TX所对应的COM串口端口值和接收固件RX所对应的COM串口端口值。然后程序就做好了开始捕获Z-Wave网络上的通信数据包的准备,这时选择“工具(Tools)|开始捕获(Start Capture)”菜单。Z-Force程序就会显示所捕获到的数据包,其效果类似图13所示。单击“工具(Tools)|停止捕获(Stop Capture)”菜单就会停止当前的数据包捕获过程。
图13 Z-Wave数据的捕获实例
遗憾的是,作为一个嗅探工具,Z-Force程序只是做到了最基本的数据包捕获功能,对于常见数据包捕获工具上的通用型功能,Z-Force程序并没有提供。可以说,Z-Force程序只是完成了嗅探类工具中最小的数据包的解码能力,所完成的功能只是做到了提取HomeID、源节点ID、目的节点ID等寥寥几个字段,这也是在识别数据包中Z-Wave电子束控制和其他部分的时候得到的。同时,由于Z-Force工具缺少以任何格式保存所捕获的数据包到文件的能力,因此即使该工具捕获到一些数据包,也无法通过其他工具进行进一步的分析。还有,因为Z-Force的固件只支持“Z-Wave规范”中的R2配置版本,所以Z-Force工具也只支持“Z-Wave规范”中的R2配置版本,而不支持R1配置版本、R3配置版本,以及“Z-Wave Plus规范”。最后,作为一个“闭源项目”(closed source project),自2013版的Z-Force工具推出以来,就再也没有进行后继的开发,所以添加新功能也是不可能的。为了解决这些限制,这里启动了一个新的Z-Wave嗅探项目,名为:KillerZee。
基于CC1110DK芯片攻击Z-Wave网络的开源工具
作为一种Z-Force工具的替代品,研究人员Jean-Louis Bourdon开启了ZTsunami项目,其设计目标是打造一个只需要使用一个CC1110DK接口,既能进行Z-Wave嗅探,又能实施数据包注入的工具。为了使ZTsunami成为一个强有力的工具,Jean-Louis Bourdon对“Z-Wave规范”进行了更深入的分析和剖析。作为一个开源项目,ZTsunami已在多个方面优于Z-Force工具,包括日益增长的社会支持和越来越多的项目志愿者积极参与开发。
虽然对于Z-Wave网络在欧洲和北美洲使用频率上,ZTsunami工具已经能够捕获Z-Wave通信数据包,并将捕获的数据包写入到文件中了,作为一个新的工具,ZTsunami仍然还只能提供有限的功能。同时,如果无论是固件,还是Windows下嗅探软件源代码,都愿意接受“GPLv2许可”,那么可以使用CC1110DK硬件平台进行Z-Wave网络嗅探开发的开源项目就多了,这些项目也都是直接将其项目开发目标定位于取代Z-Force工具。
一个较早捕获到数据包的实例结果显示如下:
KillerZee设备的侦听
KillerZee项目是出于简化Z-Wave嗅探开发、扩展数据包嗅探的功能,以及利用开源项目的优势这几个目标而创立的。项目通过加入各网络嗅探功能中公共的功能实现,而开源项目最大的优势就是可以遇到全世界范围内的针对Z-Wave攻击平台上频繁的要求。
KillerZee工具既是一个Z-Wave网络安全评估的工具集,又是一个新的Z-Wave工具的开发框架。使用KillerZee工具,可以侦听到Z-Wave网络上的一举一动,列举出连接到Z-Wave网络上的外围设备,利用Z-Wave技术使用上的漏洞,操纵Z-Wave网络的活动,最终识别出一个可以使用的新的攻击漏洞。
KillerZee工具并没有使用CC1110DK的硬件,而是使用了CC1111芯片,结合“得克萨斯仪器”公司USB接口的“评估模块集”(Evaluation Module Kit,EMK)作为其攻击硬件,该设备的实物图如图14所示。CC1111EMK设备使用一个类似于CC1110DK芯片的芯片,但是增加了USB功能,另有一些引脚的针用于程序的烧录。有一个灵活的按钮可以用于自定义功能。不幸的是,这款CC1111EMK芯片相比于CC1110DK芯片少了一些功能,但对于执行一些Z-Wave网络上数据包的捕获操作,已有的功能绰绰有余。
图14“得克萨斯仪器”公司的CC1111EMK设备实物图
有一个名为RfCat的,同时使用了CC1111EMK设备和KillerZee工具的项目,它利用了二者的固件以及Python开发框架,也在做类似的Z-Wave网络侦听工具的制作。其项目名RfCat的绰号是“低于1GHz频率无线攻击的瑞士军刀”(the Swiss army knife of sub-GHz radio)。作为一个研究和攻击“低于1GHz频率”网络的开发框架,RfCat采用Chipcon公司的CC1111芯片,包括CC1111EMK芯片。项目的固件程序开源,这是一款用“小设备C语言编译器”(Small Device C Compiler,SDCC)结合Python编程框架,通过与CC1111芯片进行交换操作设计而成,负责交互的程序名叫rflib。RfCat项目既可以作为一个平台对“低于1GHz频率”网络进行攻击实验,也可以提供一套“应用程序接口”,使第三方可以拿来用于开发定制的工具。
RfCat项目需要一些初始化设置,然后才能将RfCat固件程序刷入到CC1111芯片中。在刷入RfCat固件程序以后(系统加载程序bootloader和固件程序都是为CC1111EMK所提供,按着RfCat项目的说法,这个程序叫“DonsDongle”),还有做一些维护工作,然后才能跳转到Z-Wave嗅探的攻击之中。要将RfCat固件刷新到CC1111EMK芯片中,还需要下面的组件。
1个或多个CC1111EMK接口,可以从http://www.digikey.com或其他受欢迎的在线电子网站购到。
1个GoodFET接口,主要用于刷新CC1111EMK芯片的固件,可以从Adafruit.com上找到,产品编号是1279。
5根“母头对母头”的成型跳线,可以从Adafruit.com网站上查到,产品编号是266。
1台至少有一个空闲USB接口的Linux主机。
首先,我们看一下如何安装RfCat工具和GoodFET工具,然后我们再了解连线过程以及刷新CC1111EMK芯片固件程序的过程,通过将RfCat刷新到CC1111EMK设备中,我们会专注于使用KillerZee,结合硬件对Z-Wave网络进行攻击。
(1)安装RfCat工具
RfCat项目的源代码是使用Mercurial这样的“版本控制系统”(version control system)进行管理的。所以,要使用这套源代码,还需要安装Mercurial程序。在Linux主机使用由Linux提供商发布的“程序包管理工具”(package management tool)来安装Mercurial程序,下面的命令是假设您使用的是基于Debian,或基于Ubuntu的Linux操作系统上,通过“程序包管理工具”来安装Mercurial程序命令格式。
下一步,使用Mercurial工具中的hg程序,从RfCat项目中下载源代码,下载成功以后,从命令行切换到rfcat目录中,其操作步骤和命令效果如下所示:
接下来,构建和安装Python的rfcat工具,以及rflib开发库:
在没有root权限的前提下使用RfCat,然后在bootloader模式下设置正确的设备访问链接,并且还需要在udev目录下修改Linux“设备管理配置”(device management configuration)。结束以后,复制RfCat提供的配置文件到Linux的udev规则目录,然后重装udev目录下的配置内容,如下所示:
最后,复制RfCat工具生成的bootloader.py脚本到系统PATH路径可以找到的一个目录中,比如复制到“/usr/local/bin”目录中,则命令格式为:
现在,已经完成了RfCat工具安装,下面就可以继续安装GoodFET软件了。
(2)安装GoodFET工具
我们用GoodFET来刷新初始的引导程序bootloader代码到CC1111EMK设备的硬件上。首先,安装git的“版本管理工具”(version management tool),因为这是GoodFET程序开发包所需要的,然后下载最新版的GoodFET源代码,其操作命令格式如下。
下一步,切换到GoodFET客户端的目录,创建一个到GoodFET客户端的“符号链接”(symbolic link),其命令格式及运行效果如下。
最后,添加用户账户到dialout组,这样就可以在没有root权限的情况下使用GoodFET工具了。
因为组成员发生了变化,为了使新的组成员关系生效,将不得不注销系统,并再次登录。这样就可以正常使用了。
在完成RfCat工具和GoodFET工具的安装后,就可以通过连线将CC1111EMK设备与GoodFET设备连接起来。
(3)连线CC1111EMK接口
接下来,我们使用GoodFET工具向CC1111EMK设备载入RfCat项目的CCBootloader代码。这是一次性的操作,一旦完成,那么以后如果要更新RfCat固件,就不需要再通过连接线接入GoodFET设备了。
CC1111EMK设备有两组连接头,一组用于测试(test),一组用于调试(debug)。其中调试用的连接头是必须要与GoodFET设备相连的,二者之间的连接方式是“母头对母头”的跳线连接器。连接示意图如图15所示,引脚的连线对照表详见表6。
图15 CC1111EMK工具与GoodFET工具的连线示意图
表6 CC1111EMK工具与GoodFET工具的连线对照表
因为GoodFET设备为CC1111EMK设备提供电源,所以不需要为CC1111EMK提供电源就可以完成芯片固件的刷新。只要简单地将GoodFET设备插入到Linux操作系统主机的USB口上,很快就可以从CC1111芯片上获得该设备的基本信息,其命令格式及效果如下所示:
如果goodfet.cc工具运行后报告一个芯片ID值为0x0000,那就说明读取失败,这时,需要检查接线,以确保连接方式与图15是匹配的。
(4)刷新CC1111EMK芯片
现在,GoodFET就可以与CC1111芯片进行通信了。下一步,将CCBootloader代码刷到芯片上,该步骤的运行结果如下所示:
通过上面的操作,GoodFET已经将CCBootloader的代码刷入到CC1111EMK芯片中,下面可以从CC1111EMK设备上将GoodFET的连线断开了。之后的CCBootloader程序,允许刷新(flash)或再刷新(reflash)CC1111EMK设备,如果需要,甚至可以用不同的固件文件进行刷新。
下一步,将CC1111EMK设备设置为bootloader模式,设置的方式是按住设备面板上的按钮,然后将设备插入到计算机上一个可用的USB端口,一旦插好,就可以放开按钮。这时,会看到CC1111EMK设备外壳上绿色的LED类就会亮起来,这时查看Linux操作系统上的内核日志,会看到有一个新的串口设备在系统中注册,其效果如下所示:
接下来将CC1111EMK设备也设置为bootloader模式,不过,这个设备设置为bootloader模式不需要按按钮,而是运行bootloader.py脚本。运行后,该程序会从可访问的闪存区域删除其中原有的所有内容:
随后,从https://bitbucket.org/atlas0fd00m/rfcat/downloads网站上下载RfCat项目中最新版本的CC1111EMK固件程序。选择文件名以“RfCatDonsCCBootloader-”作前缀,后面跟着版本号,并以“.hex”结束的文件。在这个例子中,我们使用版本号为140904的文件进行创建,其命令格式如下:
下一步,使用bootload.py脚本程序刷新RfCat的固件。
使用bootload.py脚本运行RfCat的固件程序,其命令格式如下所示,或者干脆拔掉RfCat接口,然后重插一下,利用系统自动运行的功能运行固件程序:
使用CC1111EMK接口上的RfCat固件,现在,可以开始使用KillerZee工具对Z-Wave网络进行窃听了。
(5)安装KillerZee工具
最后,下载并安装最新版本的KillerZee软件。这是一个简单的过程,只要按如下所示的格式操作即可:
使用固件已经刷新过的CC1111EMK接口与已经安装好的KillerZee程序,就可以开始对Z-Wave网络进行窃听了。
(6)KillerZee的嗅探操作
KillerZee工具中的zwdump程序很像Linux系统中的tcpdump程序。不同的只是zwdump程序用于Z-Wave网络中的侦听,而tcpdump程序则是对以太网(不分有线无线的)进行侦听。如果只是想捕获和显示Z-Wave网络的基本信息,那么在运行zwdump程序的时候,就不需要带任何参数,其效果如下所示:
如果希望以类似于tcpdump的方式显示捕获到的数据包格式,zwdump程序也可以将写到文件中的数据包以libpcap文件格式进行保存,并且zwdump程序还可以从保存数据包的文件中将捕获的数据包读取出来,并以tcpdump格式进行显示:
如果在zwdump命令的后面加上一个“-v”参数,那么当zwdump程序在写入到libpcap文件所捕获的数据包时,zwdump程序还会对数据包进行解码,并且将解码结果以及接收数据包的内容都显示出来。
KillerZee工具包以及该工具包下所包含的各个工具,虽然都是专为Z-Wave网络而做的,但是在设计的时候,都考虑到了全球范围使用的兼容性。比如说,这里的每个工具都支持“Z-Wave规范”中“R1配置”和“R2配置”的版本规范。默认情况下,对于北美洲的用户,zwdump以及其他的工具都会默认地应用“R2配置版本”,以便适用北美洲的频率,不过,可以在命令行中改变这种默认的配置。下面的示例就是使用“R1配置”版本在美国捕获Z-Wave设备的网络活动。
使用KillerZee工具,比如其中的zwdump程序,如果是到了除北美洲之外的其他无线管理域该怎么办呢?其实,只要在命令行中使用“-c”参数,并在该参数后面跟上两个字母的国家和地区代码就可以了。其示例及运行效果如下所示。
尽管对于KillerZee项目的路线图(roadmap)来说,早已将Z-Wave网络数据包的解码列为一项紧迫任务,但对于Wireshark的项目,则仍然未将Z-Wave网络数据包的解码集成到其程序中。
对Z-Wave侦听攻击的防御措施
就像任何其他无线技术一样,Z-Wave网络的用户应该牢记:攻击者可以通过捕获网络通信数据包来实施“侦听攻击”。在这些例子中,网络活动并没有通过加密程序的保护来保证数据的机密性和完整性。在可能的情况下,用户应该利用内置Z-Wave加密功能,或第三方加密程序来防止敏感信息的泄露。
不幸的是,“Z-Wave联盟”并没有强制要求Z-Wave产品必须应用加密技术,这使得许多消费者很容易受到“侦听攻击”。在多数情况下,防止敏感信息泄露的唯一的防御措施是让供应商提供网络的保密性和完整性控制。
2、对Z-Wave网络的注入攻击
尽管没有参照“Z-Wave规范”,但我们还是可以推断出对产品供应商来说,他们并没有要求必须支持加密技术。事实上,许多Z-Wave产品厂商销售智能家居产品,从温控计到遥控电源插座,都无一例外地缺乏基本的加密技术和对完整性保护的支持。在这些网络中,攻击者可以“注入”(inject)任意数据包内容,或“重播”(replay)之前捕获的数据包来操纵Z-Wave网络中的任意一个Z-Wave设备节点。
在一个网络中不使用加密技术,那么Z-Wave的“纳入”处理(inclusion process)就相当于加载(amount)了一个无连接(connectionless)的“基于地址的过滤”机制(address-based filtering)。就像其他网络中无连接的“基于地址的过滤”机制一样,攻击者可以通过“源地址欺骗”(spoof the source address)的方式达到冒充Z-Wave网络上合法节点的目的,并且以被冒充节点的名义,即使明确没有在某个网络中,仍然可以“注入”任意内容的数据包。
通过未加密数据发起重播攻击
在“重播攻击”中,攻击者“重复发送”(retransmit)以前捕获并保存的数据包,借助于不需要认证的网络“再现”(reproduce)网络事件。执行一次“重播攻击”非常简单:重新播放存储的数据包捕获文件的内容即可。这种攻击产生的影响差异显著。
我们考虑一种实例,在一个未加密的Z-Wave网络中有一个Z-Wave温控计和一个Z-Wave“控制设备”。有一个攻击者捕获并保存了一个“温度增加一度”的数据包,并且“重播”了这个数据包多次,这样就可能将温度增加到一个不舒适的程度。另一个攻击的实例是针对Z-Wave门锁的:捕获和重新播放以前车门开锁的数据包,可能会产生未经授权的访问,导致车门在车主不知情的情况下打开。
(1)使用Z-Force工具进行重播攻击
Z-Force工具包括数据包的发送功能,要进行“重播攻击”的时候,在该软件的“工具(Tools)|发送数据包(Send Packet)”菜单选项里,输入目标网络的“HomeID”(即界面上的“Home ID”)、“源节点ID”(即界面上的“src Node”)、“目标节点ID”(即界面上的“Dst Node”)、“帧控制”(frame control)的值(就是Z-Wave数据包头中的“有效载荷头部”Header字段,也是界面上的同名项),上述各值都是以十六进制格式表示,接下来输入要发送数据包的有效载荷的内容(即界面上的“Payload”),输入发送重复次数,然后单击“发送”按钮,程序的界面如图16所示。
图16 Z-Force工具中数据包“注入”发送的一个样例
(2)使用KillerZee工具进行重播攻击
KillerZee使用一个短的Python脚本,同样可以像Z-Force工具一样发送任意内容的数据包,使用Z-Force工具发送数据包的程序主界面如图16所示,使用KillerZee同样可以发送相似效果的数据包,如下所示:
在这个例子中,字节0c是长度字节,表示数据包的长度为0x0c,或十进制的12个字节。使用Z-Wave的“消息认证码”是单播形式,如图2所示,在创建和解码数据包的时候使用。
使用一个脚本发送Z-Wave数据包时,如果有一个特定的数据包格式,那么发送会变得得心应手,然而,如果使用KillerZee工具集中的zwreplay工具,那么这种使用Z-Wave数据包发起“重播攻击”的体验就更容易了。
Zwreplay工具接受将一个libpcap数据包捕获文件作为输入参数,然后Zwreplay工具会重新发送数据包中的每一个数据类数据包中的有效载荷内容。这种技术在Z-Wave网络中主要用于实验,或是实验随后的数据包捕获能力,或是作为一个自动重复发起攻击状态的机制。
在这个例子中,我们从Z-Wave网络中捕获到10个数据包,并将捕获到的这些数据包保存到experiment.pcap文件中。接下来,我们使用zwreplay工具,转发每个数据包中的有效载荷的内容,在每两个相邻数据包的发送之间有一个1秒的时间间隔。
要评价这种类型的攻击所造成的影响,需要捕获一些数据包并“重播”一下,然后观察目标Z-Wave设备的行为。例如,把温度计设置为恒温,向其发送“降低1度”的指令,然后观察随着每个重播数据包的发送,该温度计的设定温度是不是持续降下来了。如果从捕获数据包的文件中找到一个特定的数据包,然后想将这个数据与其他剩余的数据包隔离开,那么只需要使用Wireshark工具集中的tshark工具就可以将所选的这一个或几个特定的数据包单独再生成一个新的数据包捕获文件。在下面的示例中,我们就从原始捕获的数据包文件中提取出帧顺序号为5的那个数据包帧,并将该数据包保存到一个单独的数据包捕获文件中。其操作命令格式的效果如下:
使用KillerZee工具可以完成注入任意数据包的能力,攻击者就有机会采取特定的数据帧来完成一个想要的行动,并由简单的工具自动化完成。接下来,我们看两个例子,这两个例子所用的工具都是KillerZee项目中所使用的工具。
通过注入控制Z-Wave电灯开关
通过前面Z-Wave数据包捕获和重播攻击的试验,我们可以识别和评估Z-Wave攻击所造成的影响。攻击的适用性可能会因不同生产厂家的产品不同,而差异巨大。比如,对一个供应商未使用加密的产品的攻击,并不能用于另一个供应商使用加密了的产品,但在很多情况下,对前一种产品的攻击,总还是能用在对其他产品的攻击上。
Z-Wave产品中一个常见的应用就是远程打开和关闭电源插座,其实物如图17所示。
图17 远程打开和关闭电源插座
这些设备实现COMMAND_CLASS_SWITCH_ALL的功能,使用一个单一的Z-Wave数据包就可以打开插座开关,或关闭插座开关。只要知道这个插座所在网络中的HomeID,那么使用KillerZee工具集中的kzpowerdown工具就可以产生强制关闭电源的事件,其操作流程及效果如下所示:
在这个例子中,当有用户通过合法的Z-Wave设备“打开”这个插座的命令时,我们使用zwdump工具捕获和保存到这个命令的数据包。我们可以从中获取到这个Z-Wave网络的HomeID,随后攻击者可以使用这个HomeID值,向广播地址发送“关闭”的命令。由于命令是广播地址,所以会使这个Z-Wave网络上所有的Z-Wave开关统统断电。上例中的zwpoweroff脚本会不断发送“关闭”信息,所以这时,即使合法用户再使用“打开”命令发送到这些Z-Wave开关上,在“打开”这些开关的时候,攻击脚本仍然会因为继续发送“关闭”命令而使这些电源开关再次“关闭”电源,最终完成实质性攻击。
除了上面的广播方式,也可以针对某个Z-Wave网络中的特定设备,通过zwpoweroff命令的“-d”参数,指定“目标节点ID”以及目标网络的“HomeID”。
操纵温控计
智能温控计是“智能能源系统”(smart energy system)的一个重要组成器件。通过使用智能温控计,在一些基于电力和其他自然资源的动态定价环境中,这种智能温控计可以根据需要自动地加热或冷却,从而使消费者的能源消耗达到优化。也正是因为这个因素,基于Z-Wave技术的温控计在全球范围内都很流行。
根据测试,发现许多Z-Wave温控计并不使用Z-Wave的加密或认证机制。这意味着使用这款温控计的Z-Wave设备容易遭受数据包的“注入”攻击,最终让攻击者通过远程操纵该温控计。KillerZee工具集中包含两个工具,可以用于发起针对这个漏洞的攻击。
这款Z-Wave温控计实现COMMAND_CLASS_THERMOSTAT_MODE功能,该功能用来设置温控计的操作模式。一个“控制设备”可以通过发送命令来控制温控计,改变预设将要达到的温度,所改变的值可以是一个或多个数值,例如加热、冷却、只通风、空气干燥,节省加热或冷却,以及更多功能的值。要完成上述操作,攻击者可以使用zwdump工具来捕获和保存这些行为的通信数据包,该命令的格式和执行效果如下所示:
在这个输出中,攻击者可以通过捕获发现一个THERMOSTAT_MODE命令发送到“节点ID”为0x02的设备上,将这个温控计设备设置为“制冷”模式(cooling mode)。攻击者也可以使用KillerZee工具集中的zwthermostatctrl工具将这个温控计的模式设置为“制热”模式(heating mode),其命令格式和执行效果如下所示:
同样的方法,Z-Wave温控计通过COMMAND_CLASS_THERMOSTAT_SETPOINT命令实现控制温控计的温度的功能。在这款温控计上,设定温度是用华氏温度表示的(这是测试后得出的结论),其分辨级别用0~255来表示。在通过zwthermostatctrl工具设定温控计为“加热”模式以后,攻击者就可以通过zwthermostattemp工具,改变温度到该设备任意支持的数值上。
当温控计接收由攻击者发送来的数据包时,它就会按数据包中的要求调整目标温度,如图18所示。通过不停地继续发送该设置数据包,攻击者可以保持对这一指定的温度的设定操作,即使有其他Z-Wave设备,或者是这个设备的主人试图降低所设定的温度,也无法奏效,最终同样可以完成实质性的攻击效果。
图18 目的温控计面板上显示所要设置的温度(当前是华氏76度,要设置为华氏95度)
对Z-Wave注入攻击的防御措施
就像Z-Wave侦听所带来的威胁一样,Z-Wave的部署中,如果不使用可选的Z-Wave数据加密和完整性保护机制,那么Z-Wave网络和Z-Wave设备也容易受到“注入”攻击。为了减轻“注入”攻击所带来的威胁,那么只要加密方法可用,就务必要使用加密。然而,事实上,很多产品缺乏安全控制机制,这样它们就难免会遭受到攻击了。
三、结语
就像任何其他无线协议一样,当厂商不愿意采取必要的安全措施来保护协议完整性的时候,也正是该协议安全漏洞百出的时候。Z-Wave技术同样存在这样的问题,因而也有漏洞可以被黑客所利用。不幸的是,对于消费者,在Z-Wave产品中缺乏安全性的这一状态并没有被产品的设计者广而告之,这让消费者在家庭中或企业里使用Z-Wave产品时,会因缺乏信心而对其安全产生怀疑。
通过对KillerZee项目的介绍,分析人士可以开始探讨Z-Wave网络部署的安全,以便使硬件投资最小化。随着KillerZee设备开始对全球Z-Wave频段的支持,该设备也开始面向国际社会提供支持了,目前已对Z-Wave网络的多个部署环节都提供必要的检测和评估工具。随着KillerZee项目逐渐发展成熟,相信KillerZee设备会对加密的Z-Wave网络上进行安全评估的方法提供额外的支持,也会对这种日益增长的无线网络技术提供一种探索的选择和安全的验证。
微信公众号:计算机与网络安全
ID:Computer-network
【推荐书籍】