01
引 言
随着汽车行业对于数据通信的需求不断增加,SOME/IP作为支持汽车以太网进程和设备间通信的一种通信协议应运而生。根据研究[1]表明,第一代使用SOME/IP的汽车以太网包含了几个交换机和少量以太网ECU,每个ECU提供了十余种服务。SOME/IP具有轻量化、高效、以接收方的需求为主导的特点,并且能够提供过程调用和事件通知,逐渐被多种汽车设备所使用。然而,正是由于其被广泛使用和其重要性,SOME/IP协议也成为了潜在的攻击目标。本文将介绍SOME/IP协议的基本原理,并探讨可能的攻击方式和防范措施。
02
SOME/IP协议
可扩展的面向服务的IP中间件(Scalable service-Oriented MiddlewarE over IP,简称SOME/IP)[2]是一种中间件规范,专门用于传输和序列化控制信号,特别是在汽车应用场景中。SOME/IP建立在(汽车)TCP/IP或UDP/IP协议栈之上,为应用程序提供了一个抽象的面向服务的接口(参见图1)。因此,应用程序无需处理IP地址和端口,而是使用服务进行通信。SOME/IP的主要目标是实现灵活且带宽高效的通信。
图 1 SOME/IP架构
SOME/IP可以大致分为三个部分:服务发现(Service Discovery,SD)、远程过程调用(Remote Procedure Call,RPC)和对进程数据的访问。SD使服务器ECU能够发布服务,并使客户端ECU能够订阅车辆网络中的服务,这些服务由服务ID标识,并可根据需要附加选项,例如终端选项(即IP地址、传输协议(UDP/TCP)和端口号)。网络中可以存在多个具有相同服务ID的服务实例,并通过不同的实例ID进行唯一标识。可以使用RPC访问提供的服务,并可以接收有关事件的通知。应用程序可以使用set和get来访问进程数据。
SOME/IP-SD用于定位服务实例、检测服务实例是否正在运行,并实现发布/订阅处理[3]。为了提供服务实例,服务器会发送一个多播服务提供消息OfferService(Service ID,Instance ID),可选择包括上述终端选项在内的其他选项。服务器可以通过发送StopOffer(Service ID,Instance ID)消息来停止提供服务实例。如果客户端未收到具有所需服务ID的合适服务提供消息,则可以主动发送FindService(Service ID,Instance ID)消息,服务器可以回答并提供所请求的服务。实例ID可以设置为特定值,也可以设置为0xFFFF,以找到所有服务实例。发布/订阅机制可用于客户端需要从服务器获取一组信号,但又不想每次手动请求该信息的情况。客户端通过SubscribeEventgroup(Service ID,Instance ID)向事件组订阅,并由服务器确认SubscribeEventgroupACK(Service ID,Instance ID)。客户端通过StopSubscribeEventgroup(Service ID,Instance ID)消息取消订阅。在订阅活动期间,服务器会定期向客户端发送事件消息。此外,SOME/IP为服务实例提供了负载平衡选项。服务器可以在其服务提供中设置优先级和权重。客户端应选择具有最高优先级的服务。如果具有相同优先级的多个服务实例,则应基于服务实例的权重随机选择服务实例。SOME/IP协议定义了以下几种主要的通信模式:
(1)请求-响应方法(Request&Response Method):在请求-响应方法下,一个模块作为Client端在寻找所需服务时发现其正在有效生存时间内,发送一个请求消息,另一个提供该服务的Server端必须回复该请求消息。若请求消息存在差错,会回复错误信息给到Client端。Client端期望在发送请求后,接收到相应的响应消息。这种模式适用于需要请求和获取特定数据或执行特定操作的场景,如传感器数据获取、控制指令下发等。
图 2 请求-响应方法(Request&Response Method)
(2)请求-无响应方法(Fire&Forget Method):在请求无响应方法下,一个模块作为Client端在寻找所需服务时发现其正在有效生存时间内,发送一个请求消息,另一个提供该服务的Server端无需回复该请求消息。即使请求消息存在差错,也不会回复错误信息。
图 3 请求-无响应方法(Fire&Forget Method)
(3)事件通知(Event):在事件通知模式下,作为Server端的模块会对已经订阅其服务的Client端发送状态值或者触发事件的通知。这种模式适用于实时共享状态信息和事件通知的场景,如交通事件发布、环境变化通知等。
图 4 事件通知(Event)
(4)域值通知(Field):域值通知模式是对于Method和Event数据包的组合,它提供了3种通信流程:
① Notify:Notify报文一般会在Client订阅服务之后,由Server端发送,用于通知域值。
图 5 Notify
② Getter:Getter报文使用请求响应方法的模式,当Client端向Server端发送获取域值的请求时,Server端返回当前域值。
图 6 Getter
③ Setter:Setter报文使用请求响应方法的模式,当Client端向Server端发送设置域值的请求时,Server端返回更新后的域值。
图 7 Setter
这些通信模式为SOME/IP协议提供了灵活的通信方式,使得车辆内部模块和车辆与外部实体之间可以以适当的方式进行通信和数据交换。通过选择合适的通信模式,车辆系统可以实现高效的数据交换、实时的事件通知和灵活的方法调用,以满足各种复杂的应用需求。
03
SOME/IP攻击
SOME/IP协议最经常出现的攻击类型是中间人攻击。中间人攻击是攻击者在受害两方都未发现攻击者身份的情况下实施数据窃听和篡改的攻击类型。在以太网环境下,可以通过与受害方同时连接同一个交换机达到中间人攻击的效果。对于SOME/IP的通信,有以下3种不同的中间人攻击方式[4]:
(1)服务提供上的复制攻击
此类攻击的操作与重放攻击类似,但实现的环境是在中间人的环境下。图8简单地展示了这种攻击的实现方式:
首先客户端、攻击者和服务端均处在同一个交换机网络下,互相都能接收到彼此的数据。接着服务端在启动服务并进入到正式阶段(Main Phase)后,会周期性地在这个交换机网络中广播自己提供的服务,例如图中所示服务端提供了0x1234和0x5678这2个服务ID的服务,并让客户端和攻击者都收到了这条广播数据。此时,采用复制攻击的攻击者会立刻复制这条广播报文,修改IP地址和端点信息,伪造自己在这个交换机网络中也提供同样的服务。当然因为攻击者只能在SOME/IP协议层面进行复制攻击,无法对下层通信进行干预,因而客户端就会在短时间内收到2条宣称自己具有0x1234和0x5678服务的广播报文,然后可能会选择攻击者发送的这条广播报文进行回复,即图中的请求服务。一旦攻击者收到客户端的请求服务,就会把这条报文带有客户端的身份信息修改为自己的身份信息,但请求服务内容不变地发送到服务端。攻击者再接着把服务端回复的服务内容转发给客户端,这样就完成了一次中间人转发操作。并且对于服务端,攻击者会被认为是真正的客户端,而对于客户端会把攻击者当成提供服务的节点。在成功进入这个中间人环境后,攻击者可以进行下一步深层次的攻击。
图 8 服务提供上的复制攻击
(2)服务提供上的断连攻击
第一种复制攻击看似很容易能进入到中间人的环境中,但具有一定的局限性:
① 客户端可能已经与服务端建立了连接,不会再对攻击者的广播作出反应。
② 即使客户端未与服务端建立连接,也不能保证客户端选择攻击者的广播报文发送请求,因为服务端永远比攻击者先发出去原始报文。
③ 根据SOME/IP官方文档,不可复用服务端提供的Instance ID,但还要根据客户端能够接受的Instance ID伪造Offer报文。
由于以上的问题,一种基于复制攻击的断连攻击被提出了,如图9所示:
可以看到图的下半部分与复制攻击的后半部分一致,就是攻击通过伪造提供服务的报文,让客户端与自己连接,完成客户端与服务端之间的消息传递。但区别就在于服务端广播提供服务报文时,攻击者会立刻向客户端发送一条伪造成服务端身份的单播停止提供服务报文,同时再把自己伪造的服务广播在这个网络中。
与复制攻击相比,断连攻击会让客户端断绝与服务端建立连接的机会,无论它是已经与客户端相连还是刚选择了服务端提供的服务。伪造StopOffer可以帮助攻击者稳定地与客户端建立连接。
断连攻击看似更加好用,实际也存在一些限制。停止提供服务的报文必须要通过单播的方式发送到客户端手中,这是因为一旦服务端收到了这条消息,它会认为存在其他服务端提供相同的服务,不会再提供重复服务。这样就会导致中间人环境无法建立,因为服务端不会再对攻击者转发的请求进行任何回复。由于单播这一限制条件,攻击者必须知道对该服务感兴趣的客户端。换言之就是知道可能与服务端建立连接的客户端的信息,这样才能成功将单播的断连报文发送到客户端手中,达成后续目的。
图 9 服务提供上的断连攻击
(3)发布订阅上的攻击
前2种攻击在成功后,表现形式均为能够正常转发请求/回复数据。除了转发请求或回复的数据,也可以通过退订的操作最终导致可以转发事件信息。图10清晰地展示了整个流程:
服务端还是按照惯例广播自身提供的服务,接着客户端和攻击者都订阅了服务端的事件组,并收到了服务端的确认帧,此时说明服务端也记录下了客户端和攻击者分别的断端点信息。
然后攻击者会通过上面2种服务提供上的攻击的其中一种,让客户端信任自己具有它需要的服务事件组,客户端就会订阅攻击者的事件组。攻击者一收到订阅报文,就会回复确认帧,并立刻伪造一条包含客户端端点信息的退订事件组报文,让服务端不再将事件信息发送给客户端。而此时,攻击者与服务端之间的连接还存在,因此可以把服务端的事件更新信息转发给客户端,达到中间人攻击的环境。
图 10 发布订阅上的攻击
编辑:黄飞
评论
查看更多