随着智能汽车设备的出现,这些设备之间的数据通信变得越来越重要。SOME/IP是一个轻量级协议,用于促进进程/设备间的通信,它支持程序性调用和事件通知。由于其简单性和性能,SOME/IP正被越来越多的汽车设备所采用。因此,SOME/IP应用的安全性变得至关重要。
然而,由于服务器端测试程序难以并行等各种挑战,以往的安全测试技术无法适应漏洞检测SOME/IP应用程序的场景。针对这些挑战,我们提出了一种用于SOME/IP应用的灰盒模糊器Ori,它具有两个关键的创新:附加模糊模式和结构突变。附加模糊模式使Ori能够有效地测试服务器程序,而结构突变使Ori能够生成有效的SOME/IP数据包,从而有效地到达目标程序的深层路径。评估表明,Ori可以有效地检测SOME/IP应用中的漏洞,而且效率很高。
I.简介
近年来,汽车行业对联网车辆的数据通信需求不断增加。数据交换量越大,对底层通信协议的带宽要求就越高,这对车辆中现有的广泛使用的通信协议(如CAN、LIN、FlexRay等)提出了挑战。现有协议的局限性导致需要采用新的通信协议来支持汽车工业的新趋势,而汽车以太网是一个很有前途的解决方案。可扩展的面向服务的IP中间件(SOME/IP)是广泛用于汽车通信的新协议之一;它支持远程程序调用、事件通知和事件的发布/订阅。越来越多的汽车设备正在采用SOME/IP来促进进程间/设备间的通信。随着SOME/IP的出现,对SOME/IP应用的漏洞检测变得至关重要。
在过去的十年中,模糊法在漏洞检测方面显示了它的潜力,并被用来发现开源和闭源软件中的数千个漏洞。此外,研究人员还提出了新的模糊技术来模糊不同的协议实现,如FTP或RTSP 。然而,SOME/IP的独特特征给现有的方法带来了新的挑战。
首先,与FTP或其他运行在普通以太网上的协议不同,SOME/IP和其他汽车以太网协议通常是简单明了的。原因是运行这些协议的设备的计算能力往往是有限的。一方面,协议设计的简单性意味着模糊器不需要像AFLnet那样为协议维护状态机模型;另一方面,计算能力的限制意味着我们需要寻求并行运行多个模糊器来提高模糊的效率。在现有的方法中,每个模糊器实例将管理和运行测试目标的唯一实例。然而,如果测试目标需要一些独特的资源(如端口、锁文件等)来执行,那么测试目标在每个设备上只能运行一个实例。在SOME/IP中,服务器应用程序通常在每个设备上运行一个实例,这使得执行并行模糊处理具有挑战性。第二,虽然SOME/IP的状态机并不复杂,但是它的数据包仍然需要遵循一定的模式,这意味着模糊器如何对数据包进行突变会显著影响它的有效性。
在这项工作中,我们提出了一个新的灰盒模糊器,称为Ori,以解决这些挑战。该模糊器采取了两种策略,以适应SOME/IP在汽车行业的使用情况。第一种策略被称为附加模糊模式。通过附加模糊模式,Ori的几个模糊器实例可以共享一个目标进程进行测试。这种策略使Ori能够有效地测试SOME/IP服务。第二种策略被称为结构性变异。这种策略允许Ori逐一突变SOME/IP数据包的字段,而不是将整个数据包作为一个整体进行突变。此外,结构突变防止Ori产生过多的无效数据包,从而提高了Ori的有效性。此外,我们实现了这两种策略,并用VSOME/IP的一个样本程序对Ori进行了评估。评估结果证明了Ori在SOME/IP应用程序中检测漏洞的能力。
工作的贡献总结如下:
•我们提出了两种可以一起应用的横向策略,以提高模糊化SOME/IP应用的效率和效果。
•我们在Ori中实现了这两个新的策略,并使其具有可扩展性,以适应未来的改进。
•我们在一个开源的SOME/IP应用上对Ori进行了评估,评估结果令人满意。
II.背景和相关工作
图1:汽车以太网与OSI层的映射
A.汽车以太网
车以太网源自于办公it领域的以太网协议,该协议引用了IEEE 802.3u标准系列。汽车以太网通过一对双绞铜线以全双工模式运行。因此,汽车以太网与它的IT以太网相比,有一个更直接的硬件设置,同时保持一个合理的高速度。
汽车以太网也很好地融入了7层OSI网络架构。汽车以太网涵盖物理层和数据链路层(图1)。由于其与办公-IT同行的相似性,汽车以太网开启了在以太网之上移植各种现有上层通信协议的潜力。这些上层协议,例如SOME/IP,反过来又为在其上建立复杂的应用提供了进一步的潜力。
B.SOME/IP概述
在众多位于汽车以太网之上的上层协议中,SOME/IP是一个汽车专用协议,通过UDP协议栈提供基于服务的通信。它允许有效地使用单播和多播通信,可用于汽车软件的控制信息。SOME/IP 协议包括远程过程调用(RPC)、服务发现(SD)、服务事件发布/订阅和 UDP 消息分段等功能。这些功能是通过在线表示的数据序列化来实现的。
在序列化过程中,SOME/IP头被预置在有效载荷之前以形成数据包。数据头的格式如图2所示。
它包含以下字段: •MessageID标识了应用层中对事件的RPC调用,它包含2个子字段ServiceID和MethodID; •长度表示从RequestID到SOME/IP消息结束的字节数; •RequestID区分在同一事件中平行使用的数据包,它包含2个子字段ClientID和SessionID; •协议版本确定了所使用的SOME/IP数据头格式; •接口版本包含使用的SOME/IP协议的主要版本; •消息类型区分了SOME/IP协议中的各种消息类型; •返回代码表明一个请求是否被成功处理。
图2:SOME/IP数据包的格式(头文件为红色)
图3:灰盒模糊器的典型工作流程
C.灰盒模糊工作流程
灰盒模糊法是一种广泛使用的检测真实世界程序中漏洞的方法。近年来,灰盒模糊法,如AFL、libFuzzer,已经帮助发现了成千上万的漏洞。
灰盒模糊法的基本思想是应用一些预先设定的生成和变异策略来产生输入到目标程序中,并通过观察监测到的执行过程中的安全漏洞来发现漏洞。图3显示了典型灰盒模糊器的工作流程。通过翻转、替换、加/减位、字节或块,或者根据输入结构进行生成,生成器可以产生输入变量。目标程序通常用某些代码段进行检测,以便在实际模糊测试期间提供覆盖率反馈,这将有助于针对特定的文件输入评估程序的执行。
在AddressSanitizer、MemorySanitizer等净化器的帮助下,执行被模糊引擎监控,以观察是否有安全漏洞。这些违规行为,如内存使用过期、缓冲区溢出等,通常表示实现缺陷,可能导致内存损坏、信息泄露等漏洞。如果违规被触发,相应的文件输入将被用作错误的证明。
同时,如果模糊器发现当前输入有助于提高覆盖率,它将被用于后续的突变。由于执行是重复多次的,并由模糊器控制,因此适用于应用分叉执行模型,以减少加载目标程序的共同序幕代码段的开销,并提高整体模糊性能。
III.方法
A.主要策略
图4:Ori的概况
一般来说,Ori是一个基于突变的覆盖引导灰盒模糊器,这意味着它依赖于检测目标程序来收集执行反馈来帮助模糊。然而,Ori有两个关键特性使其不同于现有的模糊器。
第一个特点是附加模式。当我们使用Ori进行模糊测试时,模糊器被附加到被测进程上。换句话说,我们先启动被测进程,然后运行模糊器与被测进程通信并进行模糊处理。这与以前的模糊器不同,在以前的模糊器中,模糊器负责启动被测过程并管理被测过程的生命周期。图4展示了这个功能的机制。
整个过程可以分成两个步骤,即模糊化设置步骤和多重附加模糊化步骤。在模糊化设置步骤中,被检测的目标程序将在某些条件下分叉出一个模糊化服务器。模糊化服务器是从被检测的原始进程中分叉出来的,它将循环等待传入的模糊化请求。
设置成功后,我们可以运行一个或多个前端模糊器。前端模糊器将与模糊服务器通信,并发送附加请求。一旦模糊化服务器收到请求,它将分叉一个模糊化目标进程,该进程与前端模糊化器一起完成所有其他模糊化流程。一般来说,附加模式消除了加载特定SOME/IP实现的序幕代码段的冗余执行。有了这个功能,Ori通过关注实际的协议逻辑来提高整体性能,同时也提供了调用多个模糊处理实例进行并行模糊处理的能力。
第二个特点是Ori支持种子输入的两级变异。SOME/IP协议的数据包包含两部分:主体和标题。相应地,Ori对不同的部分使用不同的变异算子。通过突变数据包的主体,Ori可以测试SOME/IP服务器的核心逻辑。通过突变数据包的标题,Ori可以测试SOME/IP协议的实现。对于数据包的主体,Ori使用类似于AFL的随机变异操作,如位/字节flipping,替换/添加/删除随机块等。对于数据包的标题,Ori首先识别了不同字段,然后根据字段的类型进行突变。
图5:Ori的详细模糊工作流程
值得注意的是,Ori不对ServiceID、ClientID、Protocol Version和Interface Version字段进行突变。这是因为突变这些字段无助于覆盖测试目标的关键逻辑。
例如,如果数据包的ServiceID字段被突变,不能与测试目标提供的服务相匹配,那么数据包将被立即拒绝,而目标的深层逻辑将不能被行使。有了这个功能,Ori可以生成能够达到目标程序深层逻辑的数据包,并且可以同时测试协议框架和上面的应用程序。
B.详细工作流程
图5显示了Ori中一对前端模糊器和后端目标的详细模糊工作流程。它包含两个阶段:准备阶段和测试阶段。
在准备阶段,模糊器将建立与测试目标的连接,并为测试准备好环境。首先,我们启动目标服务器程序,它将运行到forkserver的状态。然后我们就可以启动模糊器了。模糊器将首先设置基本的模糊环境,如共享内存、输出目录等。之后,模糊器将尝试联系目标程序,以检查其forkserver是否准备好了。如果目标程序已经处于for server的状态,它将通知模糊器,模糊器将开始主模糊循环。准备阶段到此结束。
在测试阶段,模糊器将产生数据包来测试目标服务器并处理测试结果。首先,模糊器将向forkserver发送一个请求,要求它分叉一个新的实例进行测试。这个测试实例从forkerver逻辑被探测到的地方开始执行。
因此,测试实例可以跳过与测试无关的逻辑的执行测试。测试实例开始执行后,它将通知模糊器继续进行。然后模糊器将通过结构突变生成一个新的SOME/IP包,并将其发送给测试实例。收到数据包后,测试实例将处理它。变异的数据标题有助于测试数据包解析组件,而变异的数据包主体有助于测试服务器的业务逻辑。
在测试实例执行完毕后,分叉服务器将收集其退出状态和执行覆盖率信息。然后将收集到的数据报告给模糊器。
Ori的测试结果处理与其他基于覆盖的灰盒模糊器相似。如果该数据包导致测试实例崩溃,模糊器将保留它以便将来分析。如果该数据包能够增加代码覆盖率,模糊器将保留它作为生成新测试案例的种子。这标志着一轮测试的结束。如果用户不停止模糊器或目标服务器,整个过程将继续进行新一轮的测试。
IV.实施和评估
A.实施
Ori由两个关键部分组成:代码检测器和模糊器。代码检测器的实现是建立在AFL的LLVM模式之上的,它通过一个定制的llvm通道检测目标程序。虽然仪表器继承了FL-clang-fast的逻辑来收集代码覆盖率信息,但它的forkserver注入部分被修改了,以方便适应模糊测试的附加模式的逻辑。仪器的修改涉及到大约200行的C++代码。Ori的模糊器是用大约400行Python代码实现的,它依靠scapy库来进行结构突变。
B.评估
测试目标。我们用一个案例研究来评估Ori的两个关键特征。目前,唯一开源的SOME/IP协议框架是GENIVI/vsomeip。因此,测试目标是GENIVI/vsomeip的示例程序的修改版,目前所有的实验都是基于这个程序。
图6:修改后的GENIVI/vsomeip示例程序
这个程序是一个SOME/IP服务器,它接受来自客户端的消息,并将 "Hello "和消息内容作为反馈发送回来。在示例程序中添加了一个崩溃站点,这样,如果客户端发送的消息以小写字母'a'开头,它就会崩溃。示例程序的修改情况见图6,第6-14行。
附加模糊模式。在这个实验中示了Ori所使用的附加模糊模式的优势。首先,可以运行一个例子程序的实例作为forkerver,并附加多个Ori模糊器的实例来并行模糊。然而,如果用AFL对示例程序进行模糊处理,就不能启动第二个模糊器,因为第一个模糊器的测试实例占据了端口。通过比较,证明了并行模糊测试中附加模糊模式的优势。其次,在示例程序启动主上下文后插入分叉服务器逻辑。延迟插入分叉服务器允许每个测试实例从消息处理部分开始执行,并跳过服务器设置过程。
在实验中,Ori可以在1-2秒内完成一个测试案例的执行,而AFL(没有延迟的forkerver插入)至少需要4秒。结果表明,与现有的工具相比,Ori具有明显的速度优势。 结构突变。在这个实验中,展示了结构突变的有效性。对于图6中的举例程序,Ori可以在随机种子输入的情况下,在1分钟内找到崩溃的原因。
然而,AFL无法找到随机种子输入的崩溃。对Ori和AFL来说,正确地改变有效载荷(以小写字母 "a "作为第一个字节)是很容易的,但当涉及到生成正确的标题时,情况就不同了。
正如II-B节所介绍的,在SOME/IP协议中,需要一个带有特定服务ID的有效数据标题,以将数据包正确地传送到一个特定的服务器。由于AFL几乎不可能生成像SOME/IP数据包头这样的复杂结构,所以即使AFL能够生成正确的有效载荷,也不能成功地将数据包传递给测试目标。这表明,结构突变可以极大地提高Ori的有效性。
通过评估,我们可以得出结论,Ori可以通过附加模糊模式和结构变异来有效地检测SOME/IP服务中的漏洞,从而克服现有方法的局限性。
V.未来的工作
目前的工作是为汽车以太网协议构建灰盒模糊器的早期尝试。我们未来的工作包括:
1.模糊更多的现实目标。目前的评估是基于GENIVI/vsomeip的实例程序,因为很少有其他开源的SOME/IP应用程序可用。所以我们计划从行业伙伴那里获得更多的SOME/IP应用,以便对Ori进行更全面的评估。
2.扩展Ori,以支持图1中所示的更多汽车协议。从理论上讲,附加的模糊模式和结构突变可以应用于其他协议。然而,仍然需要加强Ori设计的通用性,使其与不同特性的协议兼容。
3.提高Ori对多线程目标的有效性。在实验过程中发现GENIVI/vsomeip的服务器是以多线程运行的。在多线程程序上进行灰盒模糊处理会很麻烦,因为代码覆盖率反馈可能会被污染。我们计划在未来将MUZZ中使用的技术与Ori进行整合。
VI.结论
本文介绍了Ori--一个用于汽车以太网中SOME/IP协议的灰盒模糊器。Ori有两个创新特点:附加模糊模式和结构突变。附加模糊模式使Ori能够对SOME/IP服务进行并行模糊,从而确保高效性。结构上的突变使Ori能够生成具有适当标题的数据包,从而确保有效性。通过实验表明Ori能够胜任SOME/IP服务的漏洞检测。