在这篇博客文章中,将讨论由Argus Research Team发现的博世Drivelog Connector OBD-II Dongle的漏洞。这些漏洞使我们能够使用Drivelog平台停止移动车辆的引擎。
2017年2月20日,Argus根据责任披露政策,我们发现这些漏洞后,通知了博世我们发现的漏洞报告。在2017年2月21日,博世的产品安全事件响应小组(APIRT)联系Argus,并开始解决这个问题。
我们发现了以下两个漏洞:
中间人攻击允许我们快速隐秘的强制PIN脱机,并通过蓝牙连接到加密狗。一旦连接到加密狗,加密狗的消息过滤器中的安全漏洞可以让我们能够将恶意代码注入到车辆CAN总线。
在我们的研究中,我们能够在蓝牙范围内关闭移动车的引擎。在一般的意义上,由于我们可以使用加密狗将恶意消息注入到CAN
总线中,所以理论上我们能够操纵网络上的其他ECU
。如果有恶意攻击者在网络上实施这种攻击方法,我们估计这可能对大多数车辆造成物理影响,严重的可能影响到车辆上人员的安全。
这篇文章介绍了Drivelog加密狗及其附带的移动应用程序的基本设置和功能。我们将按照研究的顺序进行描述。也就是说,首先我们描述我们如何发现消息过滤器中的潜在安全漏洞,然后我们将描述我们如何发现加密狗和应用之间的认证过程中的中间人攻击。这就是我们要描述的一个完整的攻击流程。
近年来,网络安全研究人员已经展示了许多黑客如何入侵物联网(物联网)设备的例子。例如,Mirai恶意软件入侵控制日常路由器和远程摄像机来创建僵尸网络,而多年来配置不当的智能冰箱已成为广泛的垃圾邮件运动的一部分。汽车hacking被认为是CIA工具包的一部分时,汽车hacking获得了更多的关注,可能汽车就是下一个攻击目标,无论这是否为真的。
此外,近几年来,几乎所有主要品牌都成为了黑客的受害者,对汽车的网络攻击已经成为头条新闻。到目前为止,最广泛的黑客攻击是在2015年夏天发生的,当时查理·米勒和克里斯·瓦拉塞克(Chris Valasek)队吉普车进行了攻击,其严重的安全隐患导致首次被召回超过140万辆。
像其他的物联网设备一样,通过“Drivelog Connect”扩展其服务范围。这项新服务随时告知司机汽车车辆状况,这只是为了更简单的生活方式。它可以通过蓝牙连接到汽车的OBDII
端口,此连接器可以将有关车辆状况的任何重要信息发送到用户智能手机上安装的Drivelog Connect应用程序中,并且如果需要维修服务,它可以引导驾驶员到Drivelog程序中最近的一个车间或经销商。两个Drivelog加密狗型号可用于私人和商业车辆,唯一的区别是加密狗连接的CAN总线数量。为了与加密狗进行通信,我们下载了Drivelog Connect应用程序,该应用程序通过蓝牙连接到加密狗,并使驾驶员能够查看车辆健康状况,跟踪旅行数据等。Drivelog Connect应用程序适用于Android和iPhone。由于Android操作系统的开放性,我们在研究期间主要专注于Android版本。
我们必须做的第一件事是让Drivelog加密狗和移动应用只在实验室中工作,而不用到外面测试。因此,我们的第一件事情是重新创造一个汽车环境,以迷惑加密狗以为在公路上工作。
为此,我们通过在加密狗连接时通过记录和分析实际车辆的CAN
总线1流量来观察加密狗所需的数据。因为Drivelog Dongle支持各种厂商制造的汽车和车型,所以我们假定它只能使用ODBII PID(汽车OEM厂商广泛支持的标准化诊断信息的一部分),这很容易在(特定于OEM的)CAN
总线内模仿出交通情况。
基本思想很简单:首先,将加密狗连接到车辆,识别加密狗发送的PID
请求,记录车内的响应; 接下来,我们需要在实验室中模拟一辆车辆 – 当加密狗发出请求时,我们重播了汽车上记录的响应,这将误导加密狗以为行为正常。
在查看了通过CAN
总线发送的所有PID
消息之后,我们构建了一个请求的响应字典,这允许我们模拟汽车的正常车载消息。在加密狗在实验室环境中工作时,我们将注意力转移到Android应用程序上,在反编译了Java
二进制文件之后,我们就可以开始对源代码进行审查了。
在查看反编译的Java二进制文件中,我们观察到了几个问题。尽管来源的很大一部分符号已经被剥离,并用连续的字母名称(例如a(),b(),c()
)替换,但是我们还是能够找到大量的文本调试日志打印(如下图),这使得了解代码更容易。在进一步的审查里面,我们发现存在于代码的调试日志被禁用,而且调试消息不会写入Android系统消息日志中。由于功能日志对于逆向工程非常有用,我们将应用程序反编译为Smali
,这是一个易于观察的Java
字节码表示法,并修补了应用程序以审查这些日志。
我们注意到,Drivelog应用程序以及其他功能可以更新加密狗的固件。事实上,一旦检测到固件更新可用,DriveLog应用程序将不允许连接到加密狗,直到固件更新完成。这是一个聪明的方法,它确保了更新实施更加快速。
掌握加密狗的固件将使我们能够审核其代码并秘密地获得远程代码执行功能。在观察应用程序的行为及其与加密狗之间的通信情况之后,我们发现固件更新在传输过程中被加密,而且只能被加密狗本身解密。这意味着获得固件虽然仍然可能,不过这可能需要大量的测试,这导致我们寻找其他潜在的攻击向量。
现在我们知道了它保护固件的加密技术,我们决定把重点放在一个较难消耗的攻击向量上,例如一个受到威胁的智能手机:如果攻击者具有通过root
访问司机的手机以及可以通过Drivelog应用程序与加密狗进行通信的能力有多大的危害。
为了理解使用的协议,我们在蓝牙通信中进行了监听。我们了解到加密狗和应用程序之间传递的数据已被加密(我们通过查看反编译的源代码来确认)。为了解决这个问题,我们向Android应用程序添加了另一个补丁,该应用程序镜像了UDP
上的所有蓝牙通信,并使我们能够观察到应用程序和加密狗在加密狗发送CAN
总线消息时如何通信。
应用程序和加密狗之间的协议,如我们的补丁所反映的那样,如下图所示:
在上面的图2中,应用程序发送的消息被标记为TX
,而由加密狗发送给应用程序的消息被标记为RX
。通过比较蓝牙和CAN
总线消息,我们可以看到应用程序使用REQ
命令来请求加密狗发送CAN
总线消息。REQ
命令之后的数据恰好是在CAN
总线被填充到长度8(CAN总线帧的最大长度)之后发送的数据。
例如,“ REQ 2 1 C
”是一个引擎RPM
查询(根据Wikipedia中关于OBDII PID的文章)。在MSET
命令中,由加密狗发送的CAN
总线消息ID设置为每个会话一次,这似乎是一个初始化命令(例如,在上图中,消息ID设置为0x7DF
– 注意“22 7DF
”部分所述MSET
的有效载荷)。MSET
设置适用于之后的所有后续命令(在上面的图中,所有REQ
命令将发送ID具有0x7DF
的CAN
总线消息)。MSET
命令还设置CAN
总线波特率,要忽略的消息ID以及其他参数。
因此,看来Drivelog应用程序至少在一定程度上控制了由加密狗传输到CAN
总线的消息ID和内容。
在逆向加密狗蓝牙协议之后,我们向Drivelog应用程序添加了另一组补丁,允许我们通过UDP
将任意消息从桌面隧道发送到应用程序加密狗上。使用此设置,我们通过通信协议手动测试了加密狗上的安全规则,并发现了两个重要的规则:首先,攻击者可以控制消息ID,并使用扩展消息ID,没有任何限制; 接着,我们发现加密狗在其第二个字节中拒绝包含无效值的消息(大致上只允许1-10个)。如果查看典型的诊断请求消息,这种限制是有道理的:第一个字节是ISOTP数据包长度,第二个字节是服务标识符。
因此,将可能的服务标识符限制到上面的子集,有效地允许加密狗仅使用PID
(而不是其他类型的诊断通信)。另外,加密狗所有消息发送的长度为8,所以不能将任何其他长度的消息发送到CAN
总线。
除非攻击者愿意使用OEM
特定的消息,否则可能不符合任何已知的结构,只允许特定的诊断服务ID
(实际上只有PID)严重限制了攻击者的选择。
这给我们带来了第一个漏洞。如上所述,当攻击者不能发送具有无效服务ID的诊断消息时,攻击者可以使用通过过滤器的OEM
专用消息来对车辆产生物理攻击。
例如,查理·米勒和克里斯· 瓦莱斯克在他们的论文“ 汽车网络和控制单元中的冒险 ”中展示了如何通过记录和重播CAN
流量来检测OEM
特定的消息,迭代地改进记录,直到一小部分负责特定功能消息被发现。鉴于Drivelog平台支持的汽车制造商和车型数量众多,加密狗的消息过滤器不可能防止全部的恶意诊断,但可以防止攻击者尝试发送的其他恶意的CAN
消息。
Argus采用的另一种方法是模糊(fuzzing
),为了通过根据预期的模式自动发送CAN
消息给汽车,来观察汽车所有的情况和影响。根据我们的经验,模糊CAN
总线消息可能会损坏或永久损坏汽车,这使得这种研究方法成本高昂。然而,攻击者可以跳过昂贵的研究,并将随机消息作为一种攻击形式发出,期望(并且合理地)至少其中一些将导致汽车及其乘客持续受到伤害。
为了测试我们对加密狗消息过滤器是否完全理解,我们尝试使用Argus
拥有的测试车辆之一来执行此类攻击。在测试期间,我们成功利用了Drivelog加密狗中的漏洞,发送了一条CAN
总线消息,在汽车运行时关闭了汽车的引擎。根据我们所讨论的汽车的品牌和型号,可能以后会有更多的攻击。
这里总结一下第一个漏洞,在消息过滤器中的安全漏洞,允许攻击者控制司机已经root权限的手机上发送CAN消息诊断消息的一小部分范围之外的恶意消息(即,OBDII PIDs
),其可以对车辆产生物理攻击。
我们发现的第二个漏洞放大了第一个漏洞,并且消除了对受感染电话的需求。
在上一节中,我们假设攻击者可以访问受感染的手机。现在我们开始探讨是否有更简单的方法发送生成CAN
消息的加密狗命令。为了复制读写访问我们不得不通过有后门的智能手机,我们将注意力转移到了Drivelog加密狗和Android应用之间的身份验证过程。
在用户体验方面,加密狗和应用程序之间的配对过程很简单,用户从该区域的蓝牙设备列表中选择加密狗,并在提示时输入刻在加密狗上的PIN码。然而,在对反编译源进行了审查后,我们发现这个过程要复杂得多:
配对过程包括以下步骤:
Just-Works
蓝牙连接到加密狗,并请求加密狗的证书(加密狗的公钥和签名的二进制字符串),然后加密狗响应请求,发送证书。PIN
发送到后端服务器。PIN
码。成功验证后,加密狗将加密狗证书和随机数发送到Android应用程序。PIN
相匹配的PIN
码。PIN
和加密狗证书中包含的PIN
码后,Android应用程序会签名加密狗的随机数。上述过程是对身份认证过程中发生的大致概述。然而,用于执行认证的实际步骤和机制涉及椭圆曲线Diffie-Hellman匿名密钥交换,并且XSalsa20用于加密信道作为stream
密码。有趣的是,我们不需要了解这些细节就可以发现漏洞。
在步骤1期间,加密狗发送其证书,其中包括其公钥和带符号的二进制字符串,它是以以下字符串计算的SHA256
哈希值的签名结果(按此顺序连接):
MAC
地址PIN
码计算上面的哈希的结果与特定的私钥签名(由加密狗保存); 我们把这个上面称为“带符号的二进制字符串(signed binary string)”。跳过2,3,4这几个步骤,在认证过程的第5步中,智能手机应用程序通过重新计算加密狗的MAC
地址的SHA256
散列,使用用户提供的PIN
和加密狗的公钥来验证符合公开密钥的带符号二进制字符串,如果签名的哈希结果与签名的二进制字符串匹配,则加密狗将被认证。
我们来回顾一下攻击者需要的信息(而不是加密狗的合法用户):
Just-Works
,攻击者可以轻松配对到,并接收包含加密狗公钥的加密狗证书。MAC
地址。SHA256
哈希的公钥。在这一点上,如果攻击者想检查他们是否正确地猜到一个PIN
码,那么他们需要连接加密狗的MAC
地址,攻击者可以猜测PIN
码和加密狗的公钥,计算整个字符串的SHA256
,并验证其在加密狗证书中传递的加密二进制字符串的签名。
一旦攻击者连接到加密狗,攻击者就有足够的信息来猜测脱机的PIN
码。此外,由于暴力破解是在离线状态下的,这里唯一的限制因素是可能的PIN
数。
由于Drivelog Dongle的PIN
码有八位数,因此可能有1亿个PIN
码。单个验证需要SHA256
计算和公钥加密操作。该计算可以使用多个服务器来运行,但现实是,没有必要:一个现代化的笔记本电脑可以使用适当的软件在大约30分钟内(根据Ed25519公钥签名系统的独立基准)运行1一次SHA256
计算和加密。通过多个服务器来暴力破解,可以进一步减少所需时间。
这种攻击的影响是简单而有害的,在连接到加密狗之后,可以快速恢复PIN码,而不需要任何加密知识; 加密狗证书泄漏了相对较短的PIN
码的足够的信息。
在这一点上,我们已经准备好将发现的这两个漏洞组合成一个攻击:我们可以快速爆破PIN
(认证过程中的中间人攻击),然后使用通信通道发送恶意的CAN
总线消息(不安全的消息过滤器) 。
总而言之,攻击流程依次包括以下步骤:
PIN
。CAN
总线消息。如果攻击者想要造成伤害,可以发送随机的CAN
总线消息,很有可能成功地影响车辆,使其出现车祸。
虽然本博客的重点是描述在Drivelog Dongle中发现的漏洞,但在安全性方面,Drivelog平台(包括加密狗和移动应用程序)却做了很多事情。
加密狗不会暴露任何物理接口(例如,其JTAG
被禁用),并且使用加密狗负责解密固件升级(即,攻击者不容易访问加密狗固件)。
此外,加密狗,Drivelog Connect应用程序和后端服务器之间的所有通信都是加密的,系统设计清楚地强调了加密安全性。
然而,这一发现说明了有关汽车网络安全的以下基本原则:
*作者:ALEXEI KOVELMAN,