freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试 | RKE如何破解汽车
2024-03-01 12:10:14

无钥匙进入(RKE)系统基本上是一种无线遥控器,能够让汽车打开或关闭车门,甚至启动发动机。

我一直觉得网络安全在“现实世界”中的影响更有趣,这也是我喜欢破解物理设备的原因。嗯,事实证明,破解越有争议,就越有趣!因此,我开始对远程控制设备的破解感兴趣,特别是对汽车遥控器的破解。不久前,我弄到了进行这些攻击所需的所有硬件,所以我终于可以尝试一些攻击了。

在这篇文章中,我想分享一下这些设备的工作原理,它们的弱点以及我们如何在理论和实践中利用它们。

在我们开始之前,先听听我们的赞助商的几句话:你的道德感。 我们都知道,未经他人许可就破解他人是不好的,但是未经他人许可就进入他人的车辆是非常不好的。所以请你把从这篇文章中得到的信息用来学习这些系统的工作原理,而不是用于不道德的目的,好吗?
你不会偷车,对吧?

如何破解汽车开锁(理论上)

RKE或无钥匙进入系统是通常所说的钥匙扣或汽车遥控器。简单来说,它是一种无线遥控器,能够让汽车执行一些动作,比如打开或关闭车门、后备箱等等。汽车遥控器的工作原理很简单:它们产生一个包含认证码和一些表示要执行的命令的位的无线信号,汽车接收到信号后,如果认证码可以验证,汽车就执行命令,就这么简单!或者说,真的这么简单吗?

固定码和重放攻击

如前所述,遥控器发送的代码有两部分:一个认证码和一个表示要执行的命令的代码。汽车过去有一个与之相关的唯一认证码,钥匙会发送这样的代码和一个命令代码,让汽车执行某个动作。下面的图片展示了通信是如何工作的:
固定码工作原理

这种系统被称为“固定码”系统,因为唯一的认证码永远不会改变。这种系统很容易实现,但它有一个重要的缺陷:它容易受到重放攻击。这意味着一个攻击者可以在一辆车附近放置一个无线接收器,捕获车辆遥控器在车主操作时发送的无线信号。一旦信号被捕获,它就可以简单地重放,汽车就会打开。你可以在下面的图片中看到一个例子:
固定码重放攻击

虽然这需要专门的工具,但这种攻击相对容易成功执行,而且也可以用非常便宜的硬件实现。请记住,虽然汽车不再使用这种机制,但一些更简单的设备仍然使用(你可以在这里找到对这些遥控器之一的分析)。

对固定码的暴力破解攻击

为了完整起见,值得一提的是,如果信号的原型是已知的(调制、代码长度、前导/尾随位的存在等),那么就有可能通过暴力破解攻击来恢复固定码。根据代码的长度和使用的硬件,这种攻击的实用性可能有所不同。

与“原始”的暴力破解攻击不同,使用De Bruijn序列进行暴力破解代码可能会快得多。

De Bruijn序列是,包含由特定字母表构成的特定长度的所有可能代码的最短的位流。普通的暴力破解攻击要求攻击者顺序地发送递增的代码,尝试所有可能的代码,而使用De Bruijn序列,可以生成一个位流,其中包含字母表中每个可能的代码一次且只有一次。

为了让你更容易理解这种攻击,下面是一个De Bruijn序列的实际表示:

{0  0  0  0} 1  1  1  1  0  1  1  0  0  1  0  1
0 {0  0  0  1} 1  1  1  0  1  1  0  0  1  0  1
0  0 {0  0  1  1} 1  1  0  1  1  0  0  1  0  1
0  0  0 {0  1  1  1} 1  0  1  1  0  0  1  0  1
0  0  0  0 {1  1  1  1} 0  1  1  0  0  1  0  1
0  0  0  0  1 {1  1  1  0} 1  1  0  0  1  0  1
0  0  0  0  1  1 {1  1  0  1} 1  0  0  1  0  1
0  0  0  0  1  1  1 {1  0  1  1} 0  0  1  0  1
0  0  0  0  1  1  1  1 {0  1  1  0} 0  1  0  1
0  0  0  0  1  1  1  1  0 {1  1  0  0} 1  0  1
0  0  0  0  1  1  1  1  0  1 {1  0  0  1} 0  1
0  0  0  0  1  1  1  1  0  1  1 {0  0  1  0} 1
0  0  0  0  1  1  1  1  0  1  1  0 {0  1  0  1}
0} 0  0  0  1  1  1  1  0  1  1  0  0 {1  0  1 ...
... 0  0} 0  0  1  1  1  1  0  1  1  0  0  1 {0  1 ...
... 0  0  0} 0  1  1  1  1  0  1  1  0  0  1  0 {1 ...

在这个例子中,可以看到每个可能的4位代码都包含在一个16位的单一位流中。

当然,这种攻击只在特定的情况下有效,特别是接收器需要使用移位寄存器来读取传入的信号。移位寄存器可以想象成一个固定大小的内存,以FIFO的方式处理数据,将较旧的位推出内存,为较新的位腾出空间。下面的GIF很好地解释了这一点:

移位寄存器的工作原理

看了这个动画,就更容易理解为什么De Brujin序列和移位寄存器能够很好地配合工作。

这种攻击能够成功的另一个要求是,通信不使用任何类型的前导或尾随位,因为这会使序列无效。

滚动码

幸运的是,今天的汽车比过去更安全一些,因为广泛使用了“滚动码”系统。使用这些系统,钥匙不会每次都重复使用相同的代码,而是每次按下按钮时发送不同的代码。如果你试图向使用滚动码系统的汽车重放一个捕获的信号,汽车将简单地忽略它。
为了简单起见,我们可以想象汽车和相关的钥匙共享一个有序的有效代码列表,这些代码一旦使用就会被逐一失效。

实现方式可能有所不同,但每个钥匙和汽车都会有一个计数器,每次发送/接收信号时更新,并且可能会有一个伪随机数生成器(PRNG)算法,它使用计数器和一个加密密钥(由汽车和它的钥匙共享)作为种子来生成下一个代码。下面你可以看到这个过程是如何工作的:
滚动码工作原理

这种方法使得攻击者很难生成一个“未来的代码”,并且使得重复使用已经被汽车接收过的代码成为不可能,相对于固定码的方法,这是一个巨大的进步。

但是,这种方法有一个问题:钥匙和汽车是独立工作的,所以如果钥匙在汽车范围之外发送信号(增加计数器,并在其代码列表中标记当前代码为已使用),它就会“失去同步”,因为在下一个信号中,汽车仍然期望钥匙刚刚标记为已使用的代码。

为了解决这个问题,汽车不仅仅认为一个代码是有效的,而是维护一个有效代码的范围(n,n+1,…,n+k),每次接收到信号时更新。如果钥匙在汽车的范围之外发送多个信号,并且超出了有效代码的范围,那么下一个包含有效代码但在有效范围之外的信号将作为一个重新同步的数据包,并且不会让汽车执行任何动作。

RollJam攻击

滚动码背后的机制是相当安全的,但是钥匙和汽车独立操作的事实是这个系统设计中的一个弱点。像我们之前做的那样,让我们把这个方案中使用的代码,看作是由钥匙和汽车共享的有序代码列表。在正常情况下,代码堆栈的演变类似于这样:
正常工作情况下的代码堆栈状态

对于每次交互,钥匙代码堆栈和汽车代码堆栈都处于相同的状态。但是如前所述,两个堆栈可能会失去同步,如下面的例子所示:
“失去同步”情况下的代码堆栈状态

虽然两个栈现在已经同步,但这种情况仍然不正常,因为下一个使用的代码将是N+2,但代码N仍然在汽车栈中有效,并且它将永远不会再被钥匙使用。RollJam攻击是一种强制钥匙和汽车代码栈处于不同步状态以恢复有效代码的技术,该代码不会被钥匙使用,但仍然可以被汽车接受。这种攻击最初由Samy Kamkar开发,但我相信在他展示之前研究人员已经知道了这种弱点。

该技术强制重新创建钥匙在汽车范围之外按下的情况。这是通过使用能够抑制钥匙和汽车之间通信的频率干扰器来实现的。但干扰不足以打开汽车,因为有效代码并未自动被攻击者捕获,因此有必要在干扰时“嗅探”原始通信以检索有效代码。在这种情况下,攻击者充当中间人代理。以下是解释如何进行攻击的方案:
RollJam 攻击方案

虽然这种攻击看起来很容易实施,但实际上还有一些障碍需要克服。

这种攻击仍然适用于许多汽车,因为它与大多数滚动代码实现兼容,但在其他方面受到限制:
检索到的有效代码可能不会持续太长时间 。
每个有效代码只能用于汽车的一次操作 。
更改包含有效代码的信号所执行的操作可能很困难(需要对信号本身进行逆向工程)。

一些汽车用一个简单的解决方案修补了这个漏洞:汽车不仅将接收到的代码标记为已使用,而且可以使每个代码N+K都失效,其中K小于刚刚接收到的代码。这样,检索到的有效代码只在钥匙下一次与汽车通信之前有效。

针对RKE的其他攻击

值得一提的是,针对RKE系统特定实现的攻击存在。虽然不太普遍,但与RollJam攻击相比,这些攻击通常具有更大的影响。

回滚攻击

回滚攻击在2022年美国黑帽大会上展示,是一种新的攻击基于滚动代码的RKE系统的方法。这项技术背后的研究人员发现,某些汽车在一定时间内连续接收两个或两个以上(已使用)代码后,它会恢复到以前的状态:如果攻击者可以访问已使用的代码N和N+1并重新播放它们,则汽车代码栈的状态将被重置,使得从N+2开始的代码再次有效。
实际上,这种攻击类似于RollJam,因为为了捕获连续代码,攻击者必须使用干扰器来抑制钥匙到汽车的信号,以便让车主再次按下钥匙按钮。

这种攻击比RollJam更加通用,因为它允许攻击者随时控制汽车,并且可以根据需要多次控制汽车(因为他们可以多次重置汽车状态)。然而,根据目标不同,某些参数可能会有所不同,例如:重播代码的连续性、重播代码的数量以及重播这些代码的时间范围。

此外,看来亚洲制造商的汽车受此漏洞影响最大。已经对本田、现代、起亚、马自达、日产和丰田汽车进行了测试,并根据使用的特定滚动代码编码器,汽车安全或易受特定实例攻击。唯一在研究中安全的制造商是丰田。

尚未证实,但某些滚动代码编码器的文档表明,这种漏洞是由于“钥匙挂件学习过程”造成的。

Unoriginal-Rice-Patty (CVE-2019-20626) and Rolling-PWN (CVE-2021-46145)

以下漏洞特定于本田汽车的RKE系统。

Unoriginal-Rice-Patty

Unoriginal-Rice-Patty是CVE-2019-20626背后的研究/攻击的名称,攻击本身很基础。即使受漏洞影响的车辆使用滚动代码系统,它们也容易受到简单的重播攻击。这表明现代汽车可能容易受到非常简单的攻击。

此外,包括远程启动发动机的可能性,允许攻击者打开汽车甚至打开发动机。

已知易受攻击的汽车有:

2009年Acura TSX
2016年本田雅阁V6旅行轿车
2017年本田HR-V(CVE-2019-20626)
2018年本田思域掀背车
2020年本田思域 LXHonda

Rolling-PWN

这种技术利用了CVE-2021-46145,虽然没有公开有关攻击的细节,但我们知道漏洞在于受影响的汽车接受滑动窗口代码,并且当向汽车呈现特定命令序列时,汽车中的滚动代码状态会重新同步到以前的状态。

由于细节不公开,所以无法确定,但攻击似乎类似于回滚攻击。

已知易受攻击的汽车有:

2012年本田思域
2018年本田X-RV
2020年本田C-RV
2020年本田雅阁
2020年本田奥德赛
2021年本田Inspire
2022年本田飞度
2022年本田思域
2022年本田VE-1
2022年本田Breeze
2021年本田雅阁

如何实际破解汽车开锁  (实践上)

现在我们对RKE系统的安全性有了很好的了解,我们可以尝试在现实生活中攻击它们。前面提到的所有攻击都类似于实施,但这一部分的目标将是尝试进行RollJam攻击,因为它与大多数汽车兼容。

请注意,我们还将讨论干扰无线电频率,这种做法可能会干扰附近无线电设备的正常运行,并且在您所在国家/地区很可能是非法的,因此如果您打算在家中尝试,请确保您知道自己在做什么。

所需硬件

要使用无线电信号,需要发射器和接收器。有几种选择:

FS1000A和XY-MK-5V

这些模块通常成对出售,是一种极其便宜的解决方案(<5€),可以通过无线电信号接收和传输数据。这些设备非常简单,它们并不是开箱即用的。要使用这些设备,您很可能需要一个微控制器,比如Arduino和一个天线(DIY也是一种选择)。

正如人们所想象的那样,这些设备存在局限性,事实上,这些设备仅限于433.92MHz、315MHz或330MHz频率(取决于型号),并且仅支持OOK。

这些设备广泛可用,并且在Arduino环境中易于支持,因此它们值得拥有。

CC1101

CC1101是一种低成本(5-10€)的次千兆赫收发器,它比前面的解决方案略贵,但兼容性更好。它支持300-348 MHz、387-464 MHz和779-928 MHz频段,覆盖了全球所有可能常用的RKE频率。它还支持2-FSK、4-FSK、GFSK、MSK以及OOK和灵活的ASK调制。

这种集成电路可在多种板卡上使用,其中大多数包括天线和与Arduino或其他微控制器接口的引脚。鉴于其规格,这种设备毫不奇怪地处理了翻转零中的次千兆赫系统。

虽然这种设备比前面的设备更强大,但软件支持并不是最好的,在某些情况下需要做一些工作。

软件定义无线电(SDR)

这些设备绝对是最昂贵的解决方案(约100-∞€),但也是最通用、整体性能最好的。软件定义无线电是能够接收(有时也能发射)无线电信号的设备,但使用计算机来处理数据,以保持硬件设计简单、便宜。

这些设备通常至少工作在2GHz以下,并支持所有调制和编码(因为处理是通过软件完成的)。

一些SDR只是接收器,一些是收发器。有些是半双工的,有些是全双工的。有些比其他设备提供更宽的工作频率范围。根据您的需求(和资金可用性),您一定会找到完美的SDR。请记住,RKE实验专注于次千兆赫频率,因此只要您能发射信号,就不需要太花哨的东西。

这些是我实验过的设备,但我相信还有很多其他设备适合这项工作。

在我的实验中,我使用了一个带有portapack H2(mayhem固件)的HackRF One和一个FS1000A来进行攻击。
image

攻击场景和设置

要进行RollJam攻击,我们需要能够干扰RKE频率并同时嗅探钥匙发送的信号。

理论上,可以使用全双工收发器来实现这一点,但由于HackRF One是半双工的,所以我创建了一个频率干扰器来处理干扰部分。干扰器采用极其简单的设计,包括一个ESP32板(用于Wi-Fi控制)和一个FS1000A作为RF发射器。该项目名为433mhz_jam,在github上可用。我还使用了一个电池组来为设备供电,因此它是远程控制的,可以抛掷。这样可以更好地灵活性,并实时进行攻击,而不是自动化过程。如果您不想自己制作干扰器,您可以使用另一把工作在相同频率上的汽车钥匙来干扰信号,甚至可以使用HAM无线电(但在这种情况下,传输功率将是过度的,并且可能使任何嗅探工作都变得不可能)。

为了提供背景信息,这是我的设置中干扰信号的样子:
image

这是钥匙发出的干扰信号的样子:
image

现在,在原始的RollJam攻击中,您需要干扰一个特定的频率,同时在附近的一个频率上进行嗅探,其中原始信号被重复(由于谐波,但这不在本文的范围内)。使用这种方法,结果可能会有很大的不同,主要是因为便宜的干扰器无法屏蔽一个特定的频率,您需要使用带通滤波器来实现这一点。

因此,我“开发”了一种轻微变化的攻击,我喜欢称之为RollDumb,因为它更简单但令人惊讶地有效。

由于我创建的干扰器设备是可抛掷和远程控制的,所以我可以将它放在我试图攻击的汽车旁边,这样干扰信号就能被汽车强烈接收。由于干扰器的功率不太强,几米远的地方信号功率就大大降低了。

现在我可以将我的嗅探器放在离汽车远一些的地方,在那里它可以轻松接收到汽车钥匙在我正在干扰的同一频率上发出的信号。

我觉得这种攻击的变化更加现实、通用,并且更容易自动执行或由攻击者实时执行。我之所以这么认为,是因为要进行RolllJam攻击,在现实生活中尝试攻击之前需要对确切的汽车型号进行广泛研究和测试,而RollDumb攻击的要求可以更加宽松,因为您只需要找出钥匙挂件的频率。

演示和结论

既然我已经解释了整个攻击的工作原理,那么演示是必要的:

演示视频

以下是RollJam攻击的演示视频:

点击查看演示视频

不用说,当汽车打开时,它非常令人满意。

好吧,既然这样说了,尝试开车很有趣,我在多辆车上尝试过这种技术,我不得不说,一旦你对它有了很好的掌握,它就容易复制和有效(或者至少在我的国家是这样的,因为大多数(如果不是全部)的钥匙挂件都工作在433.92 MHz)。需要基本的无线电传输知识,但我必须说好工具在这类攻击中也起到了重要作用。

现在你知道如何破解你的汽车了,感谢阅读!

# 黑客 # 系统安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录