鉴源论坛 · 观辙丨基于机器学习的汽车CAN总线异常检测方法

news2024/11/25 20:27:13

作者 | 张渊策 上海控安可信软件创新研究院研发工程师

来源 | 鉴源实验室

目前机器学习是研究车辆网络入侵检测技术的热门方向,通过引入机器学习算法来识别车载总线上的网络报文,可实现对车辆已知/未知威胁的入侵检测。这种基于机器学习的异常检测技术普适性较强,无需对适配车型进行定制化开发,但存在异常样本采集数量大和训练难度高的问题。本文将结合个人经验对基于机器学习的汽车CAN总线异常检测方法展开具体介绍。

01 车载异常检测流程

基于机器学习的车载异常检测的整体流程如图1所示,其中关键环节包括输入数据、数据预处理、训练及测试算法、评估及优化。

图1 基于机器学习的车载异常检测整体流程

02 数据源

针对特定车型进行数据的采集,形成有特点的定制化数据集,并用此数据集进行智能算法的训练与验证。在实际应用中,工程师可以直接采用公开数据集作为模型训练的数据,也可以通过实际采集车辆真实数据来获取数据集。

公开数据集:公开数据集CAR-HACKING DATASET[1]中提供了汽车黑客数据,如图2所示,其中包括 DoS 攻击、模糊攻击、驱动齿轮欺骗攻击和RPM仪表欺骗攻击四种类别的数据。该数据集是通过在执行消息注入攻击时利用真实车辆的OBD-II端口记录CAN流量来构建的。其数据集特征包括Timestamp,CAN ID,DLC(数据长度码),data(CAN数据字段),Flag(T或R,T代表注入信息,R代表正常信息)。公开数据集一般是经过公开验证的,更具有通用性和代表性,便于进行不同算法异常检测效果的比对。

 图2  CAR-HACKING DATASET[1]

实车数据集:数据源还可以通过实车采集的方式获取,通过向车内注入特定的攻击,并使用CAN采集工具对实车数据中的报文数据进行采集,采集时需要注意采集时间要尽可能平均。由此得到的实车数据集更加真实,其中可能包含一些公开数据集无法覆盖的异常场景。此外,实车数据采集得到的数据集通常还需要进行预处理工作。

2.1 数据预处理

机器学习算法模型的质量很大程度取决于数据的质量。原始数据往往不利于模型的训练,因此需要进行数据预处理以提高数据的质量,使其更好地适用模型。数据预处理过程一般包括特征选取、数据标准化及特征编码,如图3所示。在实际车载异常检测应用中,最终选用的数据预处理方法通常会根据智能算法的不同而有所差异。

图3 数据处理过程

2.2 特征选取

CAN报文的特征及描述如表1所示。记录每一条数据的时间标识Time,每一条报文的序号为CAN ID,相同CAN ID报文出现的时间间隔为period。Payload部分通常将十六进制的信息转换为十进制,根据CAN报文的特点,将payload划分为8个特征位(byte0,byte1, byte2, byte3, byte4, byte5, byte6, byte7),它们全部分布在0~255之间。

一般输入数据格式为Dataframe格式,对应的特征是Dataframe的列名称。在进行不同算法的训练时,选取包含指定特征值(某些列)的Dataframe进行后续数据标准化的操作。

表1 CAN报文特征

2.3 数据标准化

车载网络报文的数据信号(数据payload部分)具有不同的量纲和取值范围,通过标准化,在不改变样本数据分布的同时,使得这些数值信号能够进行比较。对于利用梯度下降的模型,数值型数据进行标准化可以削弱不同特征对模型的影响差异,使得梯度下降能更快地找到最优解,同时结果更可靠。对于决策树这类不通过梯度下降而利用信息增益比的算法,则不需要进行数据标准化,整体流程如图4所示。

标准化对样本的payload特征分别进行计算使其满足正态分布,Z=  (x- μ)/σ。一般情况下,标准化与数据分布相关,具有更强的统计意义,在车载入侵检测数据的处理上更加通用合适。对于需要数据标准化的算法,使用Scikit-learn中preprocessing.StandardScaler(df)函数,df为需要标准化的数据(只含有payload部分的Dataframe),得到标准化后的数据特征编码或直接进行训练。

图4 数据标准化流程

2.4 特征编码

车载网络报文中,数据场以外还存在一部分报文内容,如CAN ID。对于很多机器学习算法,分类器往往默认数据是连续的,并且是有序的,因此需要对此类特征进行编码。对于维度较低的特征可以直接使用独热编码。对于维度较高的特征,可以使用二进制编码。

独热编码是用等同于状态数量的维度进行编码,每种状态下的独热编码只有其中一位为1,其余均为0。编码后的特征互斥,每次只有一个激活,有利于模型处理数据。

输入数据集,如CAN ID经过one_hot(df)函数,将输入数据进行one-hot编码。一个CAN ID将变为16*3的向量,如图5所示。该向量将作为训练模型的输入,进行后续的模型训练工作。

图5 CAN ID 特征编码[1]

03 算法训练及测试

3.1 数据集划分

输入数据集以7:1.5:1.5的比例划分成训练集、验证集和测试集。训练集数据只用来训练模型,其数据不出现在算法测试中。验证集主要是用来反映训练得到模型的相关效果,也会在其上进行算法模型的优化与调试,反复验证直到达到最佳效果。测试集主要表现模型的最终效果,测试集数据也是用来评价模型的数据,测试集数据不出现在算法训练中。

数据集划分流程如图6所示,首先输入数据采用Scikit-learn中model_selection.train_test_split()函数,此函数可以将数据集先划分成7:3的训练集和测试数据,然后再将测试数据集划分成5:5的验证集与测试集。

图6 数据集划分流程

3.2 SMOTE采样

对于采集到的车载网络数据,攻击报文数量远少于正常报文,造成了样本类别不平衡。机器学习中往往假定训练样本各类别是同等数量,即各类样本数目是均衡的。一般来说,不平衡样本会导致训练模型侧重样本数目较多的类别,而“轻视”样本数目较少类别,这样模型在测试数据上的泛化能力就会受到影响。通过SMOTE[2](合成少数类过采样技术),在少数类别样本之间进行插值生成新的样本,如图7。相比随机过采样,SMOTE大大降低了过拟合的可能。

图7 SMOTE采样原理 [2]

在训练模型前对各类别的训练数据进行SMOTE过采样的操作,SMOTE过采样流程如图8。使用imblearn.over_sampling中的SMOTE().fit_resample(X,Y)函数,其中X为输入需要训练的报文集合,Y为X中每一条报文的类别。经过SMOTE处理,各类别的报文数量会变得一样多,可以进行下一步的操作。

图8 SMOTE采样流程

3.3 模型训练

模型训练是从标签化训练数据集中推断出函数的机器学习任务。常用的模型训练算法包括RNN(Recurrent Neural Network,循环神经网络)、LSTM(Long Short-Term Memory,长短期记忆网络)、GRU(Gated Recurrent Units,门控循环神经网络)、DCNN(Dynamic Convolution Neural Network,深度卷积神经网络)、SVM(Support Vector Machine,支持向量机)、DT(Decision Tree,决策树)、RF(Random Forest,随机森林)、XGBoost(Extreme Gradient Boosting,极端梯度提升)、Stacking(集成学习算法)、Clustering(聚类)等。

04 评估与优化

模型的总体优化流程如图9所示,对模型测试的结果进行评估,根据评估的结果进一步优化模型。下面详细阐述评估指标和优化方式。

4.1 评估指标

方案使用平均准确率、P-R曲线、F-score对模型进行评价。平均准确率是判断入侵检测算法优劣的最直观的评价标准。P-R曲线和F-score能更加直观地反映入侵检测模型在特定数据集上的表现。本方案选择平均准确率作为模型在验证集上的评价指标,在超参数调优时,根据平均准确率选择更优超参数组合。本方案选择F-score作为模型在测试集上的评价指标,评价最终的模型效果。

图9 模型优化流程

a)准确率 Accuracy

准确率公式为:

Accuracy = (TP + TN) / (TP + TN + FP + FN)

其中,TP(true positive)是正例,代表被模型正确地预测为正类别的样本。例如,模型推断出某条报文是攻击报文,而该报文确实是攻击报文。TN(true negative)为假正例,代表被模型正确地预测为负类别的样本。例如,模型推断出某条报文不是攻击报文,而该报文确实不是攻击报文。FN (false negative)是假负例,代表被模型错误地预测为负类别的样本。例如,模型推断出某条报文不是攻击报文(负类别),但该条报文其实是攻击报文。FP(false positive)为假正例,代表被模型错误地预测为正类别的样本。例如,模型推断出某条报文是攻击报文(正类别),但该条报文其实不是攻击报文。

准确率是指分类正确的样本占总样本个数的比例。在不同类别的样本比例非常不均衡时,占比大的类别将成为影响准确率的主要因素。导致模型整体准确率很高,但是不代表对小占比类别的分类效果很好。因此,使用平均准确率,即每个类别下的样本准确率的算术平均作为模型评估的指标。

在超参数选择阶段,算法会根据各个超参数的准确率Accuracy,进行选择。选择准确率最高的超参数作为模型使用的超参数。

b)P-R曲线和F-score 

精确率P = TP / (TP+FP),指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。召回率R = TP / (TP+FN),指分类正确的正样本个数占真正的正样本个数的比例。通过F-score进行定量分析,同时考虑了精确率和召回率。 

F-score =(1+β^2 )*P*R/(β^2*P+R)

智能分析使用F1-score作为指标,评价最终模型在测试集上的表现效果。

4.2 模型优化

入侵检测使用到的机器学习和神经网络模型包含大量的超参数,超参数直接影响了模型的优劣,寻找超参数的最优取值是至关重要的问题。通过超参数优化方法和K折交叉验证,找到最优的超参数,使模型能够准确地判断报文类型。

a)K折交叉验证

K折交叉验证用于模型调优,测试模型预测未用于估计的新数据的能力,找到使得模型泛化性能最优的超参值。具体原理如图10,将训练数据分成K份,用其中的(K-1)份训练模型,剩余的1份数据用于评估模型。循环迭代K次,并对得到的K个评估结果取平均值,得到最终的结果。

图10 K折交叉验证原理[3]

K值越小,模型越偏差越低、方差越高,容易出现过拟合。K值越大,则偏差提高,方差降低,且计算开销增大。在训练中我们一般选择k=5。使用下面函数进行K折交叉验证划分,sklearn.model_selection.KFold(n_splits=5,shuffle=True,random_state=999).split(df),其中n_splits为交叉验证的折数,shuffle表示是否打乱数据,random_state为随机种子,df为训练数据。

b)超参数优化

超参数优化方法主要有:网格搜索和贝叶斯优化。

网格搜索:以穷举的方式遍历所有可能的参数组合,网格搜索在1维、2维、3维的搜索空间表现相对来说不错,很容易覆盖到空间的大部分,而且耗时不大。使用sklearn.model_selection中的GridSearchCV ()进行超参数选择和交叉验证。

贝叶斯优化:网格搜索和随机搜索没有利用已搜索点的信息,使用这些信息指导搜索过程可以提高结果的质量以及搜索的速度。贝叶斯优化利用之前已搜索点的信息确定下一个搜索点,用于求解维数不高的黑盒优化问题。它的本质其实是一种回归模型,即利用回归模型预测的函数值来选择下一个搜索点。使用hyperopt中的fmin()函数进行贝叶斯优化,给出最优模型参数。

以训练集的交叉验证结果作为性能度量。根据模型的超参数数量、取值范围、性能影响等因素,选择不同的超参数优化方法,对模型进行参数优化。

05 小结

面向智能网联汽车无线通信系统、车载娱乐系统、驾驶辅助系统以及典型智能网联场景,机器学习作为车载网络入侵检测中至关重要的一项技术,可实现对已知/未知攻击行为的特征识别检测,最终助力车端和云端安全联动,保障车载网络的信息安全。

参考文献:

[1] Seo, Eunbi, Hyun Min Song, and Huy Kang Kim. "GIDS: GAN based intrusion detection system for in-vehicle network." 2018 16th Annual Conference on Privacy, Security and Trust (PST). IEEE, 2018.

[2] He H, Garcia E A. Learning from imbalanced data[J]. IEEE Transactions on knowledge and data engineering, 2009, 21(9): 1263-1284.

[3] Ashfaque J M, Iqbal A. Introduction to support vector machines and kernel methods[J]. publication at https://www. researchgate. net/publication/332370436, 2019.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chrono_duration(一)

文章目录chrono简介std::chrono::durationduratio基本介绍基本概念使用引入std::ratio 参数深入特化的duratio改造之前的代码静态成员函数 count原型例子构造函数支持加减乘除运算编译细节支持比较运算符查询范围类型转换例子引入修改seconds的范围浮点类型系统特化的duratio自…

os模块的使用方法详解

os模块os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;即os模块提供了非常丰富的方法用来处理文件和目录。使用的时候需要导入该模块:import os常用方法如下:方法名作用os.remove(‘path/filename’)删除文件os.re…

Unidbg模拟执行某段子so实操教程(一) 先把框架搭起来

一、目标 最近又开始研究Unidbg了,费了好大劲,没有跑起来。今天就先找个软柿子捏捏看。 今天的目标是 之前研究的 某段子App签名计算方法(一) 某段子App版本 5.5.10 二、步骤 先搭起框架来 在 /unidbg/unidbg-android/src/test/java/ 下面新建一个 …

K8S 三种探针ReadinessProbe、LivenessProbe和StartupProbe 之探索

一、事件背景因为k8s中采用大量的异步机制,以及多种对象关系设计上的解耦,当应用实例数增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的service、ingress配置总是及时能完成刷新。在一些情况下,往往只是…

Python爬虫之Scrapy框架系列(4)——项目实战【某瓣Top250电影更多信息的获取】

前言: 上篇文章使用Scrapy框架简单爬取并下载了某瓣Top250首页的排名前25个电影的电影名。 太寒酸了,这篇文章咱就来仔细搞一搞,搞到更加详细的信息!!! 目录:1.分析2.使用scrapy shell提取电影详…

进程信号--Linux

文章目录信号?kill -l 指令查看所有信号信号的工作流程信号产生1.通过终端按键产生信号2.通过系统调用接口产生信号3.通过软件产生信号4.硬件异常产生信号信号接收信号处理总结信号? 进程间的通信我们了解到有管道通信,有共享内存的通信。这…

flowable编译

git clone -b flowable-release-6.7.2 https://github.com/flowable/flowable-engine.git下载之后File-Open,打开工程,modules是核心代码模块 找到flowable-root.xml按下altf12 ,启动Terminal终端输入命令:mvn clean package -Ds…

《Buildozer打包实战指南》第三节 安装Buildozer打包所需的依赖文件

目录 3.1 安装依赖软件包 3.2 安装Cython 3.3 设置环境变量 3.4 安装p4a、Android SDK、NDK以及其他编译文件 Buidozer这个打包库下载安装完毕之后,我们还需要下载一些打包安卓apk所需要的依赖文件。 3.1 安装依赖软件包 首先输入以下命令更新Ubuntu上的软件包…

使众人行:如何带领一群人把事做成?

你好,我是雷蓓蓓,一名程序员出身的项目经理,曾任网易杭研项目管理部总监。 我所带领的网易杭研项目管理部,从2011年成立以来,就一直在互联网项目管理领域深耕,为网易云音乐、网易严选、云计算、智慧企业等…

智慧社区管理系统改造方案

伴随着城市发展的持续加速,许多在建智慧社区和老旧小区智能化改造都在有规划的展开着。如今许多老旧小区在展开设备升级,许多小区智能安防设备、物业管理服务系统软件、社区综合服务平台及其监控器设备等都会展开智能化改造。但是,很多人对老…

17.优于select的epoll

优于select的epoll epoll 理解及应用 select复用方法其实由来已久,因此,利用该技术后,无论如何优化程序性能也无法同时接入上百个客户端(当然,硬件性能不同,差别也很大)。这种select方式并不适…

IIC驱动中景园0.96寸OLED

驱动硬件介绍 1、驱动电压3.3到5,但是正点的也是这个芯片说用3.3 5会烧坏掉。 2、RST 上的低电平,将导致OLED 复位,在每次初始化之前,都应该复位一下 OLED 模块。而我们使用四线,里面就没有复位了 3、裸屏有多种接口方式(驱动芯片为SSD1306) 6800、8080 两种并行接口方…

Redis应用2(Redison)

不推荐使用application的配置方式,因为会替代spring内部的对于redis的配置方式 注意:如果redis数据库没有密码,不要使用 config.useSingleServer().setPassword("") 的形式,直接跳过setPassword()就可以,配置类写法如下: Configuration public class RedisConfig…

MySQL进阶——索引

一、索引及其分类 1.索引的概念 索引是一种特殊的文件,包含着对数据表中所有记录的引用指针通俗点说,索引就好比是一本书的目录,能加快数据库的查询速度例如需要遍历 200 条数据,在没有索引的情况下,数据库会遍历全部…

Spring之事务编程概述

目录 一:基本概念 搭建测试环境 基于xml声明式事务控制 二:事务相关配置 ​编辑 基于注解声明式事务控制 三:Spring事务角色 四:事务传播行为 五:案例:转账业务追加日志 一:基本概念 事…

Vue.nextTick核心原理

相信大家在写vue项目的时候,一定会发现一个神奇的api,Vue.nextTick。为什么说它神奇呢,那是因为在你做某些操作不生效时,将操作写在Vue.nextTick内,就神奇的生效了。那这是什么原因呢? 让我们一起来研究一…

手把手教你写Dockerfile以及测试

Dockerfile是什么? dockerfile就是用来构建docker镜像的构建文件,命令参数脚本。 如何使用Dockerfile? 1、编写一个Dockerfile文件2、docker build构建成 基础使用(此处罗列一些我们经常用到的) # 指定依赖镜像版本&#xff…

【附代码】十大主流聚类算法

准备工作安装必要的库pip install scikit-learn准备数据集使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据&#xff0c…

第18章_JDBC

一、JDBC概述JDBC概述什么是JDBCJDBC(Java DataBase Connectivity, Java数据库连接) ,是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成有了JDBC,程序员只需用JDBC API写一个…

夜深忽梦少年事,7年又一年,来看看95年那个小伙现在怎么样了

2022年已到尾声,疫情也结束了,这三年太不容易了,今年也是一样在疫情的艰难的度过,就是做了两件事,防疫和上班,没什么可写的。但是在一个深夜晚上,想了很多以前的事,想想还是写一点东…