研究型论文
An Analysis of Recurrent Neural Networks for Botnet Detection Behavior ——2016
- 贡献:提出RNN在分析网络流量行为与检测潜在攻击方面具有可行性
- 分类25个连接状态达到的检测效果最好,但是实验中显示LSTM 检测模型只需要考虑前 6 个状态即可准确,其余的可以被 LSTM 算法丢弃,而且10个和25个状态的性能差异很小,因此首选10个状态的长度,这样可以有效减少LSTM的所需计算资源
- 实验中LSTM对于测试流量集中的属于僵尸网络流量的未知尝试流量检测率高,而对于属于僵尸网络流量的HTTP和HTTPS的流量检测率低,此外,该模型能够正确检测大部分正常流量,除了部分HTTP流量。文中对该现象的解释为训练数据集中HTTP流量标签的不平衡导致的
- 下采样和过采样相较于不采样都大幅降低了误报率,此外,由于这两种采样方式的效果差异不大,且下采样的计算效率更高,因此优选下采样。采样是为了平衡数据集标签
LUCID: A Practical, Lightweight Deep Learning Solution for DDoS Attack Detection —— 2020
- 利用CNN创建了一种轻量级,处理开销低(结构简单)的检测DDoS的模型;提出了一种预处理机制,该机制通过基于时间窗口的流量分段模拟现实中流量捕获的过程,并且将每个样本的大小和形状固定一致,以便于CNN处理,此外,样本以同一双向数据流为基础,超出形状的流被截断,不足的则填充0,这样做可以要求模型必须根据部分流量做出决策,而无需了解通信的完整的生命周期。 -- 4
- 2000年以来就提出了在容量 DDoS 攻击期间,流量特征的随机性会突然变化,可以借此进行检测,即基于熵的检测方法,但是检测阈值的选择是该方法的一个缺点 -- 2
- 该模型使用CNN网络,CNN能够重复使用权重,这减少了资源消耗 -- 5
- 数据集ISCX2012 , CIC2017 and CSECIC2018,这些数据集以pcap文件保存了几天的包括恶意的和良性的网络活动 -- 6
- 为了避免出现在一个数据集上表现良好而在另一个数据集上不行的情况,论文提取每个数据集中DDoS的流量并随机选择同年的数量相同的良性流量进行平衡 -- 7
- 模型训练时如果损失值25次不减少或者超过最大训练轮数则停止;一个样本中最大报文数n小于5时,F1得分随n稳定增加,大于5时收敛,使用较小的n所做的卷积更少,可以加快检测时间 …… -- 8
- 该论文充分利用了CNN的特性,如参数共享、高准确性、无需复杂的特征工程;该论文的主要创新点在于其数据预处理部分。
- 该方法只能检测DDoS攻击,可以优化以检测更多攻击。
code
-
数据预处理的代码中采用分阶段处理的方式,先将.pcap文件中的数据处理后保存到 .data 文件中,然后再处理 .data 文件,将数据保存到 .hdf5 中,这样方便后续多样地划分训练、验证、测试数据集的比例
- 在第一个过程中,根据数据集表明的攻击者IP和受害者IP将二者的双向流量打上DDOS的标签,其余的打上良性流量标签。利用pyshark处理.pcap文件,根据通信双方的五元组(区分正反向)对数据包提取部分流量特征,如果样本中的报文数小于最大值且在同一个时间窗口内的则保存在同一个字典中(字典的键值是数据包开始时间),不在同时间窗口内则创建一个新的字典,如果报文数量超出限制则舍弃。整个过程以多线程处理不同文件的方式同时运行,最终将这些数据存到.data文件中。
- 第二个过程中,以DDOS报文数量和良性报文数量中更小的一个作为标准,将二者的数量都平衡到这个标准,多余的舍弃,然后将这些报文特征按样本保存到一个新的数组中。然后将整体分割为训练和测试数据集,再从训练数据集中分割出真的训练数据集和验证数据集。然后从每个数据集中分离出数据和标签,此过程会舍弃五元组信息。然后对数据进行归一化和填充,大于规定样本数量的截断,小于的填充0。然后将数据和标签转换为numpy的数组类型,之后分别保存到训练、验证、测试数据集的文件中(.hdf5)。
-
训练过程的逻辑较为简单,但代码实现可能较为陌生。先读取训练和验证数据集内容,使用KerasClassifier将自己定义的Conv2DModel模型包装成sklearn的分类器,然后使用 GridSearchCV 进行超参数搜索,此外还要配置回调函数EarlyStopping和ModelCheckpoint的参数,用于规定某组超参数下训练的停止条件以及根据什么指标自动保存最好的模型,之后对GridSearchCV的实例对象使用.fit方法开始执行训练(超参数搜索),具体要进行多少次超参数搜索取决于所给的超参数个数和取值范围。
# 模型定义方式 def Conv2DModel(): model = Sequential() # 初始化一个顺序模型 model.add(Conv2D(...)) # 添加一个二维卷积层 model.add(MaxPooling2D(...)) # 添加一个最大池化层 model.add(Flatten()) # 将多维输入展平成一维 model.add(Dense(...)) # 添加一个全连接层 # 编译模型,指定优化器、损失函数和评估指标 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model # 返回构建好的模型
-
测试过程读取测试数据集内容,并加载指定的已保存的模型,使用model.predict即可对数据进行预测。
# 使用模型进行预测并将结果转为布尔值,然后去除预测结果中所有大小为1的维度 Y_pred = np.squeeze(model.predict(X, batch_size=2048) > 0.5) # 计算正确率 accuracy = sklearn.metrics.accuracy_score(Y_true, Y_pred) # 计算F1得分 f1 = sklearn.metrics.f1_score(Y_true, Y_pred) # 计算混淆矩阵的四个值 # tn (True Negative): 真负类,表示实际为负类且预测也为负类的样本数 # fp (False Positive): 假正类,表示实际为负类但预测为正类的样本数 # fn (False Negative): 假负类,表示实际为正类但预测为负类的样本数 # tp (True Positive): 真正类,表示实际为正类且预测也为正类的样本数 tn, fp, fn, tp = sklearn.metrics.confusion_matrix(Y_true, Y_pred, labels=[0, 1]).ravel()
Deep Learning in Cybersecurity: A Hybrid BERT–LSTM Network for SQL Injection Attack Detection —— 2024
- BERT和LSTM网络结合的混合模型用于检测恶意负载效果较好,文中显示准确率、精确率、召回率和F1分数上分别达到了0.973、0.963、0.962和0.958
- BERT负责提取丰富的语义特征,而LSTM负责处理这些特征并进行序列分析和分类预测
- 该模型组合能够将用户正常的含有敏感单词的输入正确判断,减少误报
- 文中讲该模型组合尚有不足:
- 对经过多次编码成功绕过WAF的恶意负载的检测效果不佳
- 模型在识别XSS(跨站脚本攻击)和系统命令注入等非SQL注入攻击方面的能力有待提高,泛洪能力有待提高
- 该文本质上是使用NLP模型处理url文本并预测是否恶意
Detecting Unknown Encrypted Malicious Traffic in Real Time via Flow Interaction Graph Analysis ——2023
-
攻击者会利用加密流量的方式隐藏其恶意行为,而且加密流量与良性流量具有相似的特征,所以可以规避现有的基于机器学习的检测系统,且加密后的流量具有隐蔽性,无法通过单个流的模式检测攻击。但是可以这些攻击涉及多个攻击步骤,攻击者和受害者之间具有不同的流交互,这与良性流的交互模式不同。文中提到的方法是先构建一个紧凑的图结构来表示各种流交互模式,通过识别异常流交互,而无需访问数据包的负载来实现无监督检测。--1
-
文中方法并没有使用传统的四元组来构建图,由于互联网上的大多数流都很短,而数据包流与长流有关,所以采取短流和长流来表示交互模式。首先通过提取联通分量来分析图的连通性,然后提取特征进行聚类来识别异常分量。该过程派出了良性成分,显著减少了学习开销。--2
-
文中对流进行分类的方法如下:维护一个计时器
TIME_NOW
和一个哈希表,哈希表使用HASH(SRC, DST, SRC PORT, DST PORT)
作为键,收集到的流量(由它们的每包特征序列指示)作为值。算法每隔JUDGE_INTERVAL
秒根据TIME_NOW
遍历哈希表,并在最后一个数据包在PKT TIMEOUT
秒前到达TIME_NOW
时判断流已完成。完成的流如果包含超过FLOW LINE
个数据包则被分类为长流,否则被分类为短流。--4 -
由于使用传统的四元组作为流的边会导致图非常密集,造成依赖爆炸的问题,所以文中采取短流聚合的方式解决该问题并有效减少内存使用量。当满足以下所有要求时,一组流可以聚合: -- 4
(1)流具有相同的源地址 和/或 目的地址,这意味着由这些地址产生的行为相似;
(2)流具有相同的协议类型;
(3)流的数量足够大,即当短流的数量达到阈值AGG LINE时,确保流具有足够的重复性。 -
文中通过对长流进行了统计分析,按照每包的数据包长度和时间间隔将其哈希码(对应特征值/桶宽度)放入对应的桶中并计数,分别对这两种桶设置10字节和1毫秒的宽度,统计结果所绘制的直方图说明长流的数据包长度和时间间隔这两种特征都是集中分布的。-- 5
-
后面看不懂了
Towards Autonomous Cybersecurity: An Intelligent AutoMLFramework for Autonomous Intrusion Detection —— 2024
-
文中提到的基于AutoML的自主IDS就是一种使用机器学习的全过程自动化的IDS,包括自动数据预处理(能够平衡数据)、根据一些指标自动选择最相关的特征、可以自动训练六种基于树的机器学习模型,并能够从中选择性能最好的三个模型、然后将这三个模型经过超参数优化后当作基础模型来构建集成模型。基于AutoML的IDS的主要优势是减少人力消耗。
-
使用数据集:CICIDS017和 5G-NIDD,CICIDS2017 数据集是最全面的公共网络安全数据集之一
-
AutoML方法将机器学习用在从数据处理、特征工程、模型选择、超参数调优到模型训练等整个机器学习流水线过程中,而以前的流程中只有模型训练涉及到机器学习模型。可见本文的侧重点在于整个训练过程的自动化,对于人力资源的节省。
-
该文章使用TVAE模型识别并解决数据不平衡的问题。根据基尼指数和熵度量计算出特征的重要性分数,作为自动特征工程。随后是自动化模型训练和选择其中表现最好的三个。再使用BOTPE方法进行自动超参数调优 -- 4
TVAE(表格变分自动编码器)是一种结合了VAE和深度度量学习的机器学习模型,即它是一种神经网络模型。在本文中用作过采样方法,用于合成少数类样本来平衡表格网络数据 -- 5
-
数据集的类别不平衡会导致模型优先考虑正常样本和常见攻击的检测,而忽略不太常见但可能关键的威胁。 -- 5
-
该文章将三个最好的模型通过集成学习结合在一起。集成学习可以通过利用多个模型的集体只是来提高模型性能和泛化性能。 -- 7
- 堆叠:堆叠的第一层包含多个经过训练的基础学习器,它们的输出标签作为第二层中训练鲁棒元学习器的输入
-
在网络应用中,低推理时间通常比低训练时间更重要,因为模型训练通常发生在具有充足计算资源的云服务器上,而在许多场景中模型预测是在计算能力有限的边缘或本地设备上执行的。 -- 10
code
-
训练基础模型并选择三个最优模型。使用原始数据对DT、RF、ET、XGBoost、LightGBM、Catboost这六种模型进行训练,记录训练过程所用的时间以及平均每个样本所用的时间。还使用sklearn.metrics.precision_recall_fscore_support方法计算出各种分数,重点是使用sklearn.model_selection.cross_val_score方法计算多次准确率,其平均值值会在后面用于比较模型性能选出最佳的三个。
# 创建一个决策树对象,设置随机数种子为0 dt = DecisionTreeClassifier(random_state=0) # cross_val_score方法会会内部训练模型的副本以进行评估,而不会影响最初创建的模型对象 # cv=3是将训练集分成三份,每次选择一个作为测试集,其他两个作为训练集计算得出三个准确率 dt_scores = cross_val_score(dt, X_train, y_train, cv=3) # 开始训练 dt.fit(X_train, y_train) # 计算训练后的模型的准确率和各种分数 dt_score = dt.score(X_test, y_test) precision, recall, fscore, none = precision_recall_fscore_support(y_true, y_predict, average='weighted') # 其他模型训练同理 ...... # 模型选择 # 将使用cross_val_score 方法交叉验证的平均准确率作为模型选择的标准存入字典 base_model_performance = { 'dt': np.mean(dt_scores), 'rf': np.mean(rf_scores), 'et': np.mean(et_scores), 'xg': np.mean(xg_scores), 'lgbm': np.mean(lgbm_scores), 'cat': np.mean(cat_scores) } # 对模型排序,key指定排序依据为键对应的数值,reverse为降序,返回键名 ranked_models = sorted(base_model_performance, key=base_model_performance.get, reverse=True) # 将前三个模型的名称存入列表 top_3_models = ranked_models[:3]
-
使用模型的predict和predice_proba方法分别计算出6个模型对数据集预测的结果。predict返回的是每个样本的预测结果,即分类编号,而predict_proba返回每个样本的7中分类概率。其次,predict返回一个一维数组,需要将其转换为列向量。predict_proba返回一个二维数组,每一列代表一个类别,已经符合模型集成的输入格式要求,因此不需要进行 reshape 操作。
# 计算预测结果 dt_train=dt.predict(X_train) dt_test=dt.predict(X_test) dt_prob_train=dt.predict_proba(X_train) dt_prob_test=dt.predict_proba(X_test) # 其他模型同样计算 ...... # 将predict方法返回的结果转换形状 dt_train=dt_train.reshape(-1, 1) dt_test=dt_test.reshape(-1, 1) ......
-
将性能前三的模型的预测输出结合为一个三维数组,然后再将三维数组水平拼接为一个二维数组作为元学习器的输入。分别以predict方法输出的
_train
、_test
和predict_proba方法输出的prob_train
、_prob_test
以及_train+_prob_train
、_test+_prob_test
作为输入进行三次训练。# 以predict方法输出的
_train
、_test
作为输入 top_3_train_predictions = [globals()[model.lower() + '_train'] for model in top_3_models] top_3_test_predictions = [globals()[model.lower() + '_test'] for model in top_3_models] x_train = np.concatenate(top_3_train_predictions, axis=1) x_test = np.concatenate(top_3_test_predictions, axis=1) # 训练元学习器 stk = xgb.XGBClassifier(random_state=0).fit(x_train, y_train) # 预测并计算准确率 y_predict=stk.predict(x_test) y_true=y_test stk_score=accuracy_score(y_true,y_predict) # predict_proba方法输出的prob_train
、_prob_test
作为输入 top_3_train_proba = [globals()[model.lower() + '_prob_train'] for model in top_3_models] top_3_test_proba = [globals()[model.lower() + '_prob_test'] for model in top_3_models] x_train = np.concatenate(top_3_train_proba, axis=1) x_test = np.concatenate(top_3_test_proba, axis=1) ...... #_train+_prob_train
、_test+_prob_test
作为输入 top_3_train_predictions = [globals()[model.lower() + '_train'] for model in top_3_models] top_3_test_predictions = [globals()[model.lower() + '_test'] for model in top_3_models] top_3_train_proba = [globals()[model.lower() + '_prob_train'] for model in top_3_models] top_3_test_proba = [globals()[model.lower() + '_prob_test'] for model in top_3_models] x_train = np.concatenate(top_3_train_predictions + top_3_train_proba, axis=1) x_test = np.concatenate(top_3_test_predictions + top_3_test_proba, axis=1) ...... -
自动选择特征值。提取性能前三的模型学习到的征重要性,然后将其结合为一个三维数组,然后计算每个特征的重要性分数的平均值。根据平均值对特征排序。取前n个重要性分数总和大于0.9的特征及其数据作为新的数据集,然后对其进行训练和测试集分割。
-
对于样本数量少于平均样本数量的一半的类别,使用TVAE模型生成样本来平衡数据集。
# 导入库 from sdv.metadata import SingleTableMetadata from sdv.single_table import TVAESynthesizer # 创建元数据对象 metadata = SingleTableMetadata() metadata.detect_from_csv(filepath='Data/CICIDS2017_sample_0.02_fs.csv') # 从 CSV 文件检测元数据 # 创建TVAE模型 tvaegan = TVAESynthesizer(metadata=metadata) # 训练模型和生成合成数据 tvaegan.fit(data) # 使用原始数据训练模型 new_samples = tvaegan.sample(num_rows=num_samples_needed) # 合并数据,用循环的方式将所有需要生成样本的类别合并在一起 synthetic_data = pd.DataFrame() synthetic_data = pd.concat([synthetic_data, new_samples], ignore_index=True) # 将生成的样本和原始数据合并 balanced_data = pd.concat([X_train.assign(Label=y_train), synthetic_data], ignore_index=True)
-
使用经过特征选取和数据集平衡后的数据,即balanced_data作为新的数据集,再对上述6个进行同样的训练和预测,并然后使用BO-TPE方法对每个模型进行超参数优化。然后再使用平衡的训练数据集和测试数据集重复上述第2和3点的步骤。
ET-BERT: A Contextualized Datagram Representation with Pre-training Transformers for Encrypted Traffic Classification -- 2022
-
论文对加密流量分类的方法为先使用原始数据预训练,然后基于特定目标进行微调。早期对加密流量分析的工作有:利用加密剩余的部分明文(如证书)提取指纹进行分类,但是对于新的加密技术TSL 1.3,剩余明文变得更加稀疏和模糊,这种方法效果不佳;后来有使用经典机器学习对统计特征进行学习的方法分类,但是高度依赖于特征的选取,泛化能力差;也有使用深度学习算法自动学习原数据中复杂模式的方法,但是高度依赖于标记数据的数量和分布,对于新出现的加密方法效果不佳。
-
论文设计了两个预训练任务——Masked BURST Model(MBM)和Same - origin BURST Prediction(SBP)。MBM任务类似于BERT中的Masked Language Model,通过随机掩盖输入序列中的部分token,并训练模型基于上下文预测这些掩盖的token,从而捕捉数据包字节之间的相关性。SBP任务则用于学习BURST中数据包的传输关系,通过预测两个子BURST是否来自同一个BURST源,进一步挖掘流量的上下文信息。
-
BERT是使用 Transformer 的多头自注意力机制,通常用于自然语言处理,对于上下文的理解效果很好。为了让数据流转换为类似单词的token,文中采用以下方法:在一个会话流中提取连续的服务器到客户端或客户端到服务器的单向数据包构成一个集合,称为BURST,BURST内容为16进制编码的数据,然后先使用bi-gram模型将16进制的数据分为一系列单元,再将这些单元通过Byte-Pair Encoding编码为token(0-65535),再将结果分为两个子段,用于后面的预训练中的SBP(数据包同源预测,相当于BERT中的NSP)任务。
-
数据集:
- 预训练:使用了大约30G的无标签数据,包含多种网络协议流量,旨在确保模型能够学习到广泛且具有代表性的加密流量特征,从而提高其在不同加密流量分类任务中的泛化能力
- 微调:USTC-TFC包含10类良性流量和10类恶意流量、ISCX VPN包含6个通信应用的分为VPN和非VPN的流量、ISCX-Tor包含16个应用程序的tor流量、CSTNET-TLS 1.3包含120个应用程序的加密流量
-
在微调过程中,对数据进行了预处理
- 移除与传输内容无关的地址解析协议(ARP)和动态主机配置协议(DHCP)数据包。
- 移除以太网头部、IP头部和TCP头部的协议端口,以避免这些强识别信息引入偏差。
- 从每个类别中随机选择最多500个流和5000个数据包进行微调。
- 每个数据集按照8:1:1的比例分为训练集、验证集和测试集。
-
消融实验中,去掉预训练过程直接进行监督学习会导致F1大幅下降,说明预训练的重要性。