以下为速记全文:
首先介绍一下我们的实验室,小米智能终端安全实验室是小米旗下的一个安全团队,主要是做移动安全和车联网以及IoT安全相关的安全研究,然后赋能我们自己的产品,也就是说是小米隐私安全的守护者。在开始之前先看一下目录,我们本次会先从汽车网络架构开始讲,然后讲固件提取,都是一些比较实用的方法。还有控车目标应该怎么找?因为我们如果说要找一个目标的话,通俗点说是挑个软柿子捏,通过一些我们前期信息收集的方式来找到一些合理的目标。然后我们再找到相关突破口。至于突破口怎么找,就涉及到他们在开发过程中会在哪些地方出现什么问题。接着再会介绍一个控车案例,在Geekpwn2022中我们用的控车的一个漏洞。最后还有一些其他的漏洞成果。汽车网络架构现在我是把它粗略的分为两类,第一类就是燃油车架构,通过不同件它这个系统进行划分,比如说仪表盘,传统燃油车其实大部分都是QNX。然后我们的IVI它像一些比较老的车,它就是rtos这种,还有类似于T-box,它走的是移远Linux,基本上都用的这个。然后我们的网关也是rtos。其中因为老的车它车联网的通线其实并不多,所以都集中在T-box上来。然后再跟tsp进行通信,实现了以下4个功能:日志上传、PKI认证、远程控车和车辆位置监控。当然这只是展示了4个功能,另外还有好多。新能源车则是以高通平台为例,因为现在很多都说这个车我们是8155平台,我们是骁龙的平台。骁龙平台的特点就是这个样子,我们主要把它分为了三层。首先第一层应用层,主要跟APP相关,一些是OEM集成的APP,还有一些是他们自主研发的。传输层则是各种协议上的一些东西,包括DDS协议也是算在里面的。然后最底层就是这些系统。我们把它跟燃油车做对比,因为你要对不同系统不同件之间进行渗透,所以你首先要把它分类给搞好,比如说我们新能源车,像 ivi和这个仪表其实还是qnx,但是像现在新能源的话,它有的也是走的是安卓,然后我们的网关走的就是一个嵌入式系统了。然后我们的诊断协议uds,我们的ADAS用的英伟达的方案,基本上都是Ubuntu这样的。然后我们的T-box其实还是移远的Linux。我们看新能源车这么多年发展,为了汽车系统稳定性,它保留了很多相关的系统,但是为了先进性也做了一些变化。我们可以看一下这两个的架构对比,首先IVI的区别是比较大的了。这是因为一个是QNX,它这个系统比较的老旧,后来用了QNX虚拟机开的一个安卓,通过这种方式,娱乐系统就更像我们的手机、我们的平板电脑。仪表区别就在于一个是QNX或者一个是QNX安卓,T-box其实都是一样的。然后网关又做了一些区别,传统走的都是UsbCan,现在我们都是以Doip为主的诊断协议了,都是通过TCP去做诊断了。ADAS的话传统车都没有,新能源走的英伟达,Ubuntu。我们了解完这些之后,接着看一下是如何做到 固件提取的,因为我们要分析一个东西,它一定得是拿到代码才能分析,不然分析不了。这里我做了一些归类,针对这几个大件进行归类。IVI比较特殊,它可以通过我们开ADB的方式,通过工程模式进行提取。剩下的我们有个更通用的方法就是通过热风枪吹取我们相关的flash,再通过底座的方式进行读取,就是通过编程器来进行读取,这是通杀的。因为它不会像我们手机一样,手机它可能会有一些关键的分区做一些加密,汽车没有,它不做加密的。所以我们只要一提它就能出来,百分百好使,固件百分百能拿到,只要你能拿到件,然后通过引脚定义,我们在非线通过调试进行提,这个其实也是拿到固件才能做的事。剩下两个实际上是通过漏洞的方式进行提取的,比如说我们车机热点其实基本上都是IVI开出来的,但是上外网是通过T-box上的,所以说ivi如果没有做网段隔离,我们通过这种集成商的,比如说移远他是通过口令,有的车企他不会改的,它用的通用口令。我们进去之后,就可以进到车的SSH里面,然后再进行一个提取,剩下提取就无所谓了,因为都进去了,怎么着都能给他提了。然后我们还有一个方式,就是吹flash之外,他可能做了一定的隔离,但又没做这么全,所以说它IVI跟T-box是可以通信的,我们以T-box为跳板,通过这种方式再去提。实际上它就是没有做好各个域之间的隔离,导致的问题就是,我们不需要通过物理提取的方式进行提取了。我们平常研究的时候,这是某个件,然后我们通过找条串口,进到shell里。还有像这种,我们通过读EMMC的方式,再放到编程器进行读取。当然现在有些比较新的,大家搞车的可能一下就能看出来拆的是啥,就是移远的一个模块。它的存储不太一样,它是emcp,支持emcp的编程器还是不太好找的,所以说这块的话还是需要有一定的这种特殊的设备才能进行获取。这个图里是我们平常用的一个比较好使的编程器,如果大家想知道是什么的话,我们可以私下交流一下。我们刚才讲到,供应商的口令,这里直接给大家展示出来,移远的EC20,做物联网的会比较熟悉,很多物联网的件也都是用的EC20,它的入口令,用的移远123。然后就是a335车规级的,车规级一般就是这个密码。当然随着现在对抗的不断加深,这种密码已经修了好多了,现在也不太好找了,直到去年还是非常好用的一个方法。那么我想研究一款车,这目标怎么找?我怎么知道哪个车容易,它安全问题比较多,哪个车难打,是吧?第一点,我们在信息收集阶段,就看这个品牌他有没有信息安全团队,要看他招聘,招聘你要从多个角度去看,例如boss直聘、他们官方的招聘等。如果一方面没有渗透测试人员,一方面又没有安全开发人员,这个车企就很危险了,它就很可能有安全问题。第二点就是该品牌供应商为几家,这几家供应商供应几家车厂,这为的是打供应链。我们汽车是一个非常复杂的体系,最后下来的整车架构,一个供应商他会供好几家车企,所以说如果供应商能打开突破口,其实很多车都会出现问题。第三点是对前两点的一个小总结,就是说我们通过这几点判断,车企他到底重不重视安全,这就是我们选目标的时候的思考角度,这是比较好使的。我们现在确立好目标之后,怎么找突破口?这个时候就要分析攻击面,怎么分析?这里我也总结了几点,叫一远四近,就是一个远程无接触,4个近场,最后通过他的D-bus或DDS进行控车。首先是远程无接触,其实翻译一下就是打云;第二个近场蓝牙,那就是打蓝牙。我们看一下这几个,如果它没有 WiFi密码,出厂随机数可以被爆破的问题,其实 WiFi是不好打的。近场伪基站的话,我可以把信号接到伪基站上,然后再通过它暴露的端口进行攻击。这个蓝牙也不好搞,蓝牙的话你还得分析它的认证等,我们在短时间内也很难去攻破这辆汽车。所以说最简单的方式第一下直接就瞄准远程无接触,因为它的利用稳定,还有就是说它的漏洞,如果出现比较低级的一些问题,往往能导致这个车直接被控了。最简单的就是云端越权就可以直接控车了。我们一会那个案例也会以远程无接触进行展开。那么车企为什么会出现这种问题,就是说开发他老写出一堆乱七八糟的代码是吧?我们现在可以看一下为什么会出现这个问题。首先我们从软件开发的角度看,这两个阶段,一个是设计阶段,一个是编码阶段。设计阶段其实往往都做的比较安全,就是说你再不济,你做合规的东西,这个文档它也给你列的明明白白是吧?说我们这个架构怎么搞,然后我们这个架构经过多次评审了,经过多次的调研论证了,所以说从架构角度出发,从设计角度出发,其实一般这么多人过来,他确实很难出问题。但一到这个代码阶段,到研发人员阶段,事态就不可控了,我们无法保证100%落地,我们的设计文档一定会有相关的折扣,这也是我们分析安全漏洞的一个方法,就是说没有不可攻破的设备,就是说就算你百分百落实了,他确实很难搞,但是你在这个编码阶段一旦出现问题,就跟设计阶段就没有关系了。所以说在编码阶段,我们研发人员往往是因为赶着项目上线,他有压力,得赶紧把功能实现,就会忽视掉一些问题。还有就是研发人员他本身安全意识就不高,他没有这个底子,包括他们的整个研发团队,只注重功能,不注重安全。第三个也是一个小总结,就是说我们打折扣完成这个事。我们主要说它为什么还是会出漏洞,是在这个阶段出的。这里我讲一下我们的一个控车案例,这个是一个mqtt的问题,其实mqtt如果我们做得很安全,每一步都都做好了相关的防控制和各种的限制,它确实很难攻破,但我们分析了这么多车辆下来,能做到完美无瑕的往往不多。这有两张图,其中一个我们可以看出它是泄露了一些信息,什么京、车牌号、token。另张图更像一个二进制的数据。我们底下这段文字就是说,供应商的mqtt方案供5个车场,abcde我们如果想要控a车,但是这个a车它并不是很好突破,我们没什么办法,我们这时候就去调研b车,发现他的APP居然存了a车的 mqtts的TLS证书,这乐子就大了是吧?我们通过这个方式,就可以直接接入a车的mqtt了。再利用这个问题,我们就可以通过a系车来控其他 a系车了。所以总结一下就是多点收集,一点爆破,通过这个方式就直接把整条链路给打穿了。接着看一下,我们既然能连上去,我们就看一下他二进制数据到底是什么样的一个协议解析,也是需要我们脱下来固件去看的。我们看一下整串数字 header vin,这些里面我们要关注于 message ID、server type和message type。第二个是标明我这个包是第几个包,然后server type和message type重点是什么?就是说我们数据包到底是控车的服务,还是其他的数据,当然它这个包它有很多的数据,它不止这一个控车数据它有好多其他功能的,在逆向过程中我们只关注控车数据。这个协议报文它其中也有坑,什么坑?这里分析其他数据,就发现它有710这个数据,因为标志位它其实是通过71037104这种来进行分割的,然后我们看到这段数据包发现最右边有个7f和y和FC,当然这个东西在代码里它会进行一个计算,就说他会把它用and算一下,算成0x7c,为什么要这么算?做过协议开发的可能知道,如果你0x7c是另外一个数据包的关键的标志位的话,它是需要做转移的,因为它怕7c和其他的7c代表的意思重了,所以说他会做一次标志位的转译。当然这个包是第一段包,第二段包跟它是合一起的,但因为这个包太大了,所以我放不下。大家看到if后面之后就是包了77107的包,我们不关注0820什么东西,当然拟出来东西已经都标出来了,我们只需要关注加密后的数据,当然加密后的数据是另外一个问题,他通过AES加密之后,他居然把密钥明文存储在了固件,这个数据控车包就完全可以解开了。我们现在做合规,但这个东西是为了做合规而做合规,反而出现了一些安全问题,你把密钥存里面,拿到固件了,这密钥还是能解开。好,然后我们解开之后就是关键了, type 711这个type,我们通过这个on和off来控制你车门是关还是开,然后再有一个时间戳和支持的长度,所以说我们已经控了数据包,这个数据包要通过mqtt进行发送,那个车就已经可以被我们成功解锁了。然后还有个问题,有时候我们会发现mqtt的服务,它不一定在公网上体现,它可能在私网里出现,为什么?就是说可能有一些他们也是为了安全上的要求,就是说我 tsp它只允许在私网中进行出现,我们怎么突破私网的限制?因为是在他运营商的大内网里,这时候就通过淘宝登场,我们找这种贴片天线,14块钱就帮你突破了。闲鱼上买到的台架,接上这根线,就可以用车的网了,我们再跟车的WiFi进行连接,通过这个方式上网就可以直接进到车的内网了。如果这个车与车之间还不做隔离的话,这个问题就更严重了。然后我们再看一下配件中泄露的地址,这个是什么意思?就是在逆向任务中发现说,我逆这个地址,因为它很多是c++写的,看着很难受,最快速的方法就是它大部分可能是放在DB文件里了,我们直接数据库文件里找相关mqtt的东西,就可以帮你去减轻了逆向的烦恼。所以说这里尤其是看看 Bypass和 server,一个我们可以猜出来它 bypass绕过私网限制的一个IP地址,然后IP address就是我们纯汽车内网的一个地址。当然这个是两个都给了,像 IP
channel是它的地址,这个东西它又只给了私网地址,不同车企它对于要不要在网上设立一条链路还是有区分。我们拿到配件地址之后就是泄露证书,这个证书为什么只写了这张图?因为太敏感了,至于怎么分析的,这里给大家一个方法就是动态调试或者静态分析。因为绝大多数他在做提取的时候,做密钥存储的时候,我见过比较安全的车企,它喜欢把它存t一里。但是没用,为什么没用?因为你终究是要用密钥的,只要我获得了你汽车的shell,我就可以动态调试,我在内存中就把你这个证书给拽出来了,所以说做双向校验,如果光通过mqtt的账号密码和证书其实是不安全的。这里是整个的控车的示意图,我们分两侧,一个是用户侧,一个是供给侧,用户侧我们会发起相关的一个控车指令,然后请求到集群,再下发到mqtt控制指令,此时我们通过这种订阅的方式窃取这辆车的这个指令,并且进行一个解析,获取到数据包之后,再通过这种方式连接到我们的 mqtt的服务里,然后我们就伪装成这辆车给其他车发。为什么让这辆车,因为有的车企他有做client id的限制,就是说它会通过can ID来标注,就是说你client ID是云平台认证过后的,才可以接入我们的 MQTT服务,所以我们就需要顶掉一辆车的MQTT,或者它不启动的情况下,通过 ID去给别人发,这样我们就可以完成了这一条利用链了。接下来讲一下我们一些车辆的其他的一些问题。搞过手机都知道,你这个APP都需要厂商的签名的,你不签名是个公开签名,那可以干什么呢?早在之前我们都认为你在应用商店下的东西理论上是不可靠的,当然车企上的应用它很多也是用第三方的应用,这当然也有。就是说只允许是他们承认的 App,比如这四五个APP才能在上面用,但是如果我们没有做任何签名的话,就直接上去用。这种我们可以直接获取到了,比如说这个 APP它是个恶意APP,我们就可以直接通过公开签名,我们也签公开签名,拿到一个比较高的权限,对你的车做出一些不好的事情。就是你下这个APP你就出问题了。我们刚才讲的是mqtt它认证可不可靠,最安全的存tee里,但是我们的密钥是不能出tee的。如果研发和性能允许的话,把整套逻辑都放在tee里去运行,但一般来讲对研发来讲这都是不可接受的。然后还有类似于这种T-box的一个本地提权是怎么回事呢?我们看一下这个图,从这边开始这个是read,我们cmd传入一个值,这是我们用户可控的。然后通过这个方式,然后我们到 switch case,通过这个方式它会传出一个case,case之后会执行到 system的一个命令执行,当然我们这可以看到偏移67,所以说只要我们传入一个相应的偏移,然后再将case的值置为42,后面跟上我的命令就注了。这个洞有什么用?因为有时候我们进到ivi里面,它是个shell权限,我们拿不到root,拿root的方式一般来讲,要么就搞安卓本身的一些提权,要么就搞这种,这个是监听在一个1270.0.1的服务,我们在本地进行这种方式进行注入,给本地发,就可以造成命令执行了。命令执行通过这个方式,我们就可以完成了一个提取权,当然他这个问题比较大,没有做任何的安全上的考虑,他不止一个case有system,他们执行好几个case都有这个问题。还有问题就是运营商的这个网段它不隔离,刚才在私网中提了一点,我们通过a车T-box网络攻击其他车,同时b车与a车在一个运营商网站就可以通过a车打入b车。什么意思?就是说你运营商他在做私网地址的规划的时候,他可能把两辆车规划在一个网里,如果我们能进入到这个车的网,其他车的网我们也就通了。之前是扫描c段的时候充分验证了,所以说这个东西要配合一些漏洞打。就是这个,之前挖过的一个漏洞,未授权的一个远程重启,他是通过自己的协议去发一个二进制的数据包,然后通过这个方式我们可以去打一个DOS,怎么打?如果你做了隔离这个问题就仅仅只限于这一个车了,但是如果没做隔离的话,当时扫了整个c段下来,几千台车都可以通过这个方式打,几千台在线车,都会从这个方式去打,并且端口都是开放的,直接可以打DOS了。还有这个车域之间它不隔离,也是我们刚才讲挖提取空间的时候,我们ivi它连上WiFi之后,它如果不做隔离你都通上了,那是不正确的,就是说每一个都不能互相通信,要做好车的私网划分。好,还有我们的工程模式,其实工程模式怎么获取一直是个比较讲究的问题。我们去渗透一辆车,如果拿不到工程模式,我们连他的shell都开不开,更不要说这种整车渗透了,所以说我们首要的目的就一定是要开它的工程模式,ADB怎么开?每个研发方案不一样。其中就可以给大家讲两个,一个是还有有些车它这个车是插U盘启动,当然它这个插U盘起不太一样,准确来讲都不能说插U盘了,它是检测你硬件设备的弯道ID和product
ID,只要符合0529或者然后001003就可以开工程模式,它一检测就给你开了。当然还有一种也是通过U盘,但是他把密钥写进了我们的文件里,在通过插入之后检测到这个文件,说它可以写ADB了,然后就可以起来了。有好几种方式,现在因为更安全了,就会有些更新奇的方式,这里不太方便讲。一开始也提到过云端平行越权,比如说有一个用户小王他买了个车,结果小王是个搞渗透的,说我每次请求的时候我有一个token,然后小王就从这个token,请求的时候,把vin的换成别的车,发现我也能控其他车,大概就这个意思——通过token就越权控了该品牌下的其他车了。这个问题现在分析下来,这个问题存在不存在,跟车企有没有钱做安全是完全正相关的,基本上不招安全的,都有这个问题。最后讲一下27认证的问题,27认证其实大家都知道,27服务请求一个seed,然后他会给我们回一个seed。我们再通过 seed算出一个key,当然这个key怎么算每个车型不一样,他算出这个key之后再把 key发回去,然后ecu做一下对比,说我们key1、key2相同,我允许你解锁,这就是个27认证的过程。我们可以做一些ecu的升级,或者说获取到一些固件。甚至他可能藏了后门,我们通过这种方式解锁之后,可以通过这个方式把车的SSH服务打开。其实讲了这么多,最后还是想说一句话,就是我们做汽车渗透的人员讲究的是跟车企的一个双向奔赴,一个是车企方面对汽车安全人员要有一定的宽容,然后我们也要做出相应的回报给车企,才能共建我们车联网安全的一个进步。谢谢大家。*峰会议题PPT及回放视频已上传至【看雪课程】https://www.kanxue.com/book-leaflet-171.htm
PPT及回放视频对【未购票者收费】;
【已购票的参会人员免费】:我方已通过短信将“兑换码”发至手机,按提示兑换即可~
《看雪2023 SDC》
看雪安全开发者峰会(Security Development Conference,简称SDC)由拥有23年悠久历史的顶尖安全技术综合网站——看雪主办,面向开发者、安全人员及高端技术从业人员,是国内开发者与安全人才的年度盛事。自2017年七月份开始举办第一届峰会以来,SDC始终秉持“技术与干货”的原则,致力于建立一个多领域、多维度的高端安全交流平台,推动互联网安全行业的快速成长。
文章来源: https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458530012&idx=1&sn=09e1b4c794f602b409ff64074557bf76&chksm=b18d005686fa89409d799b96835ae97bd5d1ff010e89e9e2d4aa94a8e9f36b0dbe55f9f2c6c6&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh