14.1 Z-Wave技术简介
在前面提到的所有协议中,无一例外都是先由某个国际组织提出或认证,然后作为国际或行业免费标准建议广大设计和生产商设计和生产,但Z-Wave并不是这样。相反,Z-Wave是“西格玛设计”(Sigma Designs)公司的专有协议,并且除非其他的设备制造商与“西格玛设计”公司签署了“保密协议”(Nondisclosure Agreement,NDA),否则“西格玛设计”公司不会公开Z-Wave协议的细节,与此同时,“西格玛设计”公司控制所有Z-Wave芯片的制造和交付,全球除了“西格玛设计”以及其授权的日本三美(Mitsumi)公司之外,其他公司都无权向产品制造商提供Z-Wave芯片。由于这些原因,现在许多Z-Wave的细节未被公开,这也导致针对Z-Wave安全的分析工具相对不是很成熟。
⊗ 注意
在没有公开审查的前提下,就在重要的应用领域广泛地部署无线技术,最终导致了重大安全上的失败,在历史上是有先例的。本书的配套网站中有一个关于DECT协议分析免费试读章节的内容,其中有一个无绳电话系统存在类似的问题,即由于缺乏审查而投入部署,最终因为安全部分而使设备普遍存在安全故障。该章内容的网址是http://www.hackingexposedwireless.com/chapters/ch05.pdf。
14.1.1 Z-Wave协议的层次
与ZigBee协议类似,Z-Wave芯片使用电源保护技术以延长电池的待机时间,使用mesh网络模型以适应更大的设备通信的范围。但总的来说,Z-Wave也是一个相对简单的协议,在基本框架的基础上支持主动的“确认”(acknowledgement)和“数据帧重传”(frame retransmission),提供“自形成”(self-forming)和“动态路由拓扑更新”(dynamic routing topology updates),以及“应用程序特定的配置文件”(application-specific profile)等技术。Z-Wave采用结构化的协议栈,其堆栈结构如图14-1所示。我们将逐个检查这些组件,以便在我们通过技术攻击Z-Wave部署的时候,能更好地了解协议的每一个功能。
⊗ 注意
一些构成Z-Wave协议的细节会在随后的章节中描述。这些内容都取材于公开的标准文件、产品展示和研究工作。在可能的情况下,这里展现的细节都已经通过观察Z-Wave协议的活动而得到了验证。
1.Z-Wave的物理层
Z-Wave协议是在使用“低于1GHz频率”(sub-1-GHz)频段作为无线连接频率的协议之一。这个频段曾经一度受很多流行的无线应用所钟爱,包括用作Wi-Fi网络三个介质使用频段中的一个,最初就想选该频段作为其使用频段,不过随后,该波段改用2.4GHz频段,以便与全球共用的频段相兼容。近年来,许多标准实体已经回归到使用“低于1GHz频率”作为其通信频段,以避免在2.4GHz上跟其他无线网络冲突。同时,这样做的好处也很明显,那就是由于使用了较低的频率发射功率电平,所以在相同功率下可以发射更远的距离。不过,目前来说,使用“低于1GHz频率”频段通信的网络协议还多是一些专有协议供应商的协议,比如前面提到的“西格玛设计”公司的Z-Wave协议。
“低于1GHz频率”主要是用来指由政府相关实体分配[1]的,低于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产品内部也能够使用多种频率,只是在出厂前,根据当地所在区域设置使用的频率即可。具体可用的频率如表14-1所示。
⊗ 注意
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设备都是根据自己的需要,按照三个无线射频规范中的一个进行操作。这些射频规范定义了物理层无线调制方式、编码机制,以及数据的速率,如表14-2所示。有消息称,最慢的Z-Wave“R1配置”,正在或已经被“Z-Wave联盟”拒绝通过,虽然遵从该协议的新设备仍在销售的过程中使用此版本的配置。
Z-Wave设备在发送无线射频信号的时候,采用发射功率的组合方式,所以其无线信号的功率覆盖范围是3英尺~75英尺[2],具体取决于被发送的信息量和发送器的发射功率。在一个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网络,如图14-2所示。使用R3配置的R1配置和R2配置单播数据帧,其格式如图14-3所示。
每个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节点的分配策略详见表14-3。当一个Z-Wave节点添加到某个Z-Wave网络时(该过程所包含的细节请参见本章后面的内容),该设备的“节点ID”应该设置为0,“主控制设备”会在范围1~232中找一个未使用的值分配给该新加入节点,供其作为“节点ID”使用。而该设备也会在随后的通信中,自始至终地使用这个值作为其“节点ID”,直到网络关闭或退出网络。因此,一个Z-Wave网络中,节点的最大数目是232个,如表14-3所示。
⊗ 注意
按作者的经验,Z-Wave设备在进行地址分配的时候并没有完全遵守上述“介质访问控制层规范”中的地址分配规则,最常见的现象是有些“控制设备”的“节点ID”使用了“保留”字段区间中的保留值。
16位的“帧控制”(Frame Control)字段还可以再分成几个以“位”为单位的子字段,其中包含两个保留位,如图14-4和图14-5所示代表几个子字段。
·“路由” (Routed)子字段 用来表示该数据包是从上一个节点处通过路由转发而来,而不是由上一个节点主动发起连接后发送来的。同样由于自己也不是连接发起方,所以在向下一个节点发送的时候,应该也设置这个字段。
·“确认请求” (AckReq)子字段 用来表示这是一个接收节点,对发送节点所发“请求”数据包的一个确认数据包。
·“低功耗” (Low Power)子字段 用来表明该数据包以低功率的方式发送,以便减小发送范围。
·“速度调整” (Speed Modified)子字段 该字段仅用于“R1配置和R2配置”,表示的意思是如果源节点和目的节点都支持速率调整的话,那么二者之间采用较低的数据发送速率进行传输。
·“头类型” (Header type)子字段 该字段用来表示一个数据包的类型,有效的类型有:单播(unicast或singlecast)、组播(multicast)、确认(acknowledgement)三种。值得一提的是,如果想使用广播(broadcast)方式,那么在这里要选择“单播”,然后在“介质访问控制层”单播数据帧格式(图14-2或图14-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网络的攻击了,在这一节的后面,我们还需要了解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应用控制的数据,最基本的应用层有效载荷数据的格式如图14-6所示。
Z-Wave网络使用应用程序“命令分类”(command class)的方式来区分网络上的“行为”(action)和“响应”(response)。然而“Z-Wave联盟”对于“命令分类”本身并没有公开的文档说明,只是在一些开放源码项目中可以找到一些蛛丝马迹,比如在一个开源的“OpenZWave Library”项目的一些源码中给出了许多提供给程序员用于识别命令功能的“命令分类”;在表14-4中列出了这些“命令分类”的一个简短的列表[3]。
每个“命令分类”支持一个或多个命令,这些命令归属于这个“命令分类”中,每一个命令定义了“应用层”的一个基本功能。比如,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网络中目前的安全功能,则几乎无章可循了。
14.1.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数据帧发送的时候,节约所发送数据包中有效载荷的长度是一个聪明的选择。
♥ 提示
上面加密协议中的MAC指的是指“消息认证码”,不要与本书前面提到的Z-Wave协议中第二层的“介质访问控制层”混淆。
有关Z-Wave协议,更有趣的是“高级加密标准之密码块链消息认证码”和“高级加密标准-输出反馈模式”协议是怎么使用的,特别是密钥生成以后是如何应用到Z-Wave网络安全中去的。
如表14-4所示,Z-Wave协议实现了一个CLASS_SECURITY的“命令分类”,该“命令分类”用于在设备之间交换安全信息。当一个支持这个安全类的Z-Wave设备处于当前网络时,这两个设备完成密钥交换的过程,并且将得到的密钥用于此后这两个设备的加密和数据完整性保护。其完整的交换流程如图14-7所示。
在密钥交换过程的第1步和第2步,“控制设备”和“安全设备”准备好了密钥交换。这是该过程中至关重要的一步,允许“控制设备”建立的设备所应支持的CLASS_SECURITY“命令分类”。随后“控制设备”请求“安全设备”返回一个随机数,很快“安全设备”也返回“控制设备所需要的随机数Nonced (Nonced 即“Device Nonce”,意指由设备产生的随机数)。有了这个随机数Nonced ,“控制设备”就可以使用“临时密钥”(temporary key)K0 加密“网络密钥”(network key)Kn 。“网络密钥”是在网络创建的时候,由“控制设备”随机选择的,并且该值对于每一个Z-Wave网络来说都是独一无二的。相比之下,“临时密钥”是由16个字节组成的,每个字节的值都是0x00的数组。
注:本处的Nonce、Nonced 以及后面的Noncec 并没有本质的区别,都表示一个随机数。其实作者的这种表述,反而容易让读者误会,为什么一方要的是Nonce,另一方返回的却是Nonced 和Noncec ,二者是否相等?我们只要理解为流程中的第一个Nonce和Nonced 是同一个值,第二个Nonce和Noncec 是同一个数即可。另外,顺便提一下,如本书前面所述,一般来说以Nonce命名的随机数,虽然并不一定是协议要求的,但通常都与时间有关。——译者注当“安全设备”从“控制设备”处接收到加密的网络密钥Kn 和“消息认证码”之后,“安全设备”会验证“消息认证码”,并使用K0 解密所接收到的消息。然后“安全设备”会注册解密后的Kn ,并将其作为当前的密钥。下一步,“安全设备”反过来请求“控制设备”给一个随机数,“控制设备”也会返回一个随机数Noncec (Noncec 即“Controller Nonce”,意指由“控制设备”产生的随机数)。拿到这个随机数以后,“安全设备”会使用Kn 加密一个“密钥设置完毕”(该消息的“命令”字段值为0x07)的消息发送给“控制设备”。“控制设备”在接收到“密钥设置完毕”消息以后,使用Kn ,加上“消息认证码”一起对数据内容进行解密,解密后看到消息是“密钥设置完毕”就知道双方的密钥交换过程成功。
然而,上面Z-Wave密钥的交换过程存在着漏洞,很容易受到几种攻击。
·中间人攻击 (MitM attack) “安全设备”除了在使用“临时密钥”K0 加密和“网络密钥”Kn 消息时,会验证“消息认证码”值,其余的时间,“安全设备”都不验证“控制设备”的身份。所以对于一个攻击者来说,可以使用任意支持SECURITY“命令分类”的Z-Wave“控制设备”拦截该“控制设备”与目标设备之间的“纳入”过程,这会导致被攻击的设备关联到一个恶意网络上。
·密钥还原攻击 (Key recovery attack) 因为“临时密钥”K0 的值是众所周知的,并且通过网络传送“网络密钥”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))。这个交换过程如图14-8所示。
在计算“消息认证码”的时候,通过包含“源节点ID”和“目的节点ID”的值,Z-Wave挫败了数据包伪造的尝试,因为这种攻击方式可以操纵“目的节点ID”字段,从而达到向任意设备发送伪造数据包的目的。同时,这个Z-Wave协议可以在发送之前,通过从“安全设备”请求随机数的方式,实现对拒绝“重播攻击”的可能性。当“安全设备”接收到来自“控制设备”发送的数据,“安全设备”就会将“初始向量”最后8个字节的数据与之前选择的随机数进行比较,在处理数据包剩下的内容之前,先确保这两个值是匹配的。如果一个攻击者后来“重播”之前发送过的加密包,接收方可以根据“初始向量”最后8个字节与随机数不匹配的结论,导致“控制设备”丢弃掉该数据包。
对于Z-Wave设备技术实现,由于没有权威的安全信息来源,评估设备的功能和行为的所有细微差别是很困难的,而这又正是协议攻击的关键。由于缺乏这种文档资料的来源,所以我们不得不借助于手头现有的资源和工具,通过针对Z-Wave设备的攻击实验来发现设备中存在的漏洞。
- 无线频率的分配是由国际组织负责的,少数频段由政府或组织负责。我国的无线频率分配工作是由工业和信息化部(原信息产业部)负责。有关内容可参见工信部网站http://www.miit.gov.cn/n11293472/n11294912/n11296542/12169542.html。——译者注
- 1英尺=0.3048米,所以此处3英尺~75英尺即0.9米~22.8米。——译者注
- 在惜字节如金的Z-Wave协议中是不可能传输这样的字符串命令的,所以根据猜测,这个列表中的命令应该是一个宏指令(macro),在实际的编程中都会被转换成具体的指令码。——译者注
本书评论