摘要:文中提出一种新的算法自动化逆向汽车报文,从而分析私有CAN总线协议消息的流量轨迹,自动的识别和标记不同类型的信号。通过在真实的车辆上进行流量监控及逆行实验测试证明READ可以提取和分类信号,并根据车辆的RFC文档和正式规范进行对比,结果证明READ和其他类似工作相比能分类和提取两倍以上的信号。同时其执行时间缩短了两个数量级。文章通过将 READ 应用于真实车辆生成的 CAN 报文,证明了它在 CAN 流量分析中的实用性。
工作先进性
性能于之前的工作,能提取出两倍以上信号,使用真实报文进行验证。自动对提取出的信号标注描述标签,帮助人工分析。其使用的标签是汽车领域专用的,具有精确的表达能力。
如何评估
记录车辆厂商提供的一辆未改装的特许车辆的 CAN 交通轨迹。收集到的数据属于不同的 CAN 交通轨迹,这些数据是在一天中的不同时间和不同交通状况下,经过几个小时的驾驶过程收集到的。在驾驶过程中,不同的仪表盘按钮和功能在必要时被激活(例如,下雨时的挡风玻璃雨刷器、变道时的转弯指示灯)。收集到的 CAN 交通跟踪数据超过 1.26 亿个 CAN 数据帧,包括约 110 个不同的报文 ID,其中约 70 个为基本格式,其余为扩展格式。
现有工作
自动识别网络流量中特定数据包进行逆向的工作思路分三类:
-
匹配网络数据包中的已知签名
-
分析传输层的源端口号和目的端口号
-
对数据包元数据应用分类算法
这些工作都是为TCP/IP网络设计的,并不适用于汽车领域,因为CAN没有源端口和目标端口,其是广播通信所以也不建立双向通信流,且没有网络层、传输层和应用层的隔离。
Field classification, modeling and anomaly detection in unknown CAN bus networks FBCA试图通过观察共享相同 ID 的报文有效载荷如何随时间演变来提取信号及其边界。不过其提出的启发式方法(首先对字段进行分割并用贪心算法对其进行分类,最后用这些数据训练[TCAM:一种高速存储器,符号数据库]模型进行分类)从未针对真实 CAN 报文进行过测试,其实验评估是基于实验室环境中模拟 ECU 生成的 CAN 流量,而不是真实的车辆。
CAN总线相关知识
任何特定车型的 CAN 报文语法的完整规范都包含在所谓的 CAN 通信数据库(也称为 DBC)中。对于每条 CAN 报文,车辆的 DBC 都定义了其周期时间(许多 CAN 报文都是定期发送的)、生成报文的 ECU、报文的目标 ECU 以及解释报文内容所需的所有其他规格。为此,DBC 包含对所有 CAN 总线报文有效载荷中不同信号的完整描述,包括其边界、编码和测量单位。此外,不同的车辆配置由不同的 DBC 文件描述,因此,即使是同一汽车制造商生产的不同车辆,也无法将相同的 DBC 用于不同的车辆配置和型号。这些正式规格由汽车制造商保密。从攻击者的角度来看,由于缺乏公开规范,因此需要通过逆向工程来确定影响特定功能的 CAN 报文。所有针对CAN报文逆向的研究工作的主要局限性在于能从通用数据包中提取和分析的特征非常少。
CAN 数据帧是一种特殊类型的 CAN 报文,用于在 CAN 总线上传输数据,并被 ECU 用来发送和接收任意有效载荷。不同 CAN 数据帧的结构图如图 1所示。主要字段包括标识符(ID)、数据长度代码(DLC)和数据。ID 用于区分不同类型的 CAN 数据帧。具有特定 ID 特征的数据帧通常只由一个 ECU 生成,用户 ECU 使用 ID 从 CAN 总线上传输的所有 CAN 报文中选择相关的数据帧。ID 还可用于 CAN 报文的仲裁,该字段的数值越小,表示报文的优先级越高。ID 是唯一一个根据 CAN 报文类型而具有不同大小的字段。如图 a 所示,基本格式的 ID 字段固定长度为 11 位,而在扩展格式中(如图 b 所示),ID 长度为 29 位。另外要注意的是,为了实现向后兼容性,扩展格式的额外 18 位与基本格式的 11 位是分开编码的。
DLC 字段大小为 4 位,表示组成数据字段的字节数。由于数据字段的最大长度为 8 字节,因此有效的 DLC 值范围仅为 0 至 8,因此 9 至 15 的值未被使用。
数据字段的最大容量为 64 位,用于表示 CAN 报文的实际有效载荷。一个通用数据帧通常在同一个数据字段中包含多个不同的信号,而 CAN 标准在信号的结构、数量和含义方面给由各个汽车制造商定义,所以在协议未被逆向之前都只能视为一个二进制的字段。
READ算法
算法初介绍
Read算法通过对CAN报文字段中的所有bit进行分析,并对其随时间变化的情况进行评估,最后从CAN流量中提取出个别信号。
ECU中间的通讯是为了将收集到的传感器数据传输给控制车辆的多个子系统控制器。大多是传感器信号是某一物理现象的给定值,如加速减速时车轮的旋转速度,发动机的转速,加速度等,这些信号由于受到人为的影响或者交通状况的影响,所以随时间的变化是不可预测的。但是,虽然这些信号受到物理原本的影响,CAN总线上的报文是具有周期性的(如百分之一或十分之一秒),所以反映上面提到的物理现象的信号的两个连续报文之间的差值不会特别大,且根据其周期时间和物理现象进行变化。以表示左前轮胎转速的 CAN 信号为例,假设该信号每 10 毫秒通过 CAN 总线发送一次。连续的数值必然非常相似,因此只有较低有效位会发生变化。然而,随着时间的推移,轮胎转速会发生显著变化,从而导致信号中较重要的位发生变化。READ分析具有相同 ID 的 CAN 报文有效载荷的有序序列,分析有效载荷的每个比特,以确定连续有效载荷之间比特值变化的频率(比特翻转)。
通过一些算法READ可以达到以下的目的:
-
在具有相同 CAN ID 的报文有效载荷中定义并提取不同信号的边界
-
根据代表信号类型的不同类别对提取的信号进行标记
算法详细介绍
数据准备
创建具有相同 ID 的 CAN 报文有序列表。假设主要输入是 CAN 流量跟踪,其中包括所有通过车辆 CAN 总线传输的 CAN 报文。这个单个轨迹被分成几个子轨迹,每个子轨迹对应于原始输入中包含的每个不同的ID。每个子轨迹仅包含具有单一ID的CAN消息的有效载荷,其顺序与它们在原始输入中出现的顺序相同。由于READ独立地分析每个子轨迹,因此可以在不同的子轨迹上并行运行多个READ实例。
将所有报文中的ID提取出来作为一个列表,然后将每个轨迹划分为多段,每段只有单一ID的报文,然后独立的分析每一个子轨迹。
read算法处理步骤
不依赖于任何关于消息有效载荷性质的先验知识,也不依赖于有效载荷内编码的信号。输入是上一步的子轨迹,输出是通过对子轨迹分析得出的信号列表,边界和描述信号类型的车辆领域专用标签。
数据预处理
计算每个payload的比特反转率,与其相邻bit无关。READ 对连续信息中出现的比特翻转(从 0 到 1,反之亦然)次数进行计数。然后将比特翻转次数除以有效载荷数,就得到了比特翻转率。这一阶段的结果是一个由 n 个元素组成的数组,每个元素代表给定 ID 数据字段单个比特的比特翻转率,其中 n 代表由 DLC 字段值定义的有效载荷中包含的比特数。READ 对连续信息中出现的比特翻转(从 0 到 1,反之亦然)次数进行计数。然后将比特翻转次数除以有效载荷数,就得到了比特翻转率。这一阶段的结果是一个由 n 个元素组成的数组,每个元素代表给定 ID 数据字段单个比特的比特翻转率,其中 n 代表由 DLC 字段值定义的有效载荷中包含的比特数。该中间结果是用于计算另一个n个元素的阵列的输入,该阵列被定义为幅度阵列。 用于计算幅度阵列的公式M_i = [log_{10}(B_i)],其中M_i是幅度阵列的第i个元素,B_i是位翻转阵列的第i个元素。幅度阵列的值表示有效载荷的每个比特的比特翻转率的不同数量级。
信号识别
中间算法伪代码略过,计算比特翻转率和幅度阵列的目的是识别信号的边界。这个过程包括两个阶段。第一阶段仅考虑幅度阵列,并且产生信号边界的初步列表作为输出。第二阶段利用这些初步边界和比特翻转率来识别每个信号的精确边界并根据其性质标记它们。
第 1 阶段:在这一阶段,幅度阵列用于定义初步信号边界。算法扫描幅度阵列,寻找连续比特对,其中第一个比特的比特翻转幅度高于第二个比特。一旦发现类似的比特对,就会在这两个比特之间设置初步边界。这种方法对于识别代表物理值的信号的边界非常有效,因为比特翻转幅度的下降是由于紧随相邻信号最显著位的信号的较低显著位造成的。
第2阶段:第二阶段将上一阶段确定的初步边界和比特翻转率阵列作为输入,识别并正确标记不代表物理值的信号。汽车制造商通常会在安全关键信息的有效载荷中加入元数据,以实施两种有效抵御基本重放攻击的保护策略。一些汽车制造商采用的常见解决方案包括两种额外类型的字段: 计数器和 CRC。由于这些元数据与其他传递物理值的信号一起编码在 CAN 报文的有效载荷中,因此有助于分析人员快速识别和区分它们。这就是定义专门用于识别计数器和 CRC 的方法的基本原理。
计数器
计数器具有两个独特的特征可以用于将他们从正常报文数据中区分出来:①最不显著位的大小等于 0,(从幅度阵列中可以看出),因为它具有位翻转概率1;②元素的位翻转率从最显著位到最不显著位每一步都翻倍,在最不显著位达到 1。
一个 4 位计数器的比特翻转率如下:[0.125, 0.25, 0.5, 1]。使用幅度阵列计算公式得出的幅度阵列为 [0, 0, 0, 0].。由于幅度值不会发生变化,因此阶段 1 无法识别其边界,计数器仍将嵌入其他信号中。由于比特翻转率根据所定义的启发式而变化,因此计数器边界将由阶段 2 正确识别。
CRC
CRC 信号包含对报文有效载荷进行循环冗余检查的结果,用于检测安全相关信号中的随机传输错误。CRC 信号包含在 CAN 报文的有效载荷中,不能取代(也不应误认为)CAN 数据帧有效载荷后面的 CRC 字段(即实际上有两段CRC,一段在报文后面,是公开的算法,一段在payload里面是厂商自行设置的)。计算有效载荷后面的 CRC 的算法是公开的,并在 CAN 总线规范 中进行了说明,而用于评估报文payload中的 CRC 信号的算法则是专有的。其具有两个独特的特点:
①bit阵列幅度为0
②所有比特的比特翻转率按照以0.5为中心的正态概率分布分布。
CRC 字段的边界在第一阶段也无法检测到,在第二阶段通过寻找上述比特翻转率模式来识别。如果找到这种模式,就会设置精确的边界,并将信号标记为 CRC。
READ算法的最终输出是在输入 CAN 流量跟踪中发现的所有 ID 的列表,其中每个 ID 都与 READ 识别出的信号数量及其边界相关联。此外,每个信号都被归类为物理值、计数器或 CRC。
关于READ算法的分析
计算复杂性、正确性和收敛性。
READ一共有三个处理动作;预处理、一阶段识别、二阶段识别。
预处理阶段的计算复杂度取决于所分析 CAN 报文的有效载荷大小和轨迹中包含的报文数量。虽然不同 CAN ID 的有效载荷大小不同,但具有相同 ID 的所有报文的有效载荷大小是不变的。且payload的边界值 64 作为恒定值。外循环执行的迭代次数与分析流量跟踪中的报文数量呈线性增长。因此,预处理步骤的计算复杂度与报文数量呈线性增长。
第 1 阶段的计算复杂度只取决于有效载荷的大小,因此这一步的计算复杂度是恒定的。第 2 阶段的计算复杂度取决于第 1 阶段提取的信号数量。虽然信号数量事先并不知晓,但它受到有效载荷大小的限制。因此,第 2 阶段的计算复杂度也是恒定的。
结论:READ 的总体计算复杂度与分析信息的数量呈线性增长。
对于 READ 和任何数据驱动的逆向工程方法来讲,收敛性和正确性是相关的。如果 READ 的还原出的结果与真实CAN 报文的形式规范一致,则 READ 的结果是正确的。而 CAN 报文代表的是厂商的一种任意的设计选择,而不是在理论上的正确或最佳解决方案。只有在分析了大量报文后,READ 才能收敛到正确的结果。在最坏的情况下,READ 分析的所有报文都具有相同的有效载荷值。由于相似的信息序列的条件熵等于 0。因此,无论READ或者是任何其他算法都无法通过分析信息序列获得任何知识,无论其获取到的信息序列的长度有多长。在这种最糟糕的退化情况下,所有逆向工程算法都不会收敛到正确的解决方案。(即任何逆向工具在报文量不够的情况下都不可能完全逆向协议信息,属于废话)
在最佳情况下,READ 只需极少量的信息就能获得最佳结果。理想状况下,READ 只需要两个连续值就可以正确提取和标记物理信号,其中只有最小有效位翻转,而其他位保持不变,与信号大小无关。对于 CRC,READ 只需分析两个连续值,其中所有比特都会翻转,与信号大小无关。对于大小为 c 位的计数器,在最佳情况下,READ 需要分析 2^c/2 + 1 个连续值。假设一个4 位计数器的实际情况。READ 可以通过观察从 0 到 8 的 9 个连续值来正确提取和标记这些信号。因此,在这种乐观的情况下,READ 为收敛到正确结果而必须分析的信息数量的理论下限是 9。现实中,信号值的变化受到许多不可估量和不可预见因素的影响,如驾驶路径、交通状况和驾驶方式等,所以read的效果也是不可预估的。
评估方法
和另外一篇文章中的工作做对比,用3个指标对其进行评估:
-
信号提取和标记的正确性:测量算法能够正确提取和标记的信号的数量
-
执行时间:两种算法的计算成本
-
两种算法在达到最佳信号提取和标记性能之前需要分析的消息数量
数据集
使用两个数据集,一个是合成报文(根据网上的人工逆向出来的规则合成的报文),另外一个是从车上记录的真实报文(和厂商合作,最后拿着别人给的规范文档作为答案去对)。
合成数据集包括通过算法生成的 CAN 报文。尽管缺乏公开的正式规范,但为了保证高水平的真实性,使用讴歌 ILX 2016 CAN 报文的信号边界作为参考,该信号边界值可在网上查询到,并由 Comma.AI的研究人员进行了人工逆向工程。逆向工程的结果是有许多 CAN ID 的大部分有效载荷未分析。为了进行评估,READ的研究人员选择了三个 CAN ID,对其进行逆向工程后定义了几乎完整的报文规范。所选报文的 ID 分别为 158(动力总成数据)、1D0(车轮速度)和 201(气体传感器)。
最终的合成数据集由 1 500 000 条信息组成,三个 ID 各有 500 000 条信息。信号值通过算法生成。真实数据集由 25 个不同的 CAN 交通轨迹组成。这些轨迹是从授权车辆上采集的,该车辆在真实道路上的不同行驶条件下受到真实交通状况的影响。整个数据集包含超过 14 个小时的数据和超过 1.25 亿个 CAN 数据帧。最长的跟踪时间约为 38 分钟,最短的跟踪时间约为 32 分钟。
标记和提取信号
评估READ有两个关键指标,第一就是是否能在长的消息序列中将不同的报文信号划分出来,即定义其中的边界。在这一步中,不知道为什么对于合成出来的数据READ全部分类成功但是FBCA全部失败。
另一个指标是 READ 算法正确关联到提取信息的标签数量。READ 和 FBCA 使用两套不同的标签: READ 将信号标记为物理、计数器和 CRC,而 FBCA 将信号标记为常数、多值和计数器/传感器,所以这两种工具无法直接进行比较。READ生成出的标签包含了语义信息,FBCA生成的标签只能形容信号随时间变化的规律或者说趋势。 所以只有 READ 生成的标签才能与 CAN 报文正式规范所代表的意义进行比较。FBCA 在上一步中无法从合成数据集中正确提取任何信号。所以作者只对 READ 正确提取的信号进行标注正确性评估。对于 ID 158,READ 正确地将前四个信号标记为物理信号,第六个信号标记为计数器信号,第七个信号标记为 CRC 信号。对于 ID 1D0,READ 正确地将前四个信号标记为物理信号,第五个信号标记为 CRC。对于 ID 201,READ 正确地将前两个信号标记为物理信号,第四个信号标记为计数器信号,第五个信号标记为 CRC 信号。由于评估是基于不完整的规格,无法验证 ID 158 的第五个信号和 ID 201 的第三个信号的标记。
在现实的报文中进行测试的过程中发现,READ和FBCA在不同的轨迹的表现不同。这是因为每个轨迹中的CAN报文数量不同,且相同的报文在不同的轨迹中的值也不同。总的来看READ正确识别出来的信号比FBCA多。
使用相同的流量测试READ和FBCA,在25次实验中,READ最差的结果都比FBCA的最好结果识别出的信号数量多两倍。针对不同的ID的报文,研究者设计了对比实验,因为不同类型的报文在嵌入信号的数量、位置和类型方面的结构不同。结果证明在60%的ID READ的表现都更好。(65个READ更好, 45个相同结果)。
文中提到:“显示了三个具有代表性的真实报文 ID,对于这些报文 ID,READ 和 FBCA 都无法提取出一个正确的信号。这些信息 ID 的有效载荷在所收集的流量跟踪中从未发生变化(所有比特的比特翻转率始终等于 0)。”在实验中也有一些完全无法被识别的信号,这些信号一般都是与物理现象无关的,比如风扇速度和空调的报文(估计是因为这些报文的变化都是非线性的,所以无法使用统计特征进行识别),与其车身物理状态变化无关。
对于READ给数据打的标签的评估
READ 正确标注的计数器和 CRC 信号数量在所有不同轨迹中的变化很小。这意味着用于识别这些字段的启发式方法能带来稳定的结果。但是,代表物理值的信号的正确标注在所分析的交通轨迹中的表现却变化很大,从最差情况下的 104 个到最佳情况下的 149 个不等,中位数为 129 个。这种差异的原因是与每个交通轨迹相关的驾驶风格、路况和长度各不相同。最差情况下,READ 也能正确标注 90% 以上的提取物理信号,而在最佳情况下,它能正确标注 98% 以上的物理信号。在这两种情况下,计数器和 CRC 标记的结果完全相同(正确标记率分别为 85.71% 和 96.00%)。
执行速度评估(省略)
收敛性评估
这里的收敛性是指两种算法需要多少连续的信息才能达到最佳效果,由于这两种算法都是通过观察有效载荷随时间的变化来学习信息边界的,因此必须用足够数量的信息来训练它们,以获得良好而稳定的分类结果。。评估方法是从可用的 CAN 流量跟踪中提取每个 ID 的前 N 个报文,对其应用提取算法,并评估正确提取信号的数量。
结果为在100000以上的时候,两个都能达到最佳效果,但是即使训练集中只有 100 个报文,READ 也能正确提取出 61 个正确报文,而 FBCA 只有 52 个。总之,实验评估结果表明,READ 比 FBCA 性能更好,执行时间更短,收敛要求也相当低。
真实的例子
没什么特别的
如果训练的 CAN 流量包含攻击者注入的非法 CAN 报文,那么 READ 的性能可能会下降,这取决于攻击的性质。我们记得,READ 需要对每个 CAN ID 的约 100.000 条 CAN 报文进行分析,才能达到其峰值性能(见第 V-D 节)。如果这些迹线包含有针对性的攻击,包括注入少量非法 CAN 报文,那么它们对通过训练迹线的所有报文计算出的比特翻转概率的影响将可以忽略不计,因此 READ 的性能不会受到类似攻击的影响。如果攻击者设法注入成千上万条非法信息,它们可能会导致比特翻转概率发生重大变化,从而可能对 READ 的准确性产生不利影响。
未来展望
设想了引入新的启发式方法的可能性,这些方法能够自动识别信号的特定值,并向领域专家提出更精确的标签。其中一些启发式方法可能是 READ 的简单增量演变。以包含四个车轮速度的信息为例。在我们分析的所有车辆中都存在类似的信息,因此可以很容易地在 READ 中集成一个额外的启发式方法,该启发式方法可以识别包括与车轮速度信息大小相同的四个强相关物理值的信息。如果外部信息源(如 GPS 传感器)也可用,则可将其与 READ 的输出相关联,以自动识别描述车辆动态(如速度和加速度)以及驾驶员活动(如操纵方向盘、刹车和油门踏板)的安全相关物理值。READ 的进一步扩展功能包括以时间序列的形式自动可视化所有提取信号的值,并突出显示强烈的正相关和负相关,以及点和上下文异常。所有这些对 READ 输出的利用都不在本文的讨论范围之内,将作为未来工作的一部分。