本文介绍软件定义车联网的体系和漏洞挖掘相关技术。分别就传统车联网体系、SDN 基本原理、软件定义车联网架构三个方面阐述软件定义车联网,就一般漏洞挖掘方法分类和模糊测试两个方面阐述漏洞挖掘技术。
1.1 传统车联网技术
随着汽车数量的不断增长,世界上许多国家都面临随着严重的交通堵塞和环 境污染问题。为了解决这种问题,各国先后在推广车辆限行、扩大公共交通、发展新能源汽车等方面进行了诸多尝试,但结果均差强人意。近年来,随着5G、人工智能、边缘计算等技术的不断发展进步,智慧交通逐渐成为研究的热点。车联网作为智慧交通建设的重要基础,具备道路感知、车辆感知、行人感知等特性,在提升道路安全和提升通行效率方面具有天然的优势。车联网的发展主要经历了早期的VANET技术和如今的V2X技术两个阶段。
VANET的概念起源于移动自组织网络(Mobile Ad-hoc Network,MANET) , 继承了其动态拓扑、自动组网和位置分散的特点。VANET的基本架构中主要包含两种类型的车辆通信:车辆到车辆(Vehicle-to-Vehicle,V2V)通信,车辆到基础设施(Vehicle to Infrastructure,V2I)通信。通过V2V通信,车辆可以实时监控附近道路上其他车辆的信息,为驾驶提供高科技解决方案,实现车辆安全和智能驾驶。通过V2T通信,车辆可以获知有关周围各种设施的信息,实现数据网络访问和服务信息获取。VANET的通信系统通常由路边单元(Road Side Unit,RSU),车载单元(On-board Unit,OBU)和专用的短距离无线通信协议组成,确保了车辆能够在移动环境下能够获得网络接入。
V2X思想的出现得益于物联网的高速发展,5G的出现带来的高吞吐与低时延特性使得车辆与万物互联成为可能。V2X通信分为五种主要类型,除了上述的V2V和V2I以外,还包括车辆到行人(Vehicle-to-Pedestrian,V2P) 通信、车辆到设备通信(Vehicle-to-Device,V2D)以及车辆到网络(Vehicle-to-Network,V2N)通信。V2P旨在在车辆与用户随身携带的设备之间建立通信,可以实现人对车辆的非接触控制,比如远程开关车门。可以满足用户对车辆信息的获取,比如基于定位的距离提醒和对车辆自身属性的感知等等。V2P虽然是通过与人携带的设备通信,但其核心在于以人为本的通信服务,而V2D指的是车辆与自身搭载的所有电子设备之间进行信息交换,比如红外传感器、车载蓝牙设备、智能摄像头等。V2N旨在将车辆与云端车联网平台连接到一起,通过云平台的统一管理实现路径规划、精准定位、信息娱乐等功能。如图1是一个典型的车联网架构。
图1 车联网基本架构图
国际上主流的车联网中无线通信技术主要有两种,一种是基于802.11P的专用短程通信(Dedicated Short-Range Communications,DSRC)技术,另一种是基于蜂窝移动网络(Cellular V2X,C-V2X)的通信技术。欧美等汽车发达国家起步较早,已经对DSRC技术有了较为成熟的研究和应用,但随着频谱划分越来越细和标准制定的困难,DSRC发展增速放缓。近几年中国大力发展4G和5G,在C-V2X的研究道路上属于后起之秀。C-V2X能够复用旧式蜂窝网络,信号覆盖范围广,运营模式经历了多年实践日益精进,是当前首选的V2X通信技术。
总体来看,车联网具有如下特性:
(1) 天然的高速移动性。车辆的自身使命就是移动,由此带来了高变化的动态拓扑、通信链路维持时间短等弊端,但也为移动边缘计算、边缘存储等新兴技术提供了孵化场景,有利也有弊。
(2) 需要持续、可靠、稳定通信连接,对实时性要求极高。自动驾驶、交通安全等应用场景下必须保证极低的时延和稳定的连接,否则便有可能引起安全事故。而车辆的连接容易受到复杂环境因素的干扰,因此必须解决通信服务质量才有可能提供安全稳定的车联网服务。
(3) 统一管理难度逐步加大。多种无线通信技术、异构网络、新型网络设备 的加入,使得对车联网的统一管理难度加大,网络拓扑难以在短时间内快速获取,基于云端的车联网管理平台又存在一定延迟,网络的管理成本逐步增加。
1.2 软件定义网络基础
SDN的概念最早由美国斯坦福大学的McKeown教授及其团队提出,主要目的是用于解决传统因特网封闭式网络架构设计带来的难以进化发展的问题。从网络发展历史来看,SDN的诞生具有其客观必然性。传统网络经历了几十多年的发展早已变得臃肿不堪,期间产生了为数众多的的通信协议和网络设备,每一次新型协议部署和设备升级都耗时耗力,越发困难重重。SDN凭借其数据转发和控制分离的新颖思想快速获得了来自学术界和工业界一致的青睐。时至今日,全世界已经有诸如谷歌、Facebook等大厂将SDN技术应用于其商业化的数据中心。SDN的早期发展历史如表1所示。
表1 SDN早期发展历史
1.2.1 SDN 网络架构
SDN采用分层思想设计,将传统网络功能中的数据转发和控制进行解耦分离,形成了自上而下的“应用层—控制层—数据层”的三层网络架构模型。每一层的功能与其各自的名称高度对应。应用层主要负责实现基于底层网络资源实现的各种功能型应用以满足不同用户对于网络功能的不同需求,主要包括负载均衡、路由、服务质量、防火墙等功能,这些应用由专业人员根据需求进行定制化开发,实现了网络的可编程能力。控制层是应用层和数据层交互的媒介,用于控制整个网络中的数据转发规则。控制层通过基于软件实现的SDN控制器实时收集来自数据层的整个网络中的信息和状态,通过北向接口(North Bound Interface,NBI)向上提供给应用层,并具备将来自应用层的规则转译为底层硬件设备能够执行的硬件级指令能力,将其通过南向接口(South Bound Interface,SBI)下发到数据层以执行来自上层的命令。这一过程与高级编程语言经过编译器编译后转换成机器可以执行的机器码过程极为类似,这也是SDN设计理念借鉴了计算机设计原理的精华而具备可行性的原因所在。在实际应用中,SDN控制器可以根据需求以分布式的形式而存在,物理分散而逻辑集中,满足实际网络应用中丰富的需求类型。数据层位于三层架构的最底层,由SDN交换机及其他各种网络设备组成,主要负责整个网络中的数据转发功能。SDN交换机通过控制器统一下发的流表来匹配每一项数据流的执行动作,整个数据层资源被抽象成统一的硬件模型,所有网络协议通过控制器和流表来实现,从而提升了网络的灵活性和可扩展性。
图2 SDN基本架构图
由于SDN采用了分层架构设计,因此从北到南各层之间的通信通过南/北向接口来实现。SBI提供了控制器对数据层抽象硬件资源的编程能力,而NBI提供了应用层对控制器的编程能力。在SDN发展历程中,OpenFlow协议是最早采用的也是ONF官方提出的SBI标准协议,因此主流的SDN控制器都采用OpenFlow协议作为SBI,而NBI目前还在统一标准化的道路上不断探索前进,因此不同的 控制器拥有不同的NBI。另外,有学者提出了SDN东西向接口(EastWest Bound Interface,E/WBI)的概念,用于实现多个SDN 集群之间进行控制器间的跨域通信,这将进一步拓宽SDN网络之间和传统网络的对接能力。主流的SDN架构图如图2所示。
SDN的本质在于控制和转发的分离,具体体现在网络设备的软硬件解耦、控制层与数据层解耦。基于统一的全局网络资源视图和对网络资源进行抽象的南北向接口,提供了整体网络可编程性,从而使得SDN拓宽了很多领域的问题解决方案。有效实现了网络资源的抽象隔离,解决了网络资源冲突,提高了网络资源分配效率。
1.2.2 OpenFlow协议
OpenFlow协议属于数据链路层通信协议,最早由斯坦福大学提出并应用于SDN中作为统一控制数据层资源的通信协议,使得SDN控制器能够与硬件之间进行直接交互。经历了十多年的发展和ONF的大力支持,OpenFlow已经成为全世界使用最广泛的 SDN南向接口协议。OpenFlow体系由支持OpenFlow的控制器和交换机以及不断更新完善的OpenFlow协议共同组成,它将数据层抽像出来并构成一个多级流表转发模型。OpenFlow协议允许软件应用程序对不同交换机的流表进行编程。OpenFlow交换机使用流表转发数据包。流表是流条目的列表集合,每个条目都有匹配字段、计数器和指令三个流表项。传入交换机的数据包将与每个条目的匹配字段进行比较,如果存在匹配,则根据该条目包含的操作对数据包进行处理。计数器用于保持有关数据包的统计信息。指令代表交换机对该数据包执行的动作。如图3是一个基本的OpenFlow流结构。
图3 SDN流结构
OpenFlow协议在ONF组织的不断推进下,经历了多个版本的变迁。Open- Flow 1.0是一个推出用于商业用途的版本,仅支持单个流表和IPv4网络;OpenFlow 1.1版本加入了对多级流表和组表的支持;随着SDN架构的完善和演进,在Open- Flow1.2版本中加入了对多控制器的支持,同时还支持了IPv6网络;之后OpenFlow的更迭速度不断加快,但并非所有的网络设备都支持最新协议,因此在OpenFlow 1.3版本中加入了对使用协议版本的协商功能,控制器和交换机之间可以经过协商统一后自由选择使用的OpenFlow协议版本。随后的OpenFlow 1.4和1.5版本继续在流表功能和使用机制方面持续改进和完善,目前,部署率最高且稳定性最好的是OpenFlow 1.3版本。然而,万变不离其宗,OpenFlow中的消息类型按照消息发起对象的不同可分为3种,分别为异步(Asynchronous)消息、控制器到交换机(Controler-to-Switch)消息和对称(Symmetric)消息。
(1) 异步消息
异步消息的主动发起方为OpenFlow交换机,由交换机单向传递给控制器。旨在主动告知控制器当前交换机的状态,用于通知控制器有新类型的数据包到达、网络错误或交换机发生故障等。常见的消息头有:Port-Status用于通知刷新交换机端口状态;Packer-in用于通知未与流表匹配的数据包到达,请求控制器给予下一步的指示、Flou-Removed用于通知流表被删除以及Error用于通知交换机自身故障。
(2) 控制器到交换机消息
控制器到交换机消息顾名思义发起方为控制器,由控制器单项传递给Open- Flow交换机。旨在主动获得交换机状态和对交换机进行查询配置。常见的消息头有:Features用于查询特定交换机的特性,比如支持的版本协议;Modify-State用于对交换机进行配置,最常见的场景就是安装和更改流表;Configuration用于查询交换机硬件性能配置参数;Read-State用于查询交换机上与流表相关的统计信息;Send-Packet用于通过指定端口发送数据包;Barrier用于阻塞消息直到确认收到操作完成通知。
(3) 对称消息
对称消息的发起方可以是控制器和交换机中的任意一方,主要用于双方之间进行消息交互。对称消息与上述两种消息类型的最大区别在于消息的传递遵循时间先后顺序关系。常见的消息头有:Hello用于在建立连接时双方握手;Echo消息用于确认双方之间连接状态情况;Vendor消息用于实现一些厂商自定义的功能。
OpenFlow交换机是OpenFlow协议中流表的主要载体和具体实施对象。每当 一个数据包通过端口到达交换机时,交换机会自动寻找流表中与之匹配的流表项。如果匹配成功,那么便执行流表项中动作字段定义的行为。一旦遇到匹配失败的情况,交换机便向控制器发送异步Packer-in消息请求控制器下发新的流表规则来应对该类型的数据包。控制器通过Modify-State消息安装新的流表规则到交 换机即可实现对先前未知数据包的匹配。需要注意的是,这种机制虽然简单明了但存在被拒绝服务攻击的风险。一旦攻击者恶意制造大量的未知数据包便可造成交换机到控制器的通信带宽资源被耗尽,从而导致正常的数据包无法得到新的流表规则匹配而大量阻塞,影响了正常的网络通信。
目前世界上主流的SDN控制器均支持OpenFlow协议,部分还支持其他类型 的南向接口协议,因此一般对OpenFlow控制器和SDN控制器两个概念不加以明确区分。目前已经出现了许多种类的开源SDN控制器,每种各有其优势和特点。基于Python模块化开发的Ryu以及软件商与设备商主导的OpenDaylight是最著名的两大SDN控制器。主流的SDN控制器对比如表2所示。
表2 主流开源SDN控制器对比
1.3 软件定义车联网
传统车联网由于其分布式特性,无法获取整体网络的全局视图而导致其路由算法容易陷入局部最优,从而进一步导致了资源分配不均和网络利用率不高。车联网与5G网络、无线传感器网络等多种异构网络的融合,使得车联网管理难度加大,部署新协议和新应用的成本加大,可扩展性不高。软件定义车联网架构的提出为车联网引入了SDN的思想,使得网络编程成为可能,满足了车联网场景下日益丰富的用户需求。同时,SDN的高扩展性和灵活性使得车联网中新协议的部署和升级得以快速实现,基于全局资源视图的灵活管控方式使得车联网走出了局部优化的困境,迎来了全新的面貌。
图4 软件定义车联网架构图
与SDN类似,软件定义车联网架构分为应用层、控制层和数据层,如图4所示。从逻辑上讲,它们是一种自上而下的结构,用于抽象车联网资源并集成了多种技术,例如云计算、雾计算和移动边缘计算。应用层可以满足用户和车辆的不同要求。通常,应用层和控制层之间的NBI可以为网络开发工程师提供编程接口以根据需求开发应用程序,得到的车联网应用程序生成数据转发规则和配置策略并将其发送给控制器进行底层控制。控制层可以由一个或多个控制器组成,为车辆分配资源,向RSU、基站(Base Station,BS)等基础设施下发配置数据,提高数据传输效率.通过数据层的状态,SDN控制器可以观察到全局网络拓扑,从而可以实现车联网智能管控方案。数据层包含了所有的车联网接入设施,如SDN交换机、车辆、RSU、BS等。主要承担数据转发功能和部分数据存储功能。车辆可以通过V2V与其他车辆通信,也可以通过V2I与RSU和BS等基础设施通信。RSU可以在资源有限的情况下为周围的车辆提供无线访问,然后BS会向车辆传输无线信号。此外,RSU配备了由各种传感器组成的信息收集模块,因此可以提供周围环境的状态。
软件定义车联网作为一种异构网络架构,提供了多种无线通信的接入方式。控制器一般位于车联网云端数据中心,通过光纤传输方式与基础设施进行通信。在控制与转发分离的核心思想下,RSU和BS只保留提供网络连接和转发流表的功能,其对网络数据的路由控制功能从原有设备中被解耦出来。SDN控制器对全局数据层设备进行集中控制和虚拟化,通过SBI接口向下发送数据规则包、收集数 据层状态信息,之间采用的通信协议为OpenFlow协议。根据SDN控制器掌握的全局网络信息,通过NBI接口进行应用层编程,实现了智能管理控制车联网中的所有数据,完成执行规定的行为和功能。
2.1 漏洞挖掘常用方法
漏洞挖掘是软件和系统安全领域十分重要的一项技术,能够有效的提前预知系统中潜在的缺陷,提前发现威胁从而规避风险。早期的漏洞挖掘通常以人工干预为主,富有经验的漏洞挖掘人员凭借自身实力对软件和系统中存在的漏洞进行挖掘,属于经验型方法。但随着计算机规模的扩大和互联网产业的兴起,纯人工形式的漏洞挖掘方法不再适合于日益激增的软件应用规模数量,此时出现了辅助漏洞挖掘的软件,可以实现半自动化的批量分析,完成一些对分析对象的基本操作。再往后发展,随着大数据、人工智能等技术的兴起,开始出现一些具有针对性的全自动化漏洞挖掘系统,例如对安卓APK的一键分析、对JAVA源代码的静态全自动扫描等,这些系统通常使用静态化的漏洞挖掘方法,结果的可行度高,但存在一定的误报率。
总的来说,从漏洞挖掘的过程来看可分为静态挖掘和动态挖掘两种。静态挖掘即基于源程序的二进制文件、源代码,不对软件系统启动运行,而是令其以静态文件的形式存在,从文件格式、代码关系上寻找出可能存在的漏洞。动态挖掘即将分析对象运行起来,观察其运行期间的程序行为、读写操作、调用函数方面寻求突破。从漏洞挖掘的技术手段来看主要分为白盒测试、黑盒测试和灰盒测试三种。白盒测试是在对分析对象的内部结构、执行流程、源代码完全已知的情况下进行的,常用的是基本路径测试法用于自动化代码审计,市面上已经有很多成熟的商业软件可以使用,效果优秀但价格昂贵;黑盒测试与白盒测试完全相对,漏洞挖掘人员对程序内部的实现原理一无所知,仅能通过程序的输入输出对来判断程序的行为是否异常,其中最著名的当属模糊测试技术,其通过构造大量的畸形数据集输入给程序来使得程序发生崩溃或异常;灰盒测试介于白盒和黑盒二者之间,既对程序的执行流程有一定的了解但又不完全知晓,著名的逆向工程方法便属于这个范畴。漏洞挖掘人员通过逆向工程可以获得程序的汇编代码或反编译伪代码,从而可以推测出程序大致的运行逻辑进而发掘出存在的漏洞。
2.2 模糊测试漏洞挖掘技术
模糊测试是自动化漏洞挖掘领域最重要的方法之一,英文术语为“Fuzzing”。它通过构造非预期的程序输入以达到破坏程序正常运行逻辑触发崩溃的方式来挖掘漏洞。在这个过程中,目标程序将反复被执行给定的输入并处理输入数据,模糊测试器(Fuzzer)通过捕获程序的输出和监视程序的运行状态来判断其是否异常。具体分为如下五个步骤:
(1) 目标程序信息收集。对目标程序的基本信息和详细功能进行分析,在这个过程中探究清楚程序的标准输入输出格式应该是什么样的:如果程序接受的输入是文件,那么支持的文件格式类型有哪些;如果程序接受的输入是字符流,那么字符流应当满足什么样的格式;对于正常输入程序对应的正常输出应当是以何种形式呈现。
(2) 构造模糊测试数据集。模糊测试数据集的好坏直接影响了模糊测试的效果。构造数据集时要考虑到如何在已有数据上进行变异或者如何动态生成新的数据,并且这个过程需要通过算法完全自动化实现。
(3) 执行模糊测试。模糊测试器自动将构造的数据集作为输入提供给程序,根据测试对象的不同可能是发包、打开文件或调起进程,该过程也需要完全自动化实现。
(4) 监视程序运行状态。为了详细记录程序发生异常时是由哪个数据包引起的、当前程序处于什么状态、系统异常信息等,模糊测试器在执行模糊测试的过程中应当实时检测程序,监视过程与执行过程应当是并行的。
(5) 记录异常信息并分析。一旦监视程序报告程序缺陷产生,模糊测试器应当详细记录引起异常的现场情况以便日后进一步分析时的复现。在条件允许的情况下,还可以对程序缺陷加以一定的自动化分析,比如基于系统内核调试器的可利用性分析等。
模糊测试的最大优势在于自动化进行,代替了大量的人工操作,并且能够发现一些正常情况下不会被发现的漏洞,比如著名的“脏牛”、“心脏出血”漏洞等就是通过模糊测试挖掘出来的。但模糊测试也存在一些弊端。首先,模糊测试对于非基于文件或数据流输入的程序来说无法进行。模糊测试的核心思想就是输入和输出,没有输入也就无法完成完整的上述五个步骤;其次,模糊测试的方向是盲目的,容易陷入局部困境或遇到路径爆炸的难题,在现有计算机算力下,对于大型程序来说很难穷尽所有可能的程序执行路径,因此模糊测试与人工智能结合是一个很有价值的研究方向;还有,模糊测试虽然可以引起目标程序发生异常,但无法自动化判断这个异常是否是可利用的漏洞,自动化漏洞利用(Automatic Exploit Generation)是另一个复杂研究领域,通常使用符号执行等方法,不在模糊测试技术的考虑范围之内。
本文主要对软件定义车联网的组网技术和漏洞挖掘的常用方法进行了概述。第一部分介绍了传统车联网技术和SDN的基本架构,以及二者结合形成的软件定义车联网基本功能和原理。第二部分详细阐述了常用的漏洞挖掘方法,其中白盒测试存在自动化程度低、耗时长、误报率高等缺点,且对于不同的SDN控制器需要分别设计,可移植性较差;黑盒测试方法虽然具备较高的自动化程度和一定的通用性,但现有的的模糊测试样本生成算法无法满足新型网络架构下的应用需求,需要重新设计新的漏洞挖掘模型和算法以适用于软件定义车联网架构。
推荐阅读
Linux+Windows安装r2Frida环境的配置及使用方法
车联网安全|Android车机之证书攻击/入侵场景检测(1)