VW IVI RCE AS ROOT

文摘   2024-11-20 17:37   上海  

Introduction

    本文描述了在大众汽车集团使用的车载信息娱乐系统中发现的多个漏洞。这些漏洞可以通过蜂窝网络连接被利用,进而影响到车辆的CAN总线。
在这项研究中,我们查看了不同品牌和型号的不同汽车,相似之处在于所有汽车都具有互联网连接功能。最终,我们将研究重点放在了一种特定的车载信息娱乐(IVI)系统上,该系统用于大众汽车集团的大多数汽车,并常被称为MIB。更具体地说,在我们的研究中,我们使用了一辆大众高尔夫GTE和一辆奥迪A3 e-tron。
Car anatomy
现代车辆的连接程度远超人们的想象。在过去,汽车主要是依靠机械功能如转向和制动操作的机械设备。现代车辆主要依赖电子系统来控制这些系统。这通常被称为线控驾驶,相比传统的机械方法,它有几个优势。由于组件由计算机控制,许多安全特性成为可能。例如,如果前雷达检测到前方有障碍物并且认为碰撞不可避免,某些汽车会自动刹车。线控驾驶也用于一些豪华功能,比如自动泊车,通过基于雷达/摄像头图像电子接管方向盘。
所有这些新功能之所以可能,是因为现代汽车中的每个组件都连接到了一个中央总线,组件之间通过这个总线交换消息。最常见的总线系统是自90年代以来所有汽车都配备的CAN(控制器局域网)总线。如今,它控制着一切,从转向到解锁车门再到收音机上的音量旋钮。
CAN协议本身相对简单。基本上,每条消息都有一个仲裁ID和一个负载。没有认证、授权、签名、加密等。一旦接入总线,就可以发送任意消息,这些消息将被连接到同一总线的所有方接收。也没有发送者或接收者信息,每个组件可以自行决定某个特定消息是否适用于它们。

理论上,如果攻击者能够访问到汽车的CAN总线,他或她就能够控制汽车。例如,他们可以冒充前雷达,指示制动系统因即将发生碰撞而进行紧急停车,或者接管转向。攻击者只需要找到一种实际访问连接到CAN总线的组件的方法,而无需物理接触。
攻击者有很多远程攻击面可以选择。其中一些需要靠近汽车,而另一些则可以从全球任何地方达到。有些攻击向量需要用户的交互,而其他的可以在乘客不知情的情况下被攻击。
例如,现代汽车有一个监测轮胎压力的系统,称为TPMS(轮胎压力监测系统),如果其中一个轮胎压力过低,它会通知驾驶员。这是一个无线系统,轮胎会通过无线电波或蓝牙将其活动压力通信给车内的一台接收器。然后,这台接收器会通过CAN总线上的消息通知其他组件。仪表盘会接收到这条消息,并相应地开启适当的警告灯。另一个例子是钥匙扣,它会无线地与汽车内的接收器通信,后者反过来又会与车门锁和发动机防盗装置通信。所有这些组件有两个共同点:它们连接到CAN总线,并且具有远程攻击面(即接收器)。
现代汽车对抗恶意CAN消息有两种主要的保护方式。第一种是汽车内所有组件的防御性行为。每个组件都被设计成总是选择最安全的选项,以防止可能出现故障的组件。例如,默认情况下,自动泊车的自动转向可能是禁用的,只有当汽车倒挡并且速度很低时才会启用。如果总线上的另一个恶意设备冒充前雷达试图触发紧急停车,真实的前雷达将继续向总线发送道路畅通的消息。
第二种保护机制是现代汽车不止有一条CAN总线,而是将安全关键设备与便利设备分开。例如,刹车和发动机连接到高速CAN总线,而空调和雨刷则连接到一个分离的(而且可能是低速的)CAN总线。理论上,这些总线应该是完全隔离的,但在实践中,它们通常通过所谓的网关连接。这是因为存在数据必须从低速流向高速CAN总线及反之亦然的情况。例如,门锁必须能够与发动机通信以启用和禁用防盗装置,而IVI系统从发动机接收状态信息和错误代码以显示在中央显示屏上。这些消息的防火墙是网关的责任,它会监控来自每个总线的每条消息,并决定哪些消息允许通过。
在过去的几年里,我们看到越来越多的汽车配备了互联网连接,甚至有些汽车同时拥有两个蜂窝网络连接。这种连接可以被IVI系统用来获取信息,比如地图数据,或者提供诸如互联网浏览器、Wi-Fi热点等功能,还可以让车主通过移动应用程序控制某些功能。例如,远程启动预热汽车,或者远程锁定/解锁汽车。在所有情况下,具有蜂窝网络连接的设备也连接到了CAN总线,这使得理论上可以远程入侵一辆汽车。

Research goal
现代汽车有许多远程攻击向量,如蓝牙、TPMS和钥匙。但是,大多数向量要求攻击者接近受害者。然而,对于这项研究,我们特别关注可以通过互联网触发且不需要用户交互的攻击向量。一旦我们找到了这样的向量,我们的目标就是看是否可以利用这个向量来影响汽车的驾驶行为或其他关键的安全组件。通常,这意味着我们想要访问连接刹车、方向盘和发动机等部件的高速CAN总线。
我们选择了互联网向量而非其他向量,因为这种攻击将进一步说明当前生态系统涉及的风险。所有其他向量都需要物理接近汽车,这通常意味着影响范围仅限于一次几辆车。
我们提出了以下研究问题:“我们能否通过互联网攻击向量影响汽车的驾驶行为或关键安全系统?”

Research approach
    我们以九个不同品牌的九款不同车型开始了这项研究。我们进行了初步研究,绘制了每辆车的可能攻击向量。确定攻击向量是通过查看架构、阅读公开文档和进行简短的技术评估来完成的。我们特别寻找的是:


  • 只有一层或少数几层介于蜂窝网络连接和高速CAN总线之间的汽车

  • 允许我们轻松更换SIM卡的汽车(因为我们不是汽车的所有者,焊接、去封装等操作是不希望的)

  • 通过蜂窝网络或Wi-Fi提供大量服务的汽车  

最终,我们选定大众高尔夫GTE作为主要研究目标。后来,我们又将奥迪A3 e-tron加入到我们的研究中。这两款车型共享同一个IVI系统,初看上去似乎具有广泛的攻击面,增加了找到可利用漏洞的机会。


Research findings
Initial access
我们最初的研究是从一辆2015年的大众高尔夫GTE开始的,该车配备了Car-Net应用程序。这款汽车的信息娱乐系统由哈曼制造,被称为modular infotainment platform(MIB)。我们的车型装备了该平台的较新版本(version 2),该版本较前一版本有所改进(如支持Apple CarPlay)。需要注意的是,我们的车型没有独立的SIM卡托盘。我们假设蜂窝网络连接使用了嵌入式SIM卡,位于信息娱乐系统内部,但后来这一假设被证明是不正确的。
安装在大众高尔夫中的MIB版本具有连接到Wi-Fi网络的功能。对该端口进行快速端口扫描后发现有许多服务正在监听:
$ nmap -sV -vvv -oA gte -Pn -p- 192.168.88.253Starting Nmap 7.31 ( https://nmap.org ) at 2017-01-05 10:34 CETHost is up, received user-set (0.0061s latency).Not shown: 65522 closed portsReason: 65522 conn-refusedPORT      STATE    SERVICE         REASON      VERSION23/tcp    open     telnet          syn-ack     Openwall GNU/*/Linux telnetd10123/tcp open     unknown         syn-ack15001/tcp open     unknown         syn-ack21002/tcp open     unknown         syn-ack21200/tcp open     unknown         syn-ack22111/tcp open     tcpwrapped      syn-ack22222/tcp open     easyengine?     syn-ack23100/tcp open     unknown         syn-ack23101/tcp open     unknown         syn-ack25010/tcp open     unknown         syn-ack30001/tcp open     pago-services1? syn-ack32111/tcp open     unknown         syn-ack49152/tcp open     unknown         syn-ack
Nmap done: 1 IP address (1 host up) scanned in 259.12 seconds
存在一个完全功能的telnet服务正在监听,但由于没有有效的凭据,这条路似乎走不通。初步扫描并未返回任何有效凭据,后来发现它们使用的是八个随机字符组成的密码。其他一些端口似乎用于向客户端发送调试信息,比如当前播放的电台和当前GPS坐标。端口49152上有一个UPnP服务正在监听,经过一些研究后,很明显它们使用的是PlutinoSoft Platinum UPnP,这是一个开源软件。这项服务引起了我们的兴趣,因为同样这项服务也在奥迪A3(也是2015年的车型)上被发现。不过,这辆车只有两个开放端口:
$ nmap -p- -sV -vvv -oA a3 -Pn 192.168.1.1Starting Nmap 7.31 ( https://nmap.org ) at 2017-01-04 11:09 CETNmap scan report for 192.168.1.1Host is up, received user-set (0.013s latency).Not shown: 65533 filtered portsReason: 65533 no-responsesPORT      STATE  SERVICE REASON       VERSION53/tcp    open   domain  syn-ack      dnsmasq 2.6649152/tcp open   unknown syn-ack
Nmap done: 1 IP address (1 host up) scanned in 235.22 seconds

我们花了一些时间审查UPnP的源代码(但绝非全面审计),但并未发现可利用的漏洞。

我们最初选择高尔夫作为主要研究目标是因为它有更多的攻击面,但这至少表明这两个系统是基于同一平台构建的。

经过进一步研究,我们在高尔夫上发现了一个带有可利用漏洞的服务。最初,我们可以利用这个漏洞从磁盘读取任意文件,但很快就扩展了可能性,实现了完全的远程代码执行。这种攻击只能通过Wi-Fi热点进行,因此影响有限。攻击者必须靠近汽车,并且汽车必须连接到攻击者的Wi-Fi网络。但我们确实获得了初始访问权限:

$ ./exploit 192.168.88.253[+] going to exploit 192.168.88.253[+] system seems vulnerable...[+] enjoy your shell:uname -aQNX mmx 6.5.0 2014/12/18-14:41:09EST nVidia_Tegra2(T30)_Boards armle

由于没有机制可以远程更新这种类型的IVI系统,我们决定不披露用于获得初始访问权限的确切漏洞。我们认为,完全披露可能会使人们处于风险之中,而不会为这篇文章增加太多价值。

MMX
我们访问的系统自称为MMX。它运行在ARMv7a架构上,使用QNX操作系统,版本为6.5.0。它是MIB系统中的主处理器,负责屏幕合成、多媒体解码、卫星导航等功能。
我们注意到,MMX单元负责Wi-Fi热点功能,但不负责Car-Net应用所使用的蜂窝网络连接。然而,我们确实发现了一个内部网络。弄清楚另一端是什么成为了我们研究的下一步。
# ifconfig mmx0mmx0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: 00:05:04:03:02:01 media: <unknown type> autoselect inet 10.0.0.15 netmask 0xffffff00 broadcast 10.0.0.255 inet6 fe80::205:4ff:fe03:201%mmx0 prefixlen 64 scopeid 0x3

我们面临的一个问题是系统上缺乏工具,也没有编译我们自己的工具的构建链。由于这一点,我们无法获取套接字列表或进程列表。QNX操作系统和构建链是商业软件,我们没有许可证。起初,我们尝试使用已经存在的工具工作。例如,我们依赖广播ping来进行主机发现,并使用内置的ftp客户端进行端口扫描(这花费了很长时间)。尽管过程繁琐,但我们还是找到了网络上的另一个活跃主机。最终,我们申请了QNX的试用版本。虽然对此并没有抱太大期望,但我们继续进行研究。几周后,我们的申请得到了批准,我们收到了一个演示许可证。这意味着我们有了访问标准工具(如telnet和ps)以及构建链的权限。
另一端的设备自称为RCC,并且也有一个telnet服务在运行。我们尝试使用相同的凭据登录,但最初失败了。在进一步调查MMX的配置后,我们发现MMX和RCC共享文件系统,使用的是QNX专有的Qnet协议。MMX和RCC被允许在彼此之间生成进程并读取文件(如shadow文件)。甚至发现RCC上的shadow文件只是一个指向MMX上shadow文件的符号链接。看起来原始的telnet二进制文件没有完全正常工作,导致了密码拒绝的消息。经过一些重写之后,一切都如预期那样工作了。
# /tmp/telnet 10.0.0.16Trying 10.0.0.16...Connected to 10.0.0.16.Escape character is '^]'.

QNX Neutrino (rcc) (ttyp0)
login: rootPassword:
___ _ _ __ __ ___ _____ / |_ _ __| (_) | \/ |_ _| _ \ / /| | | | |/ _ | | | |\/| || || |_)_/ / __ | |_| | (_| | | | | | || || |_) \ /_/ |_|__,__|\__,_|_| |_| |_|___|_____/
/ > ls –latotal 37812lrwxrwxrwx 1 root root 17 Jan 01 00:49 HBpersistence -> /mnt/efs-persist/drwxrwxrwx 2 root root 30 Jan 01 00:00 binlrwxrwxrwx 1 root root 29 Jan 01 00:49 config -> /mnt/ifs-root/usr/apps/configdrwxrwxrwx 2 root root 10 Feb 16 2015 devdr-xr-xr-x 2 root root 0 Jan 01 00:49 esodrwxrwxrwx 2 root root 10 Jan 01 00:00 etcdr-xr-xr-x 2 root root 0 Jan 01 00:49 hbsystemlrwxrwxrwx 1 root root 20 Jan 01 00:49 irc -> /mnt/efs-persist/ircdrwxrwxrwx 2 root root 20 Jan 01 00:00 libdrwxrwxrwx 2 root root 10 Feb 16 2015 mntdr-xr-xr-x 1 root root 0 Jan 01 00:37 netdrwxrwxrwx 2 root root 10 Jan 01 00:00 optdr-xr-xr-x 2 root root 19353600 Jan 01 00:49 procdrwxrwxrwx 2 root root 10 Jan 01 00:00 sbindr-xr-xr-x 2 root root 0 Jan 01 00:49 scriptsdr-xr-xr-x 2 root root 0 Jan 01 00:49 srvlrwxrwxrwx 1 root root 10 Feb 16 2015 tmp -> /dev/shmemdrwxr-xr-x 2 root root 10 Jan 01 00:00 usrdr-xr-xr-x 2 root root 0 Jan 01 00:49 var/ >


RCC
RCC单元是MIB系统上的一个独立芯片。MIB IVI是一个模块化平台,其中将所有的多媒体处理与低级功能分离开来。MMX(多媒体应用单元)处理器负责卫星导航、屏幕和输入控制、多媒体处理等功能。而RCC(无线电和汽车控制单元)处理器则处理低级通信。
RCC运行相同的QNX版本。它可用的工具更少,内存也只有几百KB。但由于Qnet协议的存在,可以从MMX单元上运行所有工具到RCC上。
与DAB+、CAN、AM/FM解码等低级组件的通信是通过串行连接进行的;要么是SPI,要么是I2C。各种配置选项可以在/etc/目录下找到。

Car-Net
我们原本期望在RCC上找到蜂窝网络连接,但实际上并没有。经过进一步研究后发现,Car-Net功能是由一个完全独立的单元提供的,而不是IVI系统。高尔夫车内的蜂窝网络连接是连接到仪表盘后面的盒子上的,如下所示。

Car-Net盒子里使用的是嵌入式SIM卡。由于这个盒子没有提供其他接口选项,而且我们不能对汽车做出任何物理更改(例如检查是否可以使用JTAG),所以我们没有进一步调查。

Audi A3
从这里开始,我们决定将精力重新投入到奥迪A3上。它使用的是相同的IVI系统,但采用了更高配置的版本。这个版本有一个物理SIM卡,用于奥迪Connect服务。当然,我们已经通过Wi-Fi热点进行了端口扫描,结果为空,但通过蜂窝网络连接的结果可能会有所不同。
为了测试这一点,我们需要能够对远程接口进行端口扫描。这可以通过以下几种方式之一实现:如果ISP分配了一个公共可路由的IPv4地址(未防火墙保护)、允许客户端到客户端的通信,或者使用被破解的微蜂窝基站。我们选择了第一种方式,通过使用荷兰最大的ISP之一提供的功能。如果你更改某些APN设置,他们会分配一个公共IPv4地址。对这个公共IP地址的端口扫描给出了与我们之前在Wi-Fi接口上的端口扫描完全不同的结果:
$ nmap -p0- -oA md -Pn -vvv -A 89.200.70.122Starting Nmap 7.31 ( https://nmap.org ) at 2017-04-03 09:14:54 CETHost is up, received user-set (0.033s latency).Not shown: 65517 closed portsReason: 65517 conn-refusedPORT      STATE    SERVICE    REASON      VERSION23/tcp    open     telnet     syn-ack     Openwall GNU/*/Linux telnetd10023/tcp open     unknown    syn-ack10123/tcp open     unknown    syn-ack15298/tcp filtered unknown    no-response21002/tcp open     unknown    syn-ack22110/tcp open     unknown    syn-ack22111/tcp open     tcpwrapped syn-ack23000/tcp open     tcpwrapped syn-ack23059/tcp open     unknown    syn-ack32111/tcp open     tcpwrapped syn-ack35334/tcp filtered unknown    no-response38222/tcp filtered unknown    no-response49152/tcp open     unknown    syn-ack49329/tcp filtered unknown    no-response62694/tcp filtered unknown    no-response65389/tcp open     tcpwrapped syn-ack65470/tcp open     tcpwrapped syn-ack65518/tcp open     unknown    syn-ack
Nmap done: 1 IP address (1 host up) scanned in 464 seconds

大多数服务与Golf上的相同。某些方面可能有所不同(比如端口号),这可能是由于奥迪使用的是MIB IVI系统的较旧型号。但更重要的是:我们发现的易受攻击的服务也是可达的,并且存在同样的漏洞!

攻击者只能在车主启用了奥迪Connect服务,并且所在国家的ISP允许客户端到客户端通信或分配公共IPv4地址的情况下滥用此漏洞。

总结到目前为止的研究:我们已经通过互联网实现了对MMX的远程代码执行。从这里,我们也可以控制RCC。下一步将是通过总线发送任意CAN消息,看看是否能够到达任何安全关键组件。


Renesas V850
RCC单元并不是直接连接到CAN总线的,它有一个串行连接(SPI)到一个单独的芯片,该芯片负责所有CAN通信。这个芯片由瑞萨制造,使用V850架构。

该芯片上的固件不允许发送任意CAN消息。它有一个API,允许发送有限数量的消息。很可能,网关中的任何漏洞都会要求我们发送不在列表上的消息,这意味着我们需要一种方法让瑞萨芯片为我们发送任意消息。瑞萨芯片的读取功能已被禁用,这意味着无法轻易从芯片中提取固件。

MIB系统确实具有软件更新功能。为此,需要插入包含新固件的SD卡、USB驱动器或CD。更新序列由MMX单元发起,该单元负责挂载和处理所有可移动媒体。当检测到新的固件映像时,更新序列就会开始。

更新使用RSA签名,但未加密。签名验证由MMX单元完成,之后它会将相应的更新文件传递给RCC和瑞萨芯片。RCC和瑞萨芯片信任MMX单元已经完成了签名验证,因此不会再次验证其新固件的签名。可以通过RCC单元(使用mib2_ioc_flash)来启动Renesas V850芯片的更新。

固件映像很难获得。它们只提供给官方经销商,而不是终端用户。然而,如果能够获取到固件映像,理论上就可以对瑞萨芯片的原厂固件映像进行后门处理,以允许发送任意CAN消息,并从RCC单元闪存这个新的固件。

下图显示了到目前为止的攻击链:



Gateway
通过对瑞萨芯片植入后门,我们能够在CAN总线上发送任意CAN消息。然而,我们连接的CAN总线是专门用于IVI系统的。它直接连接到一个CAN网关;这是一个用于在不同CAN总线之间防火墙/过滤CAN消息的物理设备。
网关位于方向盘后面,通过一个连接器连接,该连接器上连接了所有不同的总线。

网关的固件是经过签名的,因此对这个芯片植入后门是不可行的,因为它会使签名失效。此外,刷新固件只能通过调试总线(ODB-II端口)进行,而不能通过IVI CAN总线。如果我们想绕过这个芯片,就需要找到固件中的可利用漏洞。为了实现这一目标,我们的第一步将是尝试使用物理向量从芯片中提取固件。然而,在仔细考虑后,我们决定在这个阶段停止研究,因为这可能会侵犯制造商的知识产权,并且可能违反法律。


USB vector

在发现了远程向量之后,我们还发现了一个尚未探索的第二个向量。出于调试目的,MMX单元识别几个USB转以太网适配器作为调试接口,这将创建一个额外的网络接口。看来这个网络接口也会提供易受攻击的服务。配置可以在/etc/usblauncher.lua中找到:

-- D-Link DUB-E100 USB Donglesdevice(0x2001, 0x3c05) {    driver"/etc/scripts/extnet.sh -oname=en,lan=0,busnum=$(busno),devnum=$(devno),phy_88772=0,phy_check,wait=60,speed=100,duplex=1,ign_remove,path=$(USB_PATH) /lib/dll/devnp-asix.so /dev/io-net/en0";    removal"ifconfig en0 destroy";};
device(0x2001, 0x1a02) { driver"/etc/scripts/extnet.sh -oname=en,lan=0,busnum=$(busno),devnum=$(devno),phy_88772=0,phy_check,wait=60,speed=100,duplex=1,ign_remove,path=$(USB_PATH) /lib/dll/devnp-asix.so /dev/io-net/en0"; removal"ifconfig en0 destroy";};
-- SMSC9500device(0x0424, 0x9500) { -- the extnet.sh script does an exec dhcp.client at the bottom, then usblauncher can slay the dhcp.client when the dongle is removed driver"/etc/scripts/extnet.sh -olan=0,busnum=$(busno),devnum=$(devno),path=$(USB_PATH) /lib/dll/devn-smsc9500.so /dev/io-net/en0"; removal"ifconfig en0 destroy";};
-- Germaneers LAN9514device(0x2721, 0xec00) { -- the extnet.sh script does an exec dhcp.client at the bottom, then usblauncher can slay the dhcp.client when the dongle is removed driver"/etc/scripts/extnet.sh -olan=0,busnum=$(busno),devnum=$(devno),path=$(USB_PATH) /lib/dll/devn-smsc9500.so /dev/io-net/en0"; removal"ifconfig en0 destroy";};
但是即使没有这项服务,telnet也已启用。所使用的QNX版本仅支持descrypt()进行密码散列,其字符上限为八位。有人可以使用像crack.sh这样的服务,只需100美元,利用FPGA在不到三天的时间内搜索整个密钥空间。我们发现密码在不同车型/版本之间会有所变化;但我们认为,在时间和金钱上,建立一个包含所有MIB IVI不同版本的所有密码的字典是可行的。
这个向量似乎适用于所有使用MIB IVI系统的车型,无论其版本如何。由于大众集团拥有多个汽车品牌,像IVI这样的组件经常在不同品牌之间重复使用。因此,这个向量很可能会在Seat和Skoda等品牌的汽车上也适用。
我们通过改变Nexus 5手机上的一些内核参数来测试这个向量。这无需刷新即可完成,只需要root权限。将手机插入后,它会被识别为以太网适配器,MMX单元将初始化一个调试接口。




安全脉脉
我们致力于提高车联网安全的意识,推动行业发展,保护车辆和驾驶者免受潜在威胁的影响。在这里可以与车联网安全领域的专家和爱好者分享知识、深入思考、探讨标准法规、共享工具和讨论车联网热点事件。
 最新文章