唐朝实验室 · 2015/11/25 15:34git
Author: Dr. Charlie Miller ([email protected]) Chris Valasek ([email protected])github
唐朝实验室翻译组:朱于涛 刘家志web
汽车安全研究一直是大众消费者很是感兴趣的一个话题,由于汽车已经走入了寻常百姓家,并且咱们也明白一旦攻击者能够任意的操控咱们的汽车,那么咱们的行车安全就会受到极大的威胁。很大程度上,汽车安全研究是从2010年开始的。当时,华盛顿大学和加州大学圣地亚哥分校的研究人员称,若是他们可以将某些信息注入到车辆的CAN总线中,他们就能够操控车辆的一些物理状态(推测的测试车型是2009年的雪佛兰迈锐宝),好比控制仪表盘上的显示速度,关闭引擎或影响刹车性能。虽然此次研究颇有意思,可是也遭到了大众的普遍批评,由于他们认为攻击者在没法近距离接触到车辆的状况下,是没有办法向汽车中注入此类信息的,不过,若是攻击者能近距离接触到目标车辆,他们能够直接切断某条线路,或执行其余的一些物理攻击就足够了。算法
第二年,这个研究小组证实了本身在2010年时提出的论断,实现了这种远程攻击方案。他们演示了三种不一样的途径来讲明如何在汽车上执行代码,分别是经过收音机的mp3解析器,蓝牙栈和卫星通信系统。一旦代码能在汽车上运行了,他们接下来就能够注入CAN信息,从而影响车辆的物理系统。这次远程攻击研究颇具开创性,由于这一研究证实了,不仅是当地的汽车,而是全国范围内的汽车都存在安全漏洞。不过,在这两次的研究报告中都没有具体地列出这些攻击方法是如何实现的,也没有记录测试车辆的型号。编程
不久以后,DARPA受权咱们研发一个能协助汽车研究进行的工具库,下降新研究员进入这一领域的门槛。随后,咱们发布了这些工具并演示了几种针对两款老车型的物理攻击方法,测试的车辆分别是2010年的福特翼虎和2010年的丰田普锐斯。如今,这一套工具已经成为了众多研究人员的优选,甚至美国国家公路交通安全管理局也在使用这套工具来进行车辆测试。json
在咱们2012年的研究中,考虑到学术研究者先前发布的一些材料,咱们假定远程入侵是可行的。因此,咱们假设能够经过一种可靠的方式将CAN息注入到汽车总线中。除了公布这些工具,咱们还放出了在攻击中使用的CAN信息,借此来鼓励更多的研究人员参与到汽车研究中。另外,咱们的主要贡献还包括证实了如何经过CAN信息来控制方向盘的转向。这种控制能实现的缘由在于汽车功能的发展,从首次研究至今,如今的汽车已经具有了一些相似自动平行泊车和车道维持辅助系统的功能,而这些功能的实现都是经过接收CAN总线发出的ECU操做命令完成的。因此,由此证实了,随着汽车上新技术的引入,新型的攻击方式也在成为可能。安全
汽车产业对此回应称,由于咱们能接触到目标车辆,向车辆的总线中注入CAN信息,因此才能实现这些攻击。例如,丰田就发表声明称“整个汽车产业以及咱们的工做焦点就是防止车辆之外的无线设备实现远程入侵。咱们认为咱们的系统是强大且安全的。”服务器
2013年,DARPA再次受权咱们研发一个平台来帮助研究员在不须要购买测试车辆的前提下进行汽车安全研究。此次的重点仍是在于下降汽车研究的成本和难度,尤为对于那些有传统计算机安全背景的研究人员。网络
2014年,为了更具普适性,而不是仅限于当时的3种车型(2009年雪佛兰迈锐宝,2010年福特翼虎,2010年丰田普锐斯),咱们收集了大量关于汽车结构的数据,尝试从更高层级上判断哪些车辆会给攻击者形成最大的障碍。咱们首先评估了攻击平面,从获取CAN信息,到获取关键的安全性ECU,最后经过ECU来采起一些物理操做。最终,咱们发现2014年的吉普切诺和另外两款车综合了这两种攻击途径,而且车辆的结构简单,具有大量的高级物理功能,因此这几款车很是适合咱们进行研究。数据结构
咱们采购了一台2014年的吉普切诺来进行研究,由于像学术研究者同样,咱们很想证实先前在福特和丰田汽车上应用的攻击方法也能够远程实现。由于汽车制造商在咱们发布了研究报告后仍是那么的自信,因此咱们想要证实在原装车上,远程攻击仍然是可行的,以此来鼓励全部人都重视这一威胁。在本文中,咱们远程攻击了一台原装的2014年款吉普切诺和相似的车辆来获取对车辆的物理控制。咱们要经过此次研究,将详细的研究信息传递给安全研究员、汽车制造商、供应商和消费者,但愿未来生产的汽车能更安全。
咱们选择2014款吉普切诺是由于这款车给咱们提供了最佳的机会来证实,一旦远程入侵成功,攻击者就能够经过发送信息,侵入驾驶员的隐私,代替攻击者执行一些物理操做。正如咱们在先前研究中就指出的,对于攻击者来讲,这款车的攻击障碍更少。可是,这并不表明其余制造商生产的汽车就是没法入侵的或是更安全的,只是说,咱们认为这款车是适合咱们的研究对象。更重要是,在咱们的预算限制中,只有这款车能提供咱们想要的技术功能。
这台2014款吉普切诺的架构很是吸引咱们,由于这款车的头单元(无线电广播)链接到了车辆上实现的两条CAN总线。
图-2014年款吉普切诺的结构图
咱们猜想,若是能入侵汽车上的无线电模块,咱们就能访问CAN-IHS和CAN-C网络上的ECU,也就是说,咱们能够把信息发送到全部的ECU上,而这些ECU控制着车辆的各类物理特性。在后面你会看到,咱们在入侵了头单元后,并没能直接访问到CAN总线,因此,还须要接下来的漏洞利用阶段(Exploitation Stage)。有这样的说法,CAN总线中不存在架构限制,好比,控制转向的是独立的总线。若是咱们能够从头单元中发送信息,那么信息就能传递到CAN总线上的每个ECU。
在这一部分中,咱们介绍了2014款吉普切诺使用的驾驶协助系统。咱们对这些技术很是感兴趣,由于在此前的攻击中,咱们就是利用了相似的系统才获取了对车辆的物理控制。虽然,咱们也相信这些技术进步保证了驾驶员和乘客的安全,可是,不能否认的是,攻击者也会利用这些系统做为控制车辆的途径。
2014年款的吉普切诺配备了自适应巡航控制系统(ACC),这项技术可以协助驾驶员与前车保持合适的距离。实际上,若是启用了巡航控制,当前车减速时,车辆就会适当的刹车以免与前车发生碰撞,当道路上的障碍移除或进入安全距离后,车辆就会恢复到正常的巡航控制速度。若是前车中止前行,ACC模块也能够控制驾驶车辆中止前行。
与ACC相似,前向碰撞警告系统+(FCW+)会防止车辆与前方物体发生碰撞。可是,不一样于ACC,除非特地关闭,FCW+是一直开启的,在遇到突发状况时,系统会协助驾驶员刹车。例如,若是驾驶员正在看手机,而没有注意前方的道路,而且前方车辆忽然刹车了,FCW+就会发出声音警报,并代替驾驶员刹车。
图-FCW+
车道偏离警告系统(LDW+)这项功能是为了保证驾驶员在高速公路上的驾驶安全。LDW+在启用时会检查行车线路(道路上的油漆线),判断车辆是否乱线,从而避免碰撞或更严重的事故。若是系统检测到车辆正在偏离当前的线路,系统就会调整方向盘以保持在当前线路上形式。
图-LDW+
近期,最新的泊车辅助功能(PAM)也加入到了普通车辆上。泊车辅助系统(PAM)能帮助驾驶员完成停车操做,在多数状况下不须要驾驶员出力,好比平行停车,倒车停车等。咱们认为以此为切入点,是控制车辆方向盘的最简单方法,而且咱们已经证实了利用这项技术,只须要经过CAN信息就能控制车辆在高速行驶中的转向。在后面你会发现,PAM技术和模块在咱们的研究中发挥了关键做用。
图-使用中的PAM系统显示
在下表中,咱们列出了攻击者可能选择的一些切入点。不少人在看到这些项目时想到的都是各类技术术语,可是对于攻击者来讲,每项与外界交互的技术都是一个潜在的攻击切入点。
如今,在不少汽车的点火钥匙中都植入了一个小芯片,与车辆上的传感器通信。对于吉普切诺这款车来讲,其传感器直接经过线路链接到了射频中心模块上(RFHM)。当按下点火开关时,板载计算机就会发出一个射频(RF)信号,钥匙中的射频器就能够接受这个信号。而后钥匙中的射频器会返回一个惟一的射频信号到车上的计算机,计算机在肯定信号后,就会启动并运行汽车,整个过程不超过1秒。若是板载计算机没有接收到正确的识别代码,某些组件,好比油泵,启动器就不会运行。
从远程攻击的角度看,这个攻击平面太窄了。惟一的数据传输(而且是由IC上的软件处理)就是识别码和射频信号。很难想象这个识别代码中会存在可利用的漏洞,即便是有,你也必需要接近传感器,由于传感器在设计上就只能接收附近的信号。
图-显示没有检测到钥匙
在汽车上,每一个轮胎都有一个胎压传感器,会时刻测量胎压并把实时数据传输给ECU。在吉普切诺上,接收传感器经过线路链接到了RFHM上。这里使用的无线电信号是专利性的,可是,已经有人对TPMS系统进行了研究并调查了这个系统的安全性。
几乎能够肯定的是,经过采起一些操做是能够攻击TPMS系统的,好比让车辆误觉得轮胎或TPMS系统出现了问题。另外,研究人员还证实了在有些状况下,是能够形成相关的ECU崩溃或变砖。考虑到代码执行的可能性,这个攻击平面也很窄。可是,既然ECU能远程变砖,这仍是说明其数据处理方式不够安全,因此这类攻击仍是可行的。
图-2014年款吉普切诺的TPMS系统显示界面
电子钥匙,也就是遥控门锁中有一个短距离的无线电传输装置,能够与车辆上的ECU通信。这个无线电传输器会发送包含有身份信息的数据,而后ECU会判断这个秘钥是否是有效的,从而决定随后的上锁、解锁和启动引擎等指令。在吉普基诺这款车中,负责接收这个信息的仍是RFHM。
鉴于远程代码执行,这种攻击平面很窄。由于,RHFM中必定有专门的固件来负责处理射频信号,加密/解密代码和识别电子钥匙数据的逻辑以及编程备用电子钥匙的逻辑。虽然这是一种可能的攻击途径,可是要想在RKE中找到漏洞来实现远程代码执行彷佛是不可能的。
图-2014年款吉普切诺的电子钥匙
大多数汽车都可以经过蓝牙来同步设备。也就是说ECU有处理复杂远程信号的能力。在吉普切诺上,蓝牙是经过无线电广播(头单元)接收和处理的。这样汽车就能够访问手机上的通信录,经过手机打电话,听音乐,发信息以及其余功能。
不一样于现有的其余信号,蓝牙栈很庞大,同时也存在着大量的攻击漏洞,因此攻击平面很大。通常来讲,涉及到蓝牙栈的攻击方案有两种。第一种是利用未配对的设备。这种攻击的危险程度是最高的,由于攻击者能够获取到设备的代码。第二种利用方法是在配对完成后,由于涉及到了用户交互,因此威胁性没有那么大。曾经就有研究人员演示了如何利用蓝牙接口来入侵一辆汽车。Codenomicon的研究人员还发现,汽车中经常使用的蓝牙接收器有不少崩溃的状况。
图-2014年款吉普切诺的蓝牙面板
无线电广播不只仅能够接收声音信号,也能够接收数据。在吉普切诺上,无线电广播能够接收多种远程输入,好比GPS,AM/FM广播和卫星电台。在多数状况下,这些信号都会简单的转换成音频输出,数据解析的数量也不大,这就说明其中不太可能有能够利用的漏洞。可是,例外就是无线电数据系统中用于发送数据和FM模拟信号(或卫星电台)的数据。用户能够感知到包括当电台播报的电台名称和正在播放的歌曲名称,在这时,数据必需要通过解析和显示,这样就为安全漏洞创造了空间。
图-2014年款吉普切诺的无线电广播数据面板
有些汽车还提供了蜂窝数据上网功能,实际上,这些汽车是经过Wi-Fi热点的方式来为乘客提供网络链接。在吉普切诺上,这是一个根据使用状况购买的功能,好比按天或按月购买。咱们观察到即便是不了解汽车系统的人也能够访问这个Wi-Fi系统。虽然Wi-Fi安全评估方法已经存在了好多年,可是近年来,数据点入侵攻击仍是常常发生。
图-2014年款吉普切诺的Wi-Fi面板
现在的许多汽车都配备了蜂窝广播功能,通常是叫作车载通信系统,用于将车辆链接到数据网络,例如,通用汽车使用的昂斯达系统。蜂窝技术也能够用于接收数据,好比交通或天气信息。
这一功能就像是汽车攻击业的圣杯,由于,只要目标汽车上有蜂窝通信,那么能够攻击的范围实在是太广了。即便车载通信单元不直接驻存到CAN总线上,这个通信单元仍然能够经过麦克风向其余位置远程传输数据/声音。有的研究人员此前就远程利用过汽车上的通信单元,而且尚未涉及用户交互。在吉普切诺上,全部的这些功能都是由无线电控制的,而这个无线电广播又驻存在了CAN-IHS总线和CAN-C总线这二者之上。
在2014年的吉普切诺上,其通信系统、网络、无线电广播和Apps都在出厂时绑定到了哈曼Uconnect 系统上。接下来咱们会详细地介绍这个Uconnect系统,可是咱们想要指出,全部与“信息娱乐”系统相关的功能都是物理集成在一个单元上。
2014年款的吉普雷诺使用了由哈曼卡顿生产的Uconnect 8.4AN/RA4 无线电广播系统,而且哈曼卡顿是吉普汽车的惟一供应商,负责提供信息娱乐系统、Wi-Fi链接、导航、app和蜂窝通信。大多数的功能都是集成在一块德州仪器芯片上的OMAP-DM3730系统中,这是汽车上常用的一个系统。菲亚特克莱斯勒汽车的不少不一样车型也都使用了哈曼Uconnect系统,包括克莱斯勒、道奇、吉普和Ram。固然,其余品牌的汽车也有的使用了Uconnect系统。
Uconnect头单元中一样包含有微控制器和软件,容许经过控制器局域网-高速(CAN-IHS)数据总线与车辆上的其余电子模块通信。在配备了Uconnect Access系统的汽车上,系统还会经过CAN-C数据总线,使用电子信息与汽车上的其余电子模块通信。
不只仅是吉普切诺这款车配备了哈曼Ucoonect系统,这个系统在克莱斯勒-菲亚特系列的汽车上也很常见,甚至还出如今了法拉利加利福尼亚这款车上。这就意味着,虽然咱们是以2014年款的吉普切诺为例,可是,只要是安装了Uconnect系统的汽车,这里提到的漏洞和信息都是适用的。因此说,在道路上,有漏洞的汽车数量至关庞大。
2014年款吉普切诺上使用的Ucoonect系统运行的是QNX操做系统,使用了一个32位ARM架构的处理器。这基本上就是汽车信息娱乐系统的标配。若是Uconnect系统不可用的话,大部分的测试和检查均可以在QNX虚拟机上完成,可是,系统很显然配备了一个工做单元能帮助到咱们的应用研究。
# pidin info
CPU:ARM Release:6.5.0 FreeMem:91Mb/512Mb BootTime:Jul 30 21:45:38 2014
Processes: 107, Threads: 739
Processor1: 1094697090 Cortex A8 800MHz FPU
复制代码
除了虚拟的QNX系统,用于更新和重装操做系统的ISO数据包也能够很容易地从网上下载到。在获取了这个ISO文件后,咱们调查了其目录结构和文件系统。咱们研究发现,有不少研究方法均可以在没有测试车辆,没有Ucoonect系统或QNX虚拟机的前提下完成,好比,逆向二进制文件。
咱们的Uconnect单元使用了NAND flash,这个flash中包含有几个不一样的文件系统,各自发挥着不一样的做用。下面列出的是咱们感兴趣的一些文件系统和须要额外研究的部分。在接下来,咱们还会讨论这些部分。要想获取更多关于QNX镜像的信息,请参考他们的说明文档。
如上所述,IFS用于放置系统二进制,以及在Uconnect头单元上运行QNX操做系统所须要的配置文件。咱们从克莱斯勒汽车上获取了一个ISO文件,经过观察其文件系统来判断哪些文件会在更新过程当中受到影响。例如,在解压了ISO后,咱们检查了主目录中的’manifest
’,发现了IFS位于一个‘ifs-cmc.bin
’文件中。
ifs =
{
name = "ifs installer.",
installer = "ifs",
data = "ifs-cmc.bin",
},
复制代码
若是咱们想要在没有Ucoonect系统的状况下查看IFS,‘swdl.bin
’须要挂载到QNX虚拟机中,由于这不是一个标准的IFS镜像。这里面包括了更新须要的全部系统可执行文件。‘swdl.bin
’文件能够在‘swdl/usr/share
’ 目录中找到。
例如,若是要转储QNX上(在咱们的例子中,是QNX虚拟机)的IFS,你能够运行下面的命令:
memifs2 -q -d /fs/usb0/usr/share/swdl.bin /
复制代码
运行结果是检查一个挂载为只读的根目录(“/”)。经过发出‘dumpifs
’命令,这个文件系统能够彻底迭代。咱们从ISO更新文件中转储了IFS,下面就是输出结果。
Offset Size Name
0 8 *.boot
8 100 Startup-header flags1=0x9 flags2=0 paddr_bias=0
108 22008 startup.*
22110 5c Image-header mountpoint=/
2216c cdc Image-directory
---- ---- Root-dirent
23000 8a000 proc/boot/procnto-instr
ad000 325c proc/boot/.script
---- 3 bin/sh -> ksh
---- 9 dev/console -> /dev/ser3
---- a tmp -> /dev/shmem
---- 10 usr/var -> /fs/etfs/usr/var
---- 16 HBpersistence -> /fs/etfs/usr/var/trace
---- a var/run -> /dev/shmem
---- a var/lock -> /dev/shmem
---- a var/log/ppp -> /dev/shmem
---- 15 opt/sys/bin/pppd -> /fs/mmc0/app/bin/pppd
---- 15 opt/sys/bin/chat -> /fs/mmc0/app/bin/chat
---- 18 bin/netstat -> /fs/mmc0/app/bin/netstat
---- 16 etc/resolv.conf -> /dev/shmem/resolv.conf
---- 16 etc/ppp/resolv.conf -> /dev/shmem/resolv.conf
---- 18 etc/tuner -> /fs/mmc0/app/share/tuner
---- 8 var/override -> /fs/etfs
---- c usr/local -> /fs/mmc0/app
---- b usr/share/eq -> /fs/mmc0/eq
b1000 12af etc/system/config/fram.conf
b3000 38c etc/system/config/nand_partition.txt
b4000 56b etc/system/config/gpio.conf
b5000 247b bin/cat
b8000 1fed bin/io
ba000 2545 bin/nice
bd000 1fed bin/io
c0000 38e0f bin/ksh
f9000 41bb bin/slogger
fe000 60a1 bin/waitfor
105000 531b bin/pipe
10b000 5e02 bin/dev-gpio
120000 1270b bin/dev-ipc
140000 1f675 bin/io-usb
160000 29eb bin/resource_seed
163000 3888 bin/spi-master
167000 48a0 bin/dev-memory
16c000 9eab bin/dev-mmap
176000 602c bin/i2c-omap35xx
17d000 da08 bin/devb-mmcsd-omap3730teb 18b000 dd3 bin/dev-ipc.sh
18c000 2198 bin/mmc.sh
190000 1208f bin/devc-seromap
1a3000 323d bin/rm
1a7000 ffa2 bin/devc-pty
1b7000 4eb bin/startSplashApp
1b8000 692 bin/startBackLightApp
1b9000 1019 bin/mmc_chk
1bb000 42fe usr/bin/adjustImageState
1c0000 12c81 usr/bin/memifs2
1d3000 284 usr/bin/loadsecondaryifs.sh
1e0000 77000 lib/libc.so.3
---- 9 lib/libc.so -> libc.so.3
260000 b0e4 lib/dll/devu-omap3530-mg.so
26c000 9d17 lib/dll/devu-ehci-omap3.so
276000 4705 lib/dll/spi-omap3530.so
280000 14700 lib/dll/fs-qnx6.so
295000 36e6 lib/dll/cam-disk.so
2a0000 2b7ba lib/dll/io-blk.so
2d0000 5594f lib/dll/charset.so
330000 1243c lib/dll/libcam.so.2
---- b lib/dll/libcam.so -> libcam.so.2
350000 3886 lib/dll/fram-i2c.so
Checksums: image=0x702592f4 startup=0xc11b20c0
复制代码
虽然,‘dumpifs
’ 命令不能获取到与完整操做系统相关的全部信息,好比,‘/etc/shadow
’,咱们在二进制上运行了grep,其结果说明这种文件是最可能显示的。例如,若是你搜索’root’,你会找到几个字符串,其中最有意思的两个分别是:
root:x:0:a
root:ug6HiWQAm947Y:::9b
复制代码
在经过远程入侵劫持了工做头单元后,咱们就能够更全面地在工做的头单元上检查IFS。接下来,咱们会讨论如何劫持头单元。
ETFS实现了一个高度可靠的文件系统,供嵌入式固态存储设备使用,尤为是NAND闪存。很显然,ISO中并无出现ETFS,可是在一个活动的Uconnect系统上能检查到。在咱们看来,在ETFS上并无多少有趣的数据,因此咱们就不深刻了。
例如:/fs/etfs/usr/var/sdars/channelart/I00549T00.png
复制代码
在调查ISO和Uconnect系统时,咱们发现MMC文件系统中的一些项目是最有意思的。最让咱们好奇的是这个文件系统能够挂载为读-写属性,也就是说,若是这个文件系统上有咱们感兴趣的东西,好比启动脚本或网络服务,咱们就能够启用或修改其内容。好比,咱们就发现了’sshd’,‘boot.sh’和 ‘runafterupdate.sh’这样的项目。
安装脚本-’mmc.lua’会把ISO中的‘/usr/share/MMC_IFS_EXTENSION
’复制到‘/fs/mmc0/app
’。
QNX系统中运行着许多有意思的服务,可是解释全部的这些服务并不在本文的范围中。其中一个很重要的服务是发布/订阅服务(PPS)。在这个服务中有几个文件是咱们感兴趣的,下面列出的是最突出的几个:
/pps/can/vehctl
/pps/can/tester
/pps/can/can_c
/pps/can/send
/pps/can/comfortctl
复制代码
这些文件从本质上说,是数据写入的位置,这样就能够将其用做其余进程的输入。咱们能够把这些文件想象成具有数据处理能力的UNIX管道,用于协助数据结构的解析。这里有一个定义好的API会与PPS文件交互。假设下面的数据就储存在一个PPS文件中:
@gps
city::Ottawa
speed:n:65.412 position:json:{"latitude":45.6512,"longitude":-75.9041}
复制代码
为了提取这些数据,你可使用下面的代码:
const char *city;
double lat, lon, speed;
pps_decoder_t decoder;
pps_decoder_initialize(&decoder, NULL); pps_decoder_parse_pps_str(&decoder, buffer); pps_decoder_push(&decoder, NULL); pps_decoder_get_double(&decoder, "speed", &speed); pps_decoder_get_string(&decoder, "city", &city);
pps_decoder_push(&decoder, "position"); pps_decoder_get_double(&decoder, "latitude", &lat); pps_decoder_get_double(&decoder, "longitude", &lon); pps_decoder_pop(&decoder);
pps_decoder_pop(&decoder);
if ( pps_decoder_status(&decoder, false) == PPS_DECODER_OK ) { ...
}
pps_decoder_cleanup(&decoder);
复制代码
下面这个真实案例是取自一个活动中的Uconnect系统:
# cat send
[n]@send
DR_MM_Lat::1528099482
DR_MM_Long::1073751823
GPS_Lat::1528099482
GPS_Long::1073751823
HU_CMP::0
NAVPrsnt::1
RADIO_W_GYRO::1
复制代码
虽然,PPS文件位于一个叫作‘can_c’ 的子目录中,可是在写入这些文件时,并无建立咱们用嗅探器观察到的CAN信息。换句话说,这些PPS文件只是能看到进程之间是如何通信的,并无直接与CAN总线通信的权限。
一开始,咱们还但愿能利用这些PPS文件来发送任意的CAN信息,可是,在证实了这种方法的生存能力不够强后,咱们又把努力方向转向到了其余地方。这不是说,咱们没法利用这些文件和PPS子系统来发送任意的CAN信息,只是咱们想找到一种更好的办法来实现咱们想要的结果。
2014年款的吉普切诺能够选配车载Wi-Fi,其本质就是一个Wi-Fi热点,只有在web上或经过Uconnect系统购买了这项服务,上网功能才能实现。接下来,咱们会讨论Wi-Fi热点中存在的一个漏洞,可是要记住,只有当车主启用并购买了这项功能后,这个漏洞才能够利用。
默认的Wi-Fi加密方法是WPA2,使用的密码是随机生成的,字母数字很多于8位。考虑到目前WPA2的强度和可能的密码数量,这是一种很是安全的设置,因此问题是:攻击者怎样才能入侵这样的网络呢?
一种相对简单,可是不太可行的方法就是用户选用了WEP加密方法,或直接没有使用加密,这两种都是可行的选择。不管是哪一种状况,攻击者都可以经过破解WEP密码或直接加入访问点来入侵这种无线访问点。
若是攻击者已经入侵了链接到车载Wi-Fi热点的设备,好比,笔记本电脑或手机,那么还存在另一种攻击方案。既然车主购买了这个功能,也就是说他的手机或其余设备会链接到车上的无线网络。在这种状况下,若是攻击者能够入侵这些设备,他们就能链接到车上的无线网络。可是,咱们认为这种方案须要太多的前提条件了,l33t!(黑客经常使用的聊天语言,主要表示 what!和yeah!的意思)
可是,接下来咱们会看到,即便用户使用了默认的WPA2设置,攻击者仍是能够入侵车上的网络,并且方法很简单。经过反汇编OMAP芯片上的‘WifiSvc’二进制(经过转储活动的QNX中的二进制能够得到),攻击者就能够肯定用于建立随机密码的算法。这个算法会出如今函数WiFi.E:generateRandomAsciiKey()
中。经过反编译,咱们发现这个算法包含下面的部分:
int convert_byte_to_ascii_letter(signed int c_val) { char v3; // [email protected] if ( c_val > 9 ) { if ( c_val > 35 ) v3 = c_val + 61; else v3 = c_val + 55; } else { v3 = c_val + 48; } return v3; } char *get_password(){ int c_max = 12; int c_min = 8; unsigned int t = time(NULL); srand (t); unsigned int len = (rand() % (c_max - c_min + 1)) + c_min; char *password = malloc(len); int v9 = 0; do{ unsigned int v10 = rand(); int v11 = convert_byte_to_ascii_letter(v10 % 62); password[v9] = v11; v9++; } while (len > v9); return password; 复制代码
看起来,随机密码是彻底是一个时间(几秒钟)的函数,咱们很难去调查这个密码是在什么时间生成的,可是下面的信息能代表头单元的首次启动时间。
因此,经过生成一个密码表来暴力破解无线访问点的WPA2加密是可行的。根据汽车的生成年份,攻击者能够尝试猜想汽车的首次启动时间,并尝试合适的密码。
仅供参考,若是咱们能够猜想出某辆汽车是在几月份首次启动的,咱们只须要尝试大约1500万个密码。若是你认为首次启动时间不会是在半夜,那么须要尝试的密码数量又能够减半。咱们并非这方面的专家,可是有资料代表,在使用离线破解技术时,你每秒能够尝试133,000次密码。也就是说,猜想一个月中的全部密码只须要2分钟,猜想全年的密码也用不了半个小时。在多数状况下,虽然咱们估计的过于乐观了,可是这种方法仍是可行的。
不过,因为一个复杂的时间漏洞的存在,彷佛还有另一种更简单的密码破解方法,可是,请注意,咱们只用这种方法攻击了咱们的头单元,咱们不能肯定这种攻击是否是有普适性。
当头单元首次启动时,头单元也不知道具体的时间。头单元还须要从GPS或蜂窝链接中接收信号。文件‘clock.lua’负责的就是设置系统时间。咱们在函数‘start()
’ 中发现了下面的代码:
local rtcTime = getV850RealtimeClock()
local rtcValid = false
if rtcTime == nil or rtcTime.year == 65535 or rtcTime.month == 255 or rtcTime.day == 255 or rtcTime.hour == 255 or rtcTime.mi n == 255 or
rtcTime.sec == 255 then
dbg.print("Clock: start -- V850 time not received or is set to factory defaults")
...
if rtcValid == false then
dbg.print("Clock: start -- Unable to create the UTC time from V850") setProperty("timeFormat24", false)
setProperty("enableClock", true)
setProperty("gpsTime", true)
setProperty("manualUtcOffset", 0)
defTime = {}
defTime.year = 2013
defTime.month = 1
defTime.day = 1
defTime.hour = 0
defTime.min = 0
defTime.sec = 0
defTime.isdst = false setSystemUTCTime(os.time(defTime))
timeFormatOverride = false
enableClockOverride = false
end
复制代码
根据上面的代码,彷佛当头单元没法获取到时间时,就会把时间设置到2013年1月1日 00:00:00 GMT。问题是,当‘WifiSvc’在首次启动并设置WPA2密码的时候,正确的时间是否是已经设置了。仅仅是根据咱们的数据来看,答案是尚未。若是你获取到吉普切诺上的WPA2密码“TtYMxfPhZxkp”并暴力破解全部可能的时间来判断生成密码的是哪一个时间,你所获得的结果会是吉普切诺上的密码是在Epioch 时间0x50e22720上生成的。这个时间对应的是2013年1月1日 00:00:32 GMT。这就说明,从‘clock.lua’设置好时间到‘WifiSvc’生成密码,咱们的头单元用了32s,并且咱们的头单元并无在这32s中找到正确的时间。因此,在这种状况下,实际只须要尝试十几个可能的密码,并且只有几个的可能性较大。换句话说,几乎瞬间就能破解出密码。
一种常见的Wi-Fi热点评估方法是端口扫描默认的网关,并检查是否是打开了任何端口。出乎咱们意料的是,开放端口远远的数量超过了3个。下面是根据网络状态(netstat)列出的监听端口:
# netstat -n | grep LISTEN
tcp 0 0 *.6010 *.* LISTEN
tcp 0 0 *.2011 *.* LISTEN
tcp 0 0 *.6020 *.* LISTEN
tcp 0 0 *.2021 *.* LISTEN
tcp 0 0 127.0.0.1.3128 *.* LISTEN
tcp 0 0 *.51500 *.* LISTEN
tcp 0 0 *.65200 *.* LISTEN
tcp 0 0 *.4400 *.* LISTEN
tcp 0 0 *.6667 *.* LISTEN
复制代码
下面是经过端口扫描发现的服务简介:
在全部这些服务中,有不少都是专利性质的,颇有可能在某个服务中就存在漏洞,能容许远程漏洞利用。
通过简单的研究,咱们发现最有意思的开放端口是6667,这个端口通常是给IRC保留的。很显然,这个Wi-Fi热点没法运行一个IRC服务器,对吧?在使用远程登录系统的客户端链接到6667端口并返回几回后,咱们意识到这并非一个IRC服务器,可是,D-Bus到IP,其实是一个跨进程通信(TPC),也是进程之间在通信时使用的一个远程过程调用机制。
$ telnet 192.168.5.1 6667
Trying 192.168.5.1...
Connected to 192.168.5.1.
Escape character is '^]'.
a
ERROR "Unknown command"
复制代码
Uconnect系统上的D-Bus信息守护进程绑定到了端口6667,而且如上所述,用于跨进程通信。进程之间的交互以下:
图-http://dbus.freedesktop.org/doc/diagram.png
这里只有两个总线值得一提:系统总线,守护进程和系统服务主要都注册到这个总线;会话总线,为用户应用保留的一个总线。
D-Bus能够获取认证。在吉普切诺的头单元上,认证是开放给匿名操做的,以下:
telnet 192.168.5.1 6667
Trying 192.168.5.1...
Connected to 192.168.5.1.
Escape character is '^]'.
AUTH ANONYMOUS
OK 4943a53752f52f82a9ea4e6e00000001
BEGIN
复制代码
咱们使用Python的D-Bus库写了几个脚原本与D-Bus系统交互,可是在调查期间,咱们感受最实用的工具仍是Dfeet,这个工具提供了很是易用的GUI来调试D-Bus服务。
用户可使用DFeet工具与吉普切诺上的D-Bus服务交互。在下面的截图中,咱们看到的是‘com.harman.service.SoftwareUpdate
’ 服务的方法。
图-com.harman.service.SoftwareUpdat
服务在DFeet中的输出
DFeet可以链接并列出多个服务(叫作总线名称)。例如:
com.alcas.xlet.manager.AMS
com.harman.service.AppManager
com.harman.service.AudioCtrlSvc
...
复制代码
每一个服务都有一个对象路径。好比’com.harman.service.onOff
’的对象路径就是‘/com/harman/service/onOff
’。另外,每一个服务都包括两个接口:‘com.harman.Serviceipc
’ 和 ‘org.freedesktop.DBus.Introspectable
’。Serviceipc接口只有一种获取参数和返回字符串的方法,表示的是通用D-Bus接口。
在DFeet中就能够调用这些服务。好比,你能够单击’com.harman.service.Control
’,而后是‘/com/harman/service/Control
’,接着是‘ ‘Serviceipc’下的Invoke’,最后执行下面的参数:“getServices”, “”
图-经过DFeet调用
返回的值能够在输出窗口(上图)中看到,可是咱们还列出了下面的信息:
{"com.harman.service.platform.launcher":
{"name":"com.harman.service.platform.launcher",
"methods":{"launch":"launch"}},
"com.harman.service.Control":
{"name":"com.harman.service.Control",
"methods":{"stop":"stop","getModules":"getModules
","start":"start","getServices":"getServices","setDebug":"setDebug","shutdown":"shutdo
wn"}},
"com.harman.service.PersonalConfig":{
"name":"com.harman.service.PersonalConfig",
"methods":{"getProperties":"getProperties","getAl
lProperties":"getAllProperties","setProperties":"setProperties"}},
复制代码
检查并分类全部的D-Bus服务和经过TCP的方法调用,这是咱们留给您的阅读实践。可是,咱们已经发现了几种方法,能容许直接与头单元交互,好比调整电台音量,访问PPS数据以及能提供低级权限的其余方法。
2014款吉普切诺的哈曼Uconnect系统还可以经过Sprint蜂窝网络进行通信。大多数人都把这种通信方法称做车载通信系统。这个通信系统是车载Wi-Fi、实时流量更新和其余远程链接的支柱。
蜂窝链接多是经过Sierra Wireless AirPrime AR5550无线模块实现的,以下。
图-哈曼Uconnect系统上的Sierra Wireless AirPrime AR5550无线模块
你能够根据这个无线模块上的标志判断出这个芯片使用了高通的3G基带,并使用了Sprint做为运营商。用户也可使用Sierra Wireless 的软件开发工具来开发和调试这些系统。
咱们先前提到过,Uconnect系统既能够经过Wi-Fi、蜂窝和蓝牙与外界通信,也能够经过CAN总线与外界通信。虽然在德州仪器OMAP-DM3730系统上运行的ARM处理器并没有法直接访问CAN总线,可是另外一个板载数据包却能够。
负责与内部高速CAN(CAN-IHS)交互的处理器和主要的CAN-C总线是一个Renesas V850处理器,以下。
图-Renesas V850 FJ3
经过上面的标志咱们能肯定这个芯片是Renesas V850 FJ3。另外,结合全部的指示信息和经验,这也是汽车头单元中的典型配置。V850芯片的功耗低并且能持续监控CAN流量数据。在有必要时,这个芯片会唤醒(高功耗的)OMAP芯片。
不过咱们很幸运,IDA Pro中已经包括了一个这种架构的处理器,因此咱们不须要本身写了。详细的固件逆向过程请阅读下面的V850章节。
接下来你会发现,要想劫持Uconnect设备,并不须要远程入侵这辆吉普,可是,要想弄清楚如何探索头单元和其余部分,劫持是颇有必要的。咱们在这里提供了一些具体的信息来帮助那些热衷于访问头单元文件的用户。很显然,本地安全是整个汽车安全中很重要的一个部分。由于任何漏洞做者都会告诉你说,只有搞明白了目标系统中错综复杂的关系,你才能建立一个能彻底发挥做用的漏洞。
总的来讲,劫持Uconnect设备的方法有两种,第一种适用于全部的版本,也很简单;第二种只适用于特定的操做系统版本,可是能够视为一种合法的入侵。
你能够把一个有效的ISO文件放到一个U盘上,再把这个U盘插入到Uconnect系统的USB端口。头单元就会识别这个包含有更新文件的U盘并开始更新过程,以下。
图-Uconnect的更新界面
若是你尝试在U盘验证后,可是重启前,移除U盘,系统就会放弃更新并重启进入常规(非更新)模式。
可是,在验证了U盘后,系统就会重启头单元。若是,你这时候关机并拔出U盘,系统就会简单地要求你插入U盘。
图-要求插入U盘的界面
此时,你能够插入一个新的U盘。咱们不清楚系统会如何检查新的U盘,可是必定和原来的检查方法很 “接近”或者就根本不检查。然而,U盘上能够包含修改后的文件。好比,经过修改原始ISO文件的十六进制值来更改根密码是能够成功的。更新是从ISO文件上运行的,包括用于验证ISO有效性的代码。因此,若是你愿意的话,也能够阻止代码运行完整性检查。
版本14_05_03中存在一个bug,能容许绕过系统的ISO验证过程。不过,这个ISO文件中的某些属性仍是要保持不变的,至于缘由咱们也不是彻底清楚(如上)。至少,咱们知道不能更改的属性包括文件中的一些哈希和签名。经过手动编辑ISO就能够绕过完整性检查。
系统中的bug:
/usr/share/scripts/update/installer/system_module_check.lua 91 local fname= string.format("%s/swdl.iso", os.getenv("USB_STICK") or "/fs/usb0")
92 local FLAGPOS=128
93
94 local f = io.open(fname, "rb")
95 96 97 98 99
100 101
if f then
local r, e = f:seek("set", FLAGPOS)
if r and (r == FLAGPOS) then
local x = f:read(1)
if x then
if x == "S" then
print("system_module_check: skip ISO integrity check")
复制代码
绕过ISO有效性检查很简单,只须要在一个十六进制编辑器中手动编辑文件并把偏移128 (0x80) 上的值修改成‘S’ (0x53)。
图-修改后的完整性检查字节
若是想在更新过程当中运行代码,好比,要想绕过除了ISO完整性检查以外的其余检查,你能够更改’system_module_check.lua’。要想绕过某些过程的最有效办法就是修改ISO,让系统检测ISO是否是正在绕过完整性检查,若是是,就放弃更新过程。这样,你就能够在不完成Uconnect系统更新过程的状况下,运行代码了,而完整更新过程可能须要30分钟。仅仅经过修改‘cmds.sh’ 的内容,就能够放弃整个更新过程。
上面提到的这种在更新过程当中运行代码的方法存在弊端,主要是头单元会处于 “更新模式”(更多细节请参阅‘bootmode.sh’ ),也就是说并非全部的文件系统都会挂载,而且相似网络链接这样的功能也不会启用。可是,头单元在安装更新的过程zhong是能够修改的,并且这种更改是不会由于汽车重启而移除的。
用另一种不一样的方式来修改ISO就可让代码在 “常规”模式运行,这样就能访问全部的文件系统和网络链接了。为了在常规模式下更新代码。用户必须修改 ‘boot.sh’ 文件来运行一些代码。下面就是劫持ISO时,boot.sh文件的差异:
< sh /fs/usb0/cmds.sh &
< ######rently started with high verbosity
---
> # Start Image Rot Fixer, currently started with high verbosity
复制代码
在作出了更改后,Uconnect系统在启动时,就会执行U盘上‘cmds.sh’文件中的任何命令。例如,你能够更改根目录并启动SSH守护进程,这样就能够获取SSH远程权限了(给你访问Uconnect设备的根权限)。
首先,你必须修改ISO中的根密码,而后,在‘cmds.sh’文件中添加下面的命令。这样在开机时SSH就能启动:‘/fs/mmc0/app/bin/sshd
’
以下是经过SSH登陆哈曼Uconnect系统:
ssh [email protected] ******************************** CMC ******************************** Warning - You are knowingly accessing a secured system. That means you are liable for any mischeif you do. ********************************************************************* [email protected]'s password: 复制代码
注意:其中有个词拼错了。
在不少时候,你可能想要在Uconnect系统中放入文件。要想实现这一点,你必需要能写入一个文件系统,就像运行挂载命令同样简单:
mount -uw /fs/mmc0/
复制代码
很明显,经过发出另外一个挂载命令就能够逆向这个过程:
mount -ur /fs/mmc0/
复制代码