西西河

主题:【原创】汽车遥控防盗器安全吗 续篇 -- 代码ABC

共:💬19 🌺39 新:
分页树展主题 · 全看 下页
  • 家园 【原创】汽车遥控防盗器安全吗 续篇

    《汽车遥控防盗器安全吗》写的有点粗糙,里面介绍的东西总的来说有点过时了。在IT、电子技术日新月异的今天,四、五年前的报道差不多可以进博物馆了。何况里面还有更老的技术。另外,作为职业IT人士居然在文章中强调自己的无线电专业学历,而对精彩的破解算法的过程一笔带过,真是一种背叛。所以下面我在来说一些新一点的,有些IT味道的内容。

    目前大多数车主还在使用类似遥控器的钥匙,也就是那种按一下按钮才能开门锁车的钥匙,这种安全系统英文称之为Remote Keyless Entry(RKE,我翻译为遥控无钥门证,搞汽车的同学麻烦给我一个权威的说法……)。新一代的钥匙系统叫Passive Keyless Entry(PKE,我翻译成被动无钥门证),这个系统估计有人已经在用了,通常一些高档车,新车都会提供这一选项。和RKE不同的地方在于,这个PKE系统不需要用户掏出钥匙,只要身上带着钥匙走近自己的车就可以开门,进去之后也不用把钥匙掏出来插进点火器。至需要按一下车上的“开始”按钮(这一定是微软的工程师干的)就可以把车开走了。相应的你下车关门走人之后,车子会自动把们窗锁好。和微软一样,非常贴心的设计。

    在介绍PKE工作原理前跑一下题,前一篇写出来之后有人对钥匙系统的加密能力提出疑问——为何这么弱,为何不使用已经证明是安全的密码协议。我的回复过于轻率,在这里展开一下,顺便为后面的介绍打个基础。

    首先,钥匙系统要解决的问题是身份验证问题,不是信息保密传输问题。加密和身份验证有关系但又有本质的区别。身份验证通常的方式是让被验证者证明自己知道什么东西,或拥有什么东西。举个例子,在猜猜我是谁的诈骗游戏中,诈骗方通过语言技巧窃取“我应该知道什么”的信息,而你在后续交谈中则使用“你应该知道什么”来验证对方自称的身份。这就是一种身份认证,如果对方通过别的渠道获取了你的同学、朋友的经历,那么你就容易上当受骗,这种通过事先获取验证信息,再告诉你让你相信诈骗者身份的攻击方法,在信息安全领域里称之为回放攻击。

    为了防止回放攻击,我们需要在验证过程中加入随机效应。比如你和朋友共同知道100件事情,而骗子如果只知道其中几件就只有很小的概率在电话中让你上当。当然了,骗子可以和你多玩几次或者找多个人来玩这个游戏,小概率事件多次重复中奖的概率就大大提高了。所以,你看我们人工验证的方式是多么地不靠谱啊。不过计算机就不同,计算机产生随机数的结果可以很多,即使可以快速重试很多次,在极小的概率面前中奖的可能性还是非常渺茫的。所以这里的身份验证主要是依赖随机数生成而不是加密。有人也许会说,通过密钥交换协议每次生成一条随机密钥来加密身份信息不也可以吗?确实可以,不过我们先不考虑实现协议的硬件开销、功耗问题。只看协议本身,这个协议也要使用随机数。攻击者有两条路来进行攻击,通过破解随机数算法来破解密钥从而得到身份信息。或者通过分析每次加密的身份信息来获取密钥或者反推身份信息,因为每次加密的信息都是相同的,只是密钥不同,分析起来可能有快捷的方法。由于密钥交换协议本身不能用来验证身份,所以这种方法并不见得比仅靠随机数生成来得严密。

    计算机产生的随机数其实不是真随机,事实上是一组有随机特性的可预测数列——是伪随机数。通常的伪随机算法包含一个种子和一个密钥。在钥匙系统里,钥匙和汽车都有一组相同的种子和密钥,因此双方生成的为随机数是可以匹配的。钥匙系统的身份验证归根到底就是验证对方是否知道种子和密钥。

    事实上,这种依靠随机数生成来验证身份的方法也是有标准的。在我们平时使用的非接触式门禁系统或其他射频身份识别系统中有不少用的也是这种技术。

    回过头来继续讲汽车防盗系统PKE——被动无钥门证。这个其实是在传统遥控的基础上进行改进的。主要区别是这种系统中汽车会定期发送一个150KHz(不同系统频率不同,不过都是低频信号),这个信号里面包含汽车本身的身份码。当钥匙进入这个低频信号范围的时候就会发出回应信息。这时候车子就知道主人来到自己身边了,因此会准备好开锁。当主人坐进车子的时候,点火开关也马上准备好等着主人按下。在这个过程中,汽车和钥匙一般是采用挑战回应模式相互验证的。这样要比上一篇所描述的钥匙单向提供验证信息更为复杂。而且汽车发出的低频信号影响范围很小,大致只有不到20厘米的距离。天线一般安放在车门把手和车内的驾驶台上,这样是为了确认钥匙就在附近。然而这个看起来还不错的系统还是有一定缺陷的。

    去年(2011年)有人声称使用中继攻击方法可以破解这种系统,在8个厂家的10台车上做了验证[1]。其方法是把汽车发射的低频信号,通过一个接收天线收下来,再通过馈线连接到另一个天线上。这样把汽车的检测信号传送到远离汽车的钥匙旁边,触发钥匙回应和开锁。由于钥匙回应信号是通过UHF发射理论上可以传输100米以上,这样仅仅中继汽车的检测信号就能让远离钥匙的人在车旁开门,当把天线放在驾驶台的时候,甚至可以启动汽车。

    图片来自参考文章

    点看全图

    外链图片需谨慎,可能会被源头改

    点看全图

    外链图片需谨慎,可能会被源头改

    虽然拖着一条电缆的贼比较猥琐,但是这个方案稍作改进就非常时尚了。实际操作中可以将汽车的低频信号调制到一个射频载波上,这样就可以省去那条笨重的馈线,采用无线转发的方式进行中继。同样的钥匙信号也可以用相同的方法进行无线中继。所以当你在餐厅大快朵颐的时候,旁桌的人也许就能帮助车库的贼把的车子开走!

    这种采用物理信号直接中继的攻击方式,也算是一种旁路攻击。在这里算法和加密什么的都不起作用。因为这个系统的一个弱点在于钥匙位置检测依赖于简单的低频检测信号,系统假设只有在很短的距离内钥匙才能收到检测信号。一旦这个假设被电磁中继破坏整个系统就不再安全了。因此良好的PKE系统必须有安全有效的距离检测手段。

    从上面描述我们可以看到一个教训,安全系统只要有一个漏洞,攻击者就可以把一辆卡车开过去。

    [1] Relay Attacks on Passive Keyless Entry and Start Systems in Modern Cars

    Aurelien Francillon, Boris Danev, Srdjan Capkun

    Department of Computer Science

    ETH Zurich

    8092 Zurich, Switzerland

    faurelien.francillon, boris.danev, [email protected]

    通宝推:xtqntd,
    • 家园 关于身份验证和随机数那段我有点疑问

      1.破解随机数算法的含义:这个在于是否能缩小可能的搜索空间,打个比方如果理论上总共可能生成1w个随机数,但是算法有某种缺陷结果只能在这1w个里头的1k个打转,或者能控制算法的种子值等等,否则的话我认为不能算“破解”。

      2.关于分析加密信息:这样的设计是不合理,事实上如果非要重复加密传输同样的信息的话,可以通过random padding或更换initialization vector之类的办法加扰。当然了,最好的办法还是不把身份验证信息传来传去,不管加不加密。

      如果要我来设计的话,钥匙和车的系统应该是这样的:

      0.随机数的产生:有自然源,比如无线电噪声、刹车/油门的间隔和力度等等。

      1.钥匙插入点火开关时在验证钥匙的机械特征(这算what you have吧)后,车和钥匙协商用以在后续步骤验证身份的K0,这个是每次插入钥匙都会变的.

      2.汽车锁闭状态,钥匙按开锁按钮时发出明文的请求(为了避免群呼,可以带车辆标识;为避免穷举可以限制重试频率).

      3.汽车收到钥匙的认证请求后,用K0为key通过加密算法A加密一个新生成的随机数K1,将此密文C0发送给钥匙.

      4.钥匙收到C0后用K0解密得到K1,用K1通过算法A加密{操作码,一个新随机数}为密文C1,其中随机数可以用钥匙上的时钟生成(比如距离上一次点火启动的时间等).

      5.汽车收到C1后用K1解密如能得到正确的操作码即证明钥匙身份可信,可以执行其命令。因为此时从车的角度讲C1能被K1正确解密说明钥匙的到了正确的K1,而K1是通过正确的K0加密的,所以钥匙必然有正确的K0;而从钥匙的角度讲,如果车方是假冒的,那么其加密K1'所用的K0'很大可能不是真的K0,这样钥匙解密后得到的K1就极不可能是K1'了,因此即使是有假冒的车来响应钥匙,钥匙方面也没有泄漏多于被动空中监听得到的唯密文信息。

      这里的算法A完全可以用公开的、久经考验的对称加密算法。

      • 家园 随机数的作用在这里的作用有两个

        一个是身份验证,另一个是防止回放攻击

        随机数算法破解的意思是通过观察该算法产生的随机序列推算出该算法的密钥。在算法公开的情况下有了密钥就可以生成相同的随机序列和预测这个算法的后续输出。在算法不公开的情况下可以生成一个等效算法或者预测后续的输出。这才叫完全破解算法。

        我这里所说的随机都不是真随机,是伪随机。一个伪随机算法实际上是输出一个循环周期很长的数列的算法。现在各种伪随机算法的周期都很长,比如一个64位的伪随机函数周期就是2的64次方。一般不会出现你说的只在几个范围里面打转这种低级错误。

        伪随机数之所以可以用来验证身份是因为,只需要知道密钥就可以根据要求输出伪随机序列中指定的数值。这样验证者通过要求被验证者生成指定序号的数值就可以验证对方是否知道密钥。只要监听者无法通过听到的随机数反推密钥或预测未来输出,这种验证就是安全的。

        通信加密中无法使用真随机数,这样对方也无法预测这个数值,除非事先用别的安全方法先沟通。你的方法就是事先沟通好的真随机数方法。其实就安全性而言直接传那个K0就好了,就用明码传,效果和加密是一样的。为了防止手欠的人没事乱按遥控器,可以事先多存几个(几千个,让你按到抽筋)。不过产生真随机序列的方法并不简单,有不少看上去像随机的东西都有一定的规律性,但你提出的想法确实不错,也具备可行性。

        • 家园 恩,有点想到我的问题在哪了

          我还是从通信的角度考虑的,所以想到的是通过加密实现双向认证同时也防止man-in-the-middle。钥匙光向车证明身份的话,我觉得你最后提到提前存几千个随机数的办法最好,完全切断了数学上的关联,只要是真随机,理论上就没法破。

    • 家园 觉得PKE这种除了偷懒不用拿钥匙外和RKE没有本质区别?

      而且还容易出现楼下说的那种,拿钥匙卡的忘了把钥匙给合法驾驶的人的情况,还有PKE这种从离开信号范围到锁门必然还有个时间差可以利用。

    • 家园 看到一则新闻

      有盗贼用网上购到的解码器轻松遥控破解了车主的防盗锁。

      • 家园 有许多防盗装置未必安全

        我这里提到的算是基本靠谱的厂家的解决方案。市面上存在些没考虑安全问题的产品一点也不奇怪。还有些自以为保密就是安全的厂家被轻易破解也不是什么罕见的事情。

    • 家园 这种中继攻击的方法可以开车门,但怎么把车开远?

      小偷可以把车打着,但是一旦开到远离车主100米时,车内就感受不到PKE信号,发动机就熄火了。除非在车主身上放一个收发器不停的跟车载信号对话。

      • 家园 这个漏洞的确很麻烦

        有的车不会熄火的,如果感应不到信号,仪表盘上会有提示的.但是不会熄火。我同事经常犯的错误,卡在身上,车是LP开,自己下车后忘了给卡,结果悲剧。

        • 家园 现在这个产品没有标准

          各家有各家的招,有些可能会好些,有些比较胡闹。

          • 家园 目前的安全评估分析,大多数厂家认为还是应该在

            ignition这个环节增加一次防盗验证,即插卡/钥匙时进行防盗验证

            不过呢,小偷能把车门打开就已经很惨了

            • 家园 我看的资料似乎外边的厂家都有这步

              PKE和RKE都在点火器上做了识别。不过PKE是非充能方式,RKE由于要插钥匙所以是充能方式,即车内电路用射频对钥匙进行充能激活识别电路。我觉得后者安全性比较高,因为这时能确保钥匙就在附近。PKE被中继攻击的问题在于距离识别被欺骗。或者厂家没想到会被欺骗。

              • 家园 我看是当时在开发阶段系统安全评估的时候没有想到

                会在距离识别上被欺骗,因为这样的手段已经和军用电子干扰手段类似了,或者说认为有这样的风险,但是可能性非常小(毕竟装备这么好的小偷也很少)

                哈哈,看来以后汽车行业的安全标准也要follow MIL-STD了哦

                • 家园 没那么神奇

                  这个手段对于一般的无线电爱好者来说不算太高级,离军用级别还差很远。

                  安全问题是一个综合问题,在模块化思路遍及整个工程界的时候,很容易就在意想不到的结合处出问题。因此安全评估需要跨行业的各种专家。在这个意义上我觉得目前汽车产品安全厂家对算法和设计保密是一个根本错误。

                  另外,技术发展很快导致一些假设很快会过时也是一个令人头疼的事情。

分页树展主题 · 全看 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河