前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >世界智能驾驶挑战赛信息安全组——新人扫盲

世界智能驾驶挑战赛信息安全组——新人扫盲

作者头像
ChaMd5安全团队
发布2018-03-29 12:05:23
7870
发布2018-03-29 12:05:23
举报
文章被收录于专栏:ChaMd5安全团队ChaMd5安全团队

0x00前言

感谢天津市人民政府与国家发展和改革委员会、科学技术部、工业和信息化部、国家互联网信息办公室、中国科学院、中国工程院、中国汽车技术研究中心、XCTF联赛组委会、永信至诚i春秋,我们ChaMd5的0xw分队的4个萌新,来到了风景迷人的天津梅江会展中心,参与“中国智能网联汽车信息安全破解挑战赛”。

(图中因计时器错误,实为4分22秒。)

0x01比赛前

在比赛前一天去天津的火车上整明白了这次比赛要干啥:

比赛将汽车的CAN总线牵出,通过特定的转接口将USB总线信号转为USB信号,连接到电脑上,在电脑上用主办方给定的软件分析捕获到的CAN总线数据包,在捕获的数据包中包含控制车门开启的CAN报文,重放找到的报文,就可以实现“破解”汽车的开门功能。

马上查了几个资料,阅读了一篇2011年的关于智能汽车破解的论文《汽车网络和控制单元探秘》(Adventures in Automotive Networks and Control Units)。上述工作让我了解了汽车的控制系统的基本结构:

首先,现在的汽车已经不仅仅是完成一系列机械、物理、化学过程的“铁疙瘩”,随着汽车的智能化,现在汽车的每一个部件,从轮胎到仪表盘,从油门到ABS系统,都由一个个的ECU(电子控制单元)控制。每个ECU都连接在一个符合CAN总线协议的总线上,每个ECU的功能是解析收到的CAN报文,控制汽车执行相应的命令。

其次,总线结构允许汽车能够较方便地扩展ECU组件,ECU之间通过总线连接,就不得不研究他们之间是如何通过总线通信的。通过论文阅读,了解到汽车内部CAN总线中通信的报文是没有原地址的,每一条报文由某个ECU在CAN总线上广播,每个ECU收到报文后,通过报文头的ID来判定是不是发给自己的,如果不是就丢弃;如果是就解析报文数据,执行相应的操作。

代码语言:javascript
复制
乍一看,这样的设计简直就是无视安全性的设计:
只要有人能够连接上汽车的CAN总线,就能监听到总线上的所有报文,
接下来只需要给我一辆车和一根CAN转USB的转接线,我就能通过不断重放CAN报文,观察汽车的反应
如果汽车对某条报文做出了相应的反应,那么记录这条报文对应的动作,以此类推,能够构建针对这类汽车的数据库,    
之后如果再碰到类似的车型,只要连上CAN总线,那就可以……直接开走了

其实转念想想,直接接触目标汽车的CAN总线的难度是较大的,毕竟首先你得用物理方法或者社工方法打开目标的车门,才能连接总线做接下来的操作;其次你的数据库是否适用目标车型也是一个问题,不过这种东西黑市上应该不少:);再次,有的复杂操作并不是通过一条报文来控制的,而是需要多条报文时序控制,这大大增加了报文逆向分析的难度;有的汽车还在报文中设置了类似TCP协议中的递增seq,来预防重放的报文;再再次,根据培训时讲师所说,有的汽车会在总线和OBD的接口中设置网关,控制从外部进入的报文,现在人们还在研究汽车内的加密通信……这样的话,在现实生活中想要像电影里演的那样随手黑掉一辆车还是有难度的。

当然独角兽团队演示了如何利用车载蓝牙模块黑进汽车的总线,通过信号分析的方式在和汽车没有物理接触的情况下控制了汽车的部分功能orz。。。。具体视频google一下。

综上可以得到阶段性结论:现在的汽车的安全性很大程度上依赖CAN总线的安全性。

用到的原理就这么多,现在讲讲比赛的过程以及遇到一些迷之问题和看起来挺牛逼的“4分22秒破解汽车”经历。

被告知本次比赛由于是预赛,难度不高,即比赛时直接用一个一拖五的线将车上的CAN总线连出(如下图),连接到参赛队伍的电脑上,且报文内容全为明文传输,不存在网关控制。每组四支队伍比赛,共24支队伍,取用时最少的前三支队伍(也就是24进3)进入决赛。

赛前和队友们讨论许久,考虑了控制开门的报文存在以下几种情况:

  1. 最简单的情况:只有一条报文控制开启车门,即控制车门开启的ECU芯片接受到发给自己的开门报文后执行开门的操作。这种情况下,只需要分辨出开门瞬间变化的、发给指定ID的报文,进行重放即可。
  2. 较复杂的情况:有多条时序报文控制开启车门。
  3. 最复杂的情况:有多条时序报文控制开启车门,且存在序列号检测机制。

观看了第一场比赛后(我们是第三场),具体的比赛流程如下:

比赛开始后即开始计时,前一分钟内,不对汽车做任何操作,即各队的准备阶段。

代码语言:javascript
复制
在这个阶段,各队可以通过记录汽车在静止状态下产生的“垃圾报文”,以便之后的过滤操作。
(也许这个阶段还可以有其他的操作?)

一分钟时,裁判小姐姐打开车门。

代码语言:javascript
复制
从这一刻开始,找到控制车门开启的报文的选手就可以通过手边的“抢答器”停止计时,由裁判重放找到的报文。
如果车门成功开启,则视为成绩有效,停止计时的时刻即为最终成绩;如果重放之后车门没有开启,则继续计时(没有罚时)

第一场比赛,第一二名的队伍分别用时1分03秒和1分04秒,也就是说,除了用于准备的一分钟,破解最快的只需要3秒……3秒……3秒……

但是同场竞技的另外两只队伍却花费了不少时间,一支用了十几分钟,另一支甚至用了半小时才成功。

这样的结果提供的信息量还是很大的,首先因为大家都是在对这辆车没有任何先验信息的情况下进行流量分析,所以不存在之前对类似车型逆向分析过的情况,这也就是说,重放的报文可以用3秒找出,必然不至于太复杂,很可能就只有一条(不是时序或者组合的控制报文);但是从另两只队伍用时过长可以看到这个比赛并没有那么简单,某处一定存在着一些坑。

主办方提供的软件可以记录发给某个ID的报文数据变化次数(以下称为ct)

0x02第一手策略——碰碰运气

先将收到的报文按照ct从大到小排序,我们猜想发给控制车门的ECU的报文应该在开关门的时候变化一到两次,所以我们可以在车门开启时就按下抢答键,然后挑出ct较小(为1或2)的报文进行重放(这样做的成功率从概率上还是蛮大的,但是后来的事实证明我们还是naive)

我们的第二手策略是先在准备的一分钟时间内保存之前出现过的报文(主办方软件提供了这个功能,可以将报文保存为.csv文件),将这一分钟内保存的报文和开启车门后保存的报文进行比对,丢掉重复的报文,剩下的理论上就是开车门的报文。

有限的时间内我们做了上述准备,写了python脚本来比对开门前后的csv文件(使用hash表)。

二场的结果公布,我们必须在17秒以内破解车门才有希望进决赛(29日还有第四场预赛)。

比赛时我们按照计划在第一时间按下“抢答器”,挑了这样一条报文进行重放:

0x02无效,执行B计划!

然而跑完脚本之后的输出文件里面还是有将近5000条报文(有可能是之前准备时间内捕获的报文量不够,因为由于担心错过开门时间,只抓了30秒的包),于是B计划也宣告失败。

但是我们没有放弃,四双眼睛盯着屏幕,在申请第二次开车门之后,一名队员肉眼看到了变化的报文,在4分22秒的时候,我们完成了破解。

这里做了一个gif,大家感受一下这名肉眼看到目标报文的dalao的牛逼……

主要关注ID为319的报文,在开门瞬间,这个报文的B3数据段由00变为80,这就是开车门的控制信号。

这个报文的ct从一分钟的准备时间开始就一直在缓慢增加,猜想是汽车对车门是否关严设置了定时质询,于是产生的缓慢增加的质询报文,而质询报文的种类可能不同,导致ct增加。这个报文和控制车门打开的报文的目标ID都是车门ECU的ID,所以会产生ct值并不是很小的1或者2……

第一次接触CAN总线的我们还是缺乏相关的经验和练习(毕竟比赛的时候是我们第一次实际操作汽车,之前都是纯粹的理论推测和猜想),不过汽车安全的确是信息安全领域内很有研究价值的课题,我正在翻译一篇关于汽车破解的论文(博客链接:http://blog.csdn.net/qq_29947311/article/details/73865629)


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ChaMd5安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00前言
  • 0x02第一手策略——碰碰运气
  • 0x02无效,执行B计划!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档