来源 | 鉴源实验室

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

目前机器学习是研究车辆网络入侵检测技术的热门方向,通过引入机器学习算法来识别车载总线上的网络报文,可实现对车辆已知/未知威胁的入侵检测。这种基于机器学习的异常检测技术普适性较强,无需对适配车型进行定制化开发,但存在异常样本采集数量大和训练难度高的问题。本文将结合个人经验对基于机器学习的汽车CAN总线异常检测方法展开具体介绍。 做一想要从车上测出 can 总线 上的数据还不太容易。 于是我首先使用示波器(我使用的示波器型号是TDS 220)来找出 汽车 can 总线 的接口,然后测出 can 总线 的波特率,测量波特率的步骤如下: 1、将示波器的两个接口(接地和探头)分别接在 can 总线 的两条线( CAN _H和 CAN _L)上, 这里需要注意如果 CAN 线上需要接一个120欧姆的负载电阻,否则波形是不规整方    从之前的课程我们了解到, 车上的智能硬件设备太多, 即ECU节点太多, 这些节点通过 CAN 总线 外加 汽车 网关, 组成了整车 CAN 网络. 当车辆某个节点, 或者某条 CAN 总线 出故障甚至网关出故障了, 会有什么现象呢? 某ECU节点故障: 也就是你的车上的某个智能硬件不wor... 一辆2010款大众途锐车,搭载BHR发动机,累计行驶里程约为19万km,行驶中组合仪表上的多个故障灯(电动转向助力系统故障灯、ABS故障灯、前照灯照明距离调节故障灯及空气悬架系统故障灯等)突然点亮,且组合仪表背景灯熄灭,组合仪表右下角的蓄电池电量指示灯归零,同时还伴有空调鼓风机不工作、车窗玻璃无法升降等故障现象。故障现象仅能持续几秒钟,然后一切恢复正常,故障频率不高,也没有规律,有时好几天才出现1次,有时1天出现好几次。 二、故障诊断 用故障 检测 检测 ,发现网关中存储有多个控制单元无.
CAN 总线 具有很高的“健壮性”,这是因为 CAN 具有多种错误检查机制。 CAN 协议制定了5种错误 检测 方法 ,3种位于报文层,2种位于位流层。 如果一个数据帧出现错误,那么这个帧会被丢弃,并且接收节点还会发送一个错误帧。这会强制发送节点重复发送出错的报文,直到接收节点正确接收;如果同一个报文重复出错,达到一定次数后,发送节点可以关闭发送功能以降低对 总线 的影响。
将bert应用于 CAN 总线 异常 检测 ,具体的实现为LogBert,一种基于Bert的日志 检测 算法。资 中包含logbert的论文原文和 码,以及修改后适配了 CAN 数据的 异常 检测 算法,准确率和召回率可达99%以上,所用数据集为韩国HCLR发布的Car-hacking数据集,包含spoofing/ddos/fuzzying三种攻击形式。本次实现只包含对 CAN Id的 检测 。 可以学习到:BERT的实现,日志 检测 的流程,以及针对 CAN 数据集的处理,完整的训练调参过程。
基于 机器学习 异常 检测 方法 是指使用 机器学习 算法从数据中学习正常模式,并利用这种学习来 检测 异常 点。常见的基于 机器学习 异常 检测 算法包括: 1. K近邻算法(K-Nearest Neighbor,KNN):该算法通过计算数据点与其最近的K个邻居之间的距离来进行 异常 检测 。 2. 支持向量机(Support Vector Machine,SVM):该算法通过在数据空间中找到一个超平面来分离正常数据和 异常 数据,从而实现 异常 检测 。 3. 随机森林(Random Forest):该算法通过建立多个决策树来识别 异常 数据,其中每个决策树都投票决定数据点是否为 异常 。 4. 神经网络(Neural Network):该算法通过训练神经网络来学习正常模式,并利用网络输出来 检测 异常 数据。 需要注意的是,基于 机器学习 异常 检测 方法 需要充分考虑训练集与测试集的分布是否一致,否则可能会导致过拟合或欠拟合的问题。此外, 机器学习 异常 检测 方法 在处理大规模数据时需要考虑算法的效率和可扩展性。