【论文阅读】FC-Net: A Method of Few-Shot Network Intrusion Detection Based on Meta-Learning Framework

论文地址:https://ieeexplore.ieee.org/abstract/document/9083983

0. Abstract

传统的入侵检测系统(intrusion detection system)都是使用监督学习,没法应对小样本情况,所以作者提出了一种基于meta-learning的模型,该模型可以分辨“一对”网络流量(network traffic)是不是同一种类型(正常流量或恶意攻击)。

作者提出的模型叫FC-Net,主要有两部分:

  • 特征提取(feature extraction network):用于获取网络流量的特征
  • 比较(comparison network):用于比较两个流量是否为一种类型

最终,作者的模型不仅可以识别训练时见过的恶意攻击,也可以识别训练时没见过得恶意攻击(也就是在模型上生产后,又人工发现的,仅具有很少样本的攻击类型)。

1. Introduction

入侵检测系统:用于鉴别网络请求是正常请求还是恶意攻击

由于总是会有一些新类型的攻击,传统监督学习的入侵检测系统模型没法应对(泛化能力差),所以要使用few-shot learning来解决。

作者贡献:

  1. 基于meta-learning,让网络可以通过目前已有的数据学习到“如何分辨两个网络请求是否属于同一攻击类型”的先验知识
  2. 可以在真实的环境中使用。
  3. 泛化能力强,不局限于特定类型的攻击。

2. Problem Formulation

符号定义:

  • T T T:特定任务(specific task)
  • K K K:sample数量
  • D = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , ⋯   , ( x i , y i ) , ⋯   , ( x K , y K ) } \mathcal{D}=\{(x_1,y_1), (x_1,y_1),\cdots, (x_i,y_i), \cdots, (x_K,y_K)\} D={(x1,y1),(x1,y1),,(xi,yi),,(xK,yK)} :数据集(Dataset)
  • x i ∈ R d x_i \in \R^d xiRd x x x 的特征为 d d d
  • y i ∈ { 0 , 1 } y_i \in \{0, 1\} yi{0,1}:Label,0代表正常请求,1代表恶意攻击
  • T = { T A , T B , T C , ⋯   } \mathcal{T} = \{T_A,T_B,T_C,\cdots\} T={TA,TB,TC,}:任务集,里面包含多个特定任务
  • S a Sa Sa:Sample Set

在这里插入图片描述
Meta-learning可以做到:在任务1,2,3上训练,然后用到新任务4上。

例如:现在有样本集 O, A, B, C, D ,其中O是正常类型,A,B,C,D是不同的攻击类型。其中 O,A,B,C 都有大量的样本,但D只有 K K K 个样本,但作者提出模型可以通过对O, A, B, C的学习后,可以仅通过 D 的 K K K (K很小)个样本,就能判别一个攻击是否是 D 类型。

3. Network Traffic Representation (数据与其处理方式)

3.1 Packet and Data Flow

packet:网络流量的最小传输单位(The minimum transmission unit of network),每个packet包含header和payload。例如,一个Http请求是一个packet,然后对方再响应一下,又是一个packet

data flow:一批相关的packets就是一个data flow。它们有5个相同的东西:source IP, destination IP, source port, destination port, protocol

本篇论文是用data flow作为检测对象(detection object)。由于data flow计算复杂,所以进行如下处理:

  1. 每个data flow取前M个packets作为一个整体。后面的就不要了
  2. 每个packet取前 N 个bytes。N必须是平方数,即 N \sqrt{N} N 要是整数。
  3. 如果packets数量不足M,或packet的bytes数不足 N,则补0

按上述一处理,不规则的data flow数据就变规则了,计算机就好处理了。即每个样本有 M ∗ N M*N MN 个特征

3.2 Visualization

上面处理过后,就可以让数据可视化了。

因为 N 是平方数,所以可以让N个bytes (也就是 N × N \sqrt{N} \times \sqrt{N} N ×N 个bytes),每个byte又是 [0,255] 的值,可以作为灰度值(gray scale),这样一个packet可以对应成一个灰度图。

为了方便起见,可以将3个连续的packets分别对应R/G/B,变成一个彩色图。
在这里插入图片描述

例如,M=9,N=64,可视化后如下图:
在这里插入图片描述
上图其实是把4个类别中的所有样本的data flow分别取平均后再进行可视化。可以看出来,每个类别都各有特点。如Type B棕色会多一点。

4. Few-shot Network intrusion detection

4.1 Meta-learning Framework

Meta-learning:就是教机器如何学习(learning to learn),在该篇论文中,就是让模型学习到如何分辨“差异(differences)”。一旦模型具备了这种能力,让未知的网络流量和正常的网络流量一对比,就知道未知流量是不是正常的了(如果存在过大的差异,那就不是正常网络流量)。

该篇论文提出的网络架构如图:

在这里插入图片描述
该架构分为几部分:

  1. Packets Acuisition:获取原始数据。其中PCAP就是原始网络流量的文件格式。
  2. Dataset Construction:将原始数据进行预处理,然后构建成图片,然后生成四个数据集:①(用于训练) Sample SetQuery Set; ②(用于测试) Support SetTest Set
  3. F-Net:用于提取数据特征。将网络请求送入模型(本文用的是CNN),然后获取特征编码(feature embedding)。因为是要对比两个数据是否属于同一个类别,所以一次传入两个数据,然后都进行特征提取(用的是同一个CNN)。
  4. C-Net:用于判定两个feature embedding是否是同一个类别。最后输出的Delta Score就是相似程度(0-1),score“越小”,说明越相似,两者越有可能是同一类别,反之亦然。
  5. Classification:用于对要预测的数据进行类型判别。其中Label 0表示正常流量,Label 1表示恶意攻击。

该结构需要注意的几点:

  • 该模型实际是一个 2-way K-shot 的小样本学习模型,2-way对应的就是Label 0 和 Label 1。所以其实有些场景是没法应对的,比如要预测的是类型D,但是给的2-way却是 O 和 A,这样不管最后输出什么其实都是错的。(这点作者好像并没有给出解释)
  • Classification这一层可以看到是多个Delta,而前一层输出的只有一个Delta。其实Classification前面的那些步骤做了 2 K 2K 2K次,然后取的平均,最后得到两个Delta Score。(后面的算法会说明)
  • Sample Set 其实就是 Support Set,只是换了个名字。同理,Test Set其实就是Query Set

4.2 Architecture of FC-Net

FC-Net的具体架构如下图:

在这里插入图片描述

就是个CNN。注意几点即可:

  1. F-Net和C-Net是堆叠的,即F-Net的输出直接作为C-Net的输入即可
  2. 由于送给FC-Net的数据时三维的(通道数×图片数×宽×高(在pytorch中,图片数是放在通道后面的)),所以在pytorch中需要用Conv3D,而非Conv2D
  3. 网络并不要求对称性,即 F(A, B) = F(B, A),只要近似相似就行了,所以并没有对网络增加这方面的限制
  4. 2x2x2是指卷积核的大小
  5. 128是指输出通道数
  6. 作者没具体说stride和padding,应该都是取默认

疑问点:

  1. C-Net的第一步concat的维度作者并没有给出(有可能是通道,也可以是Frame)
  2. 图片数不能太小,如果太小的话,卷到后面这一维度就成1了,然后就没法卷和pooling了。(这点作者好像没说)

4.3 Few-shot Training

few-shot learning和传统神经网络训练不太一样,不是按epoch算的,而是按episode算的。一个episode就是构建一个任务,然后针对该任务进行训练,完成后,进入下一个episode。

同样,数据集也不是拆成training data 和 testing data,而是拆分成四部分:

  • Smaple Set:训练阶段使用,用于模拟meta-testing阶段的support set。
  • Query Set:训练阶段使用,用于模拟meta-testing阶段的test set。
  • Support Set:测试阶段使用,为要判定类型的未知类型的数据提供参考。包含 inputs 和 labels。
  • Test Set:测试阶段使用,需要判定类型的未知类型的数据,只有input,没有label

每次训练都要从数据集中随机生成sample set 和 query set,生成过程如下:

在这里插入图片描述

翻译成中文如下:


输入(input): ① 数据集 D \mathcal{D} D(包含 n n n个样本),其中每个样本的 x x x d d d 维的, y y y 是Label, y y y 的范围[0, N]; ② query set的大小 B B B ;③ 每个类别的样本数量 K K K。即每一种类型,要生成 K K K 个样本。

输出(output):输出一个few-shot任务 T = { S a , Q , K } \mathcal{T} = \{Sa, Q, K\} T={Sa,Q,K},其中 S a Sa Sa 表示Sample Set, Q Q Q 表示 Query Set, K K K 表示每个类型有 K K K 个样本。

规定(Require):定义函数 R a n d S m a p l e ( D , K ) RandSmaple(\mathcal{D}, K) RandSmaple(D,K),功能是:从数据集 D \mathcal{D} D 中随机选取 K K K 个样本。

生成过程:

1.从攻击数据集中随机选取一个样本标签 L a b e l Label Label
2.(1)生成sample set
3.从正常样本中选取 K K K 个。 D ⟨ 0 ⟩ \mathcal{D}\langle 0 \rangle D0 代表正常样本的集合,正常样本的Label是 0 0 0
4.从第一行选择的那个攻击类型( L a b e l Label Label)的样本集中选取 K K K 个样本
5.将正常样本和攻击样本合并成Sample Set “ S a Sa Sa”,所以Sample Set的数量为 2 K 2K 2K
6.(2)生成query set
7.随机选取 B / 2 B/2 B/2 个正常样本
8.随机选取 B / 2 B/2 B/2 个攻击样本
9.将正常样本和攻击样本合并成query set “ Q Q Q”,所以query set 的大小为 B B B
10.(3) 替换标签
11-17.第一行选择的攻击类型标签不一定是1,所以把攻击类型的标签都替换成1,方便后续处理
18.(4)生成任务
19. T = { S a , Q , K } \mathcal{T} = \{Sa, Q, K\} T={Sa,Q,K}


任务生成好后,就可以送进FC-Net进行训练了,过程如图:

在这里插入图片描述

翻译成中文如下:


输入(Input):① 将上一步产生的 T = { S a , Q , K } \mathcal{T} = \{Sa, Q, K\} T={Sa,Q,K} 输入网络; ② Query 的大小 B B B

输出(Output):损失 J \mathcal{J} J

训练过程:

1.目标:尽可能让损失 J \mathcal{J} J趋于0
2.for :逐个遍历query set中的样本
3.     初始化 D e l t a S c o r e 0 = 0 DeltaScore0=0 DeltaScore0=0,衡量sample set中的正常样本与当前query样本的相似度
4.     初始化 D e l t a S c o r e 1 = 0 DeltaScore1=0 DeltaScore1=0,衡量sample set中的攻击样本与当前query样本的相似度
5,6:计算sample set中所有正常样本的feature map
5,7:计算smaple set中所有攻击样本的feature map
5.8:计算当前query样本的feature map (我认为这个可以拿到5的for循环的外面)
5,9:计算当前query样本与正常样本的相似程度,并累加
5,10:计算当前query样本与异常样本的相似程度,并累加
12,13: 对 D e l t a S c o r e 0 和 D e l t a S c o r e 1 DeltaScore0和DeltaScore1 DeltaScore0DeltaScore1求平均(注意Score越小,表示越相似)
14-19:DeltaScore0 和 DeltaScore1 谁小,就表示当前query样本和谁相似,说明对应的Predict就是啥
20.累加损失(这里好像有点问题,因为是MSE的话,应该传DeltaScore才对)


由于网络输出的是一个数字,而非标签,所以使用MSE,而非Cross-entropy,MSE公式如下:

M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) M S E=\frac{1}{n} \sum_{i=1}^{n}\left(y_{i}-\widehat{y_{i}}\right) MSE=n1i=1n(yiyi )

(作者这里公式应该写错了,少了个平方)

作者使用的优化器是Adam,超参如下表:

在这里插入图片描述

5.Evaluation

5.1 Datasets

作者使用的数据集:ISCX2012,CICIDS2017

作者设置的 M = 16 , N = 256 M=16,N=256 M=16N=256 (这里好像也有点问题,因为要组成RGB彩色图,所以 M M M 应该需要是3的倍数,不知道作者在这里是怎么处理的)

数据预处理包含两步:

  1. Normalization:把bytes从[0,255]归一化到[0,1]
  2. Anonymization:把数据中的IP给干掉(作者说是因为不适用于真实环境,我觉得原因应该是攻击者可以用代理IP来隐藏自己的IP)

5.2 Metrics

作者使用了:精准率(ACC)、发现率(Detection Rate,DR)(即真正的攻击有百分之多少被正确检测出来了)

5.4 Detection Results

在这里插入图片描述
图片解释:

  • 作者做了1000次实验,所以用箱图(box-plot)表示。
  • 红色是精准率(Accuracy),蓝色为发现率(Detection Rate)
  • iA, iB, … 是数据集
  • 有四张图是因为类似交叉验证的方式,例如图(a)是在iA,iB,iC上训练,然后看在iD的表现如何

在该图(a)中,作者意外的发现,虽然训练阶段model没看过iD,但DR却几乎可以达到100%。

作者还做了一些其他实验,就不贴图了。

Conclusion

作者提出的网络不仅可以检测训练阶段见过的攻击,也可以检测没见过的攻击,效果也还不错。

深入思考(非论文内容)

在读完该论文后,思考下论文中可能还有待改进的地方:

  1. 作者在构建 task 时使用的随机选择,这样就可能会产生与bagging算法相同的问题,即有些样本被选了好多次,但有些样本一次都没被选中过
  2. 作者的模型只能应对 2-way 的方式,哪应该如何应对 N-way 问题呢?
  3. 该模型可能会被攻击,那如何对该模型进行攻击,该模型如何进行防御呢?(这个作者在future work中也提了)
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 46
    评论
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值