本文为看雪论坛优秀文章
看雪论坛作者ID:kxliping
声明:本文所有实验均在封闭条件下进行,未影响其他用户正常使用。本文包含的技术仅供学习交流,切勿违法使用。
遥控车钥匙的安全问题是车辆安全研究领域一个经典的话题,因此网络上也流传着很多通过重放、中继等方式解锁用户车辆的视频,其中的每个视频都给人十分震撼的感受,毕竟通过技术手段悄无声息地解锁甚至成功开走他人车辆看起来实在太酷了。我相信很多人都在网络上看到过类似的视频,但可能基本都不太了解背后的原理。本文打算从一种不太“优雅”的攻击方式开始,向读者介绍车钥匙的安全原理。之所以说这种攻击方式不太“优雅”,是因为我们的攻击需要接触车钥匙,即攻击成功的前提条件是我们能够拿到某人的车钥匙,并车钥匙的信号进行录制:录制工具还是我们之前使用过的HackRF One,PC端工具有多种选择,可以直接使用命令行的方式,但命令行的方式不太方便对录制的信号进行分析,最好使用带有分析功能的工具,推荐URH或者GNU Radio Companion。 使用GNU Radio Companion录制信号:在录制车钥匙的信号之前我们需要首先搞清楚车钥匙的工作频率,因为无线通信设备通过确定的频率(范围)来收发信号。确认频率的方式也有很多种,一种有效的方式是通过钥匙的fcc编码在fcc.io网站上查询,我们首先在车钥匙上找到fcc编码:另外,fcc网站上还提供了同款钥匙芯片的更多信息,比如信号调制方式为FSK:第二种确认钥匙芯片工作频率的方式是通过频谱分析工具进行确认,如通过GQRX SDR进行分析(如下图)。将频率从0开始逐渐向上滚动,同时不断地按钥匙上的解锁按钮,直到出现下图双频点的效果,此时的频率即为钥匙的工作频率。另外还可以通过搜索引擎来确定钥匙芯片的工作频率,因为网络上有不少商家出售同款芯片钥匙,他们会在商品的详情页列出钥匙的工作信息,如下图所示:
通过简单的搜集,我们能够获取到的相关信息如下表格所示:在确认了频率之后,我们正式开始录制信号。录制信号之后,我们把设备靠近车辆进行重放,然后期待在信号发送完毕的同时车灯会出现解锁时的闪烁,但一次又一次地,车辆无动于衷,这导致我开始怀疑车钥匙的通信原理是否与我了解的一致。在我的理解中,目前大多数遥控车钥匙通信协议的安全性是基于滚动码的,滚动码的基本原理可以用下图简单示意:即钥匙与车均会通过记录不断滚动的计数值,来防止重放攻击。详细的设计方案可以参考下图:
Keylog加密算法(Cyber Attacks on Smart Cars using SDR)
因为滚动码是不断变化的,因此经过加密之后的Hopping Code每次都不同,并且只有车辆可以解密Hopping Code。这里的关键在于每一个独一无二的Hopping Code只能使用一次,因此我们可以离线录制钥匙信号,然后将信号靠近车辆进行重放,因为此时的Hopping Code是最新的,并且没有使用过,因此理论上车辆在解密Hopping Code之后能够认同此时的滚动码值。但实际的重放攻击却没有成功,难道车辆在收到信号之后会向钥匙发送反馈并再次确认?为了排除这种可能性,我对完整的解锁过程进行了抓包分析,事实是不存在后续的反馈通信。因此,我决定使用多款车型,在多种场景下进行尝试。最终,在一次偶然的场景下,车辆解锁成功了。为了分析决定成败的因素,我对比了下失败的信号和成功的信号。成功的信号波形图平滑圆润,失败的波形图实际上是两个波形的叠加,即环境噪声与信号的叠加。为了确认是环境噪声导致信号失真(并最终导致重放失败),我再次尝试在屏蔽间进行录制。我使用的屏蔽间如下图:事实证明,在屏蔽间录制的信号“百发百中”,每一次都能够成功解锁车辆,并且信号波形也如第一次成功解锁的波形那样,因此可以确定地说环境噪声是影响此次攻击的重要因素。解锁_哔哩哔哩_bilibili(https://b23.tv/LJmUPWf)上锁_哔哩哔哩_bilibili(https://b23.tv/3TysvdZ)从攻击的结果上来看,我们基本可以确认车钥匙使用的是滚动码的方式。为了进一步确认信号的格式,我对信号进行了解码分析。其中,不管是解锁还是上锁,第一段的内容均相同,全由0和f组成:00f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
这段编码没有实际的涵义,它的作用可以理解为与前导码相同,用来告知芯片开始接收信号。另外,第五段的内容也完全相同,但内容不同于第一段,因此我们会将第五段与中间三段合并分析:0000000000000078787878787878787878787878787f80787f807f8780787f87807f878078787f807878787f878787878078787f8787807f807878787f8780787878787878787878787f80787f878780787f8787800000
中间三段数据每次都会产生变化,为了便于分析,我通过再次编码的方式简化了中间三段数据,并采集两次解锁和一次上锁的数据进行了对比。重新编码之后,(包含第五段)有效数据部分如下图:所有的信号段均以相同的序列开始,这些相同的起始数据很有可能就是车辆序列号;每次解锁/上锁的最后一段数据完全相同,可以表示为如下格式:推测最后这个信号段的作用是标识一次完整信号发送的结束,为“结束码”。另外,在不同的解锁/上锁过程中,其余三段信号的中间内容均不相同,即可推断为对滚动码和相关信息进行加密之后的密文。其中,在每次解锁/上锁的过程中,中间三段信号均包含了同样的滚动码信息,即滚动码被重复发送了三次,因此我们可以推断车钥匙与车辆通信协议的大致过程:通过对信号进行解码,我们再次确认了车钥匙的工作原理。然后需要注意的是,这种提前录制信号后的重放攻击的影响是有限的,一方面攻击实施的前提条件比较苛刻,另一方面,录制的信号只能成功重放一次,车主们不必过于恐慌。但更加高级的攻击方式也是存在的,即无接触的攻击方式,这种攻击的大致原理是通过干扰装置干扰车辆接收信号,达到在线录制信号的目的,我将在后面的博客中继续更新这种更加“优雅”的攻击方式。
看雪ID:kxliping
https://bbs.pediy.com/user-home-508256.htm
*本文由看雪论坛 kxliping 原创,转载请注明来自看雪社区