以LoRaWAN保护无线协议为例

哈Ha

我想再次以LoRaWAN为例,讨论如何在IoT设备中使用的无线网络中提供基本(读取:最低必要)数据安全级别。

为什么选择LoRaWAN? 首先,因为它是一个经过良好描述和完善的标准,如果您正在开发自己的无线协议,则应作为参考。 其次,因为它是一个非常原生且典型的物联网解决方案; 当然,您可以拆解Wi-Fi或LTE中的安全性,但是对于大多数开发人员而言,这是徒劳的分析:您不太可能需要编写自己的Wi-Fi实现。 第三,是低功耗的物联网设备,开发人员在其中保存每个字节,这通常是最容易泄漏的。在这里,LoRaWAN很好地说明了如何保存字节而不受到攻击。 第四,最后,因为从字面上来看,最近几天,我们的一些客户要求向他们介绍有关LoRaWAN中数据保护的更多信息,而在本文中,我用一块石头杀死了两只鸟。


服务器和设备之间的LoRaWAN消息传递

尽管图片中的LoRaWAN中的消息传递方案看起来非常简单-这种简单性具有误导性:它有很多工作要做,并且其中没有一个像素是多余的。 现在您将了解原因。

我们将以LoRaWAN 1.0.2为例进行分析,并与可能的威胁作斗争-对于一个好的开发人员,应该永远不要考虑如何保护自己的系统,而应该考虑如何破坏系统。 否则,其他人会为他考虑。

那么,无线网络的主要威胁是什么?如何保护自己免受威胁?

截取用户数据


最简单的威胁是常规数据拦截: 由于无线电波不受控制地传播,因此绝对任何人都可以将接收机调谐到所需的调制范围和类型,并聆听您发送的所有内容。

防止这种情况的最简单方法是数据加密。

在LoRaWAN中,分别使用密钥长度为128位(16字节) 的AES-128算法用户数据进行加密 。 AES是一种可靠的算法,但是,在甚至没有硬件加密模块的最低限度的现代微控制器上,其使用也不会带来大量开销:在频率为48 MHz的Cortex-M3上,从头开始在大约100μs内对一个16字节的模块进行加密。

数据重复


在某些情况下,攻击者无需知道您在那里确切传输的内容。 例如,如果您的传感器有一个关闭的窗口,可以传输一件事,而一个打开的窗口则可以传输其他东西,那么您可以记录其中的内容而无需查看其内容的详细信息,使传感器无声,这样系统就不会怀疑由于缺少数据包而出了点问题。从传感器-广播先前记录的消息。

在LoRaWAN中,将计数器添加到每个数据包 。 如果一个数据包到达计数器等于或小于前一个计数器的网络服务器,则该数据包将被简单丢弃。 每米有两个字节,并且具有典型的物联网系统消息传输速度,它将持续很长的时间-例如,即使是每分钟传输温度的家庭气象站也只会在一个半月后溢出(LoRaWAN允许一个4字节的计数器)。

但是,存在一个明显的问题-溢出后,设备将收到编号为0的数据包,该数据包显然少于其他任何编号,但是网络服务器应正确地感知它,然后重新开始计数。 另外,设备可以通过简单地重启来重置计数器。

这可以通过以下两种方式之一来实现:

  • 发送此类数据包之前,设备必须在网络上进行注册过程(在LoRaWAN网络中,此过程称为“加入”)。
  • 服务器允许下一个数字为0的数据包到达,同时重新开始倒计时

LoRaWAN中使用这两种方案,具体取决于设备的激活方式-OTAA或ABP(我们将在下面讨论它们)。 第一个选项用于OTAA,同时为设备提供了新的加密密钥-因此,即使是在气象站下呆了一个半月的攻击者也将无法传输任何以前记录的数据包,因此系统可以接受它。

对于在网络中没有注册过程的ABP,使用第二个选项-但是,如果计数器溢出时间大大超过了估计的设备寿命,则可以将其禁用。 在发送每个数据包后意外重启的情况下,此类终端设备会将计数器值存储在非易失性存储器中。

第二种方案当然不太安全,但是在实践中它是允许的-攻击者不需要在其中记录任何数据包,而是特别要记录零。 如果需要,可以使它的内容不同于所有其他程序包-例如,不传送数据,而是传送有关设备类型和设置的信息。 那么它的拦截和重复将无法提供任何合理的信息。

伪造柜台

但是,问题立即出现了-如果柜台被伪造了怎么办? 您可以将其放入数据包的加密部分,但是实际的用户数据量将减少两个字节。 您不仅可以加密用户数据,而且还必须首先适应16字节的块大小,其次,网络服务器上的负载将增加,这将必须首先对其进行解密,以便对程序包进行任何操作(在方案中,仅加密用户数据,如果正式忽略了该包,则无需解密。

显然,攻击者是否知道软件包编号对我们来说并不重要-在具有网络重新注册(OTAA)的方案中,此知识根本无法帮助他,在ABP中,他将在海边等待很长一段时间以等待天气,即 包的下一个到达,编号为N-1。

因此,不让他更改此数字就足够了。

为此,LoRaWAN中的整个程序包均使用加密签名AES-CMAC签名,标准中的此签名称为MIC,消息完整性代码。 它检查整个程序包 (包括所有标头和数据)是否已到达服务器。

也就是说,在接受了下一个程序包之后,我们可以快速查看其计数器(发件人地址等),如果它是我们的计数器并且是正确的,则已经验证了签名(在其上花费了额外的资源),并且如果签名也是正确的,则解密数据并传输他们进一步。

跟踪不变的数据

对于我们来说不幸的是,这还不足以阻止攻击者了解数据或至少重复数据-在某些情况下,足以让攻击者了解数据没有变化。 一个教科书的例子是家用水表:如果您只是想知道房主是否在家,对您到底有多少升无关紧要,那么知道此值是否在增加很重要。

显然,数据加密是可逆的过程(可以解密),这意味着用相同密钥加密的相同数据总是看起来相同。 从水表接收数据包(其读数不变)时, 无需解密数据包 ,就可以理解它们不变。

要解决这个问题非常简单-数据或密钥都必须更改。 要更改数据,您可以在其中添加盐-解密后会丢弃一些随机字节。 不幸的是,一个数据包中的16个字节已经稀疏了,因此在一般情况下,我们不想将其中的2-4个字节浪费在实际的垃圾上。

LoRaWAN使用更棘手的方案 。 还记得我们有一个数据包计数器吗? 因此,使用AES算法对该特定计数器以及有关设备和数据包的信息(LoRaWAN网络上设备的短地址,数据传输方向,16字节计数器)进行加密,并且将XOR结果与用户数据包进行加密。

结果,有效载荷字节不会浪费,并且无论负载是否发生变化,每条消息看起来都不同。

PS还有另一种选择,更简单一些:将消息计数器用作密钥的最后N个字节。 在这种情况下,密钥每次都会是新的,但是因为 由于服务器知道消息计数器的值(它在消息的未加密部分中),因此它将能够还原它。 减号-如果您的程序包包含几个16字节的块,并且它们具有相同的数据,则在加密之后它们将保持不变。

攻击者已了解到加密密钥

这是一个非常现实的情况-物联网的特点是使用了大量设备,在这些设备上,您通常无法可靠地控制对外部人员的访问(如果您也是网络运营商,那么根据定义,您的客户就是彼此的外部人员)。

因此,如果您所有的设备都具有相同的加密密钥,则其中任何一个的所有者都可以侦听任何其他设备的流量(通常来说,如果他具有修改固件的能力,那么对于这样的操作,您甚至可能根本不知道该密钥-让新固件将其从旧固件转移到同一位置,并仅提供其他人的数据)。

LoRaWAN为每个设备实现了两种使用密钥的方案:

  • 通过空中激活,OTAA-每次在其中注册设备时,网络服务器都会生成密钥
  • 通过个性化激活-密钥由制造商设置并存储在设备上,永不更改

总共至少有两个密钥-AppSKey(用于加密用户数据)和NwkSKey(用于签名消息)。

显然,OTAA方案更加方便和可靠-密钥可以根据您的需要进行多次更改,并且保证它们是唯一的,除了网络服务器之外,其他任何人都不知道。 在ABP中,密钥永远不变,唯一性取决于设备制造商的责任心(例如,我们是根据微控制器的唯一ID生成这些密钥的,因此它们在两个设备上重合的可能性可以忽略不计),并且必须将它们明确存储在某个位置,因此在连接设备时到网络将它们注册在服务器上。

但是,在OTAA中获取密钥的过程是一个单独的故事,如果实施不正确,可能会导致更多类型的攻击。

拦截生成的密钥


显然,如果在网络注册期间每次都生成新密钥,那么它们必须在设备和服务器之间同步,这意味着攻击者可以拦截它们,从而破坏了所有保护。

因此,LoRaWAN设备具有第三个密钥-AppKey ,它紧密地连接到设备中并在一个时刻使用:在网络上注册时。 使用它,可以签署设备和服务器之间会话密钥的交换。

理想情况下,每个设备的AppKey应该是唯一的,但是在许多情况下,允许使用相同的AppKey-因为只需要使用一次,因此可以将其识别为有效。

在连接设备之前,将AppKey输入到网络服务器的设置中。

因此,设备会生成注册请求(JoinRequest),而不是对其进行加密(它没有任何敏感信息),而是使用AppKey密钥对其进行签名。 网络服务器已收到此数据包并检查了发件人地址(是否是我们的设备),然后签名了,则使用JoinAccept数据包进行响应,并在其中传输网络设置-嗯,它实际上是在确认注册。

AppSKey和NwkSKey密钥从何而来?

这是AES-128加密的结果,其中AppKey密钥由服务器在响应中发送的随机AppNonce编号,密钥编号(1或2),网络ID和另一个随机DevNonce编号组合而成:

NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce) AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce) 

由于设备和服务器在交换注册数据包后都知道所有这些参数,因此它们将生成相同的密钥。 因此,绝不会通过无线电自行发送任何密钥,但同时,设备和服务器将收到唯一的加密和数据包签名密钥。

自身拦截数据流


但这还不是全部!

是的,网络上的注册事件通常很少发生,但可以想象攻击者能够发起和拦截该事件。

然后,如果他只是简单地发送他记录的JoinRequest数据包,而不更改其中的任何内容,则服务器将使用JoinAccept数据包响应它,从而生成新密钥。 此后,受攻击的设备仅停止与服务器通信,因为它没有启动JoinRequest,并且看不到任何更新密钥的理由。 也就是说,重复相同的攻击-但已经在网络上的注册过程中。

攻击者将无法伪造数据,因为为此,您需要知道密钥,并且要获取密钥,您需要知道他不知道的AppKey。 但是要将设备从网络中剔除-他可以。

为了避免这种情况,在注册过程中,设备会向服务器发送随机数的DevNonce(请看上面的软件包中的内容)。 除了基于密钥生成密钥这一事实外,它还用于另一个目的-LoRaWAN服务器存储DevNonce存档 。 如果设备收到已使用DevNonce的重复注册请求,则服务器将简单地忽略它。

反过来,该设备必须在每次注册时生成一个新的DevNonce(也就是说,具有常规数据包中继的电路-“没有收到响应,第二次在无线电中吐出相同的数据包”-在这里不起作用,每次都重新创建JoinRequest)。

结论


尽管结果很多,文字却很少,但是即使这并不是一个完整的可能对无线电台进行攻击的完整方案(例如,为什么必须在设备上对设置进行加密的问题,所以我们为每个设备留有单独的密钥在方括号之外,这不再是收音机。 例如,在LoRaWAN 1.1中,保护方案变得更加复杂。

但是,这是任何无线电协议的绅士集,它们声称具有最有价值的信息保护,同时旨在在低速网络中的低功率设备上工作。 此外,这是一个很好的示例,它不仅实现了安全协议,而且实现了为低功率设备编写的协议,并在不对安全性造成重大损害的情况下,尽可能地减少了通话时间和计算能力的消耗。

而且,如果您正在设计自己的物联网协议,那么经过充分说明的LoRaWAN加上对进行攻击的基本方法的理解,将为学习如何正确组织这种保护提供了绝好的机会。

Source: https://habr.com/ru/post/zh-CN458394/


All Articles