文章目录
论文地址: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来解决。
作者贡献:
- 基于meta-learning,让网络可以通过目前已有的数据学习到“如何分辨两个网络请求是否属于同一攻击类型”的先验知识
- 可以在真实的环境中使用。
- 泛化能力强,不局限于特定类型的攻击。
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 xi∈Rd: 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计算复杂,所以进行如下处理:
- 每个data flow取前M个packets作为一个整体。后面的就不要了
- 每个packet取前 N 个bytes。N必须是平方数,即 N \sqrt{N} N 要是整数。
- 如果packets数量不足M,或packet的bytes数不足 N,则补0
按上述一处理,不规则的data flow数据就变规则了,计算机就好处理了。即每个样本有 M ∗ N M*N M∗N 个特征
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)”。一旦模型具备了这种能力,让未知的网络流量和正常的网络流量一对比,就知道未知流量是不是正常的了(如果存在过大的差异,那就不是正常网络流量)。
该篇论文提出的网络架构如图:
该架构分为几部分:
- Packets Acuisition:获取原始数据。其中PCAP就是原始网络流量的文件格式。
- Dataset Construction:将原始数据进行预处理,然后构建成图片,然后生成四个数据集:①(用于训练) Sample Set,Query Set; ②(用于测试) Support Set,Test Set
- F-Net:用于提取数据特征。将网络请求送入模型(本文用的是CNN),然后获取特征编码(feature embedding)。因为是要对比两个数据是否属于同一个类别,所以一次传入两个数据,然后都进行特征提取(用的是同一个CNN)。
- C-Net:用于判定两个feature embedding是否是同一个类别。最后输出的Delta Score就是相似程度(0-1),score“越小”,说明越相似,两者越有可能是同一类别,反之亦然。
- 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。注意几点即可:
- F-Net和C-Net是堆叠的,即F-Net的输出直接作为C-Net的输入即可
- 由于送给FC-Net的数据时三维的(通道数×图片数×宽×高(在pytorch中,图片数是放在通道后面的)),所以在pytorch中需要用Conv3D,而非Conv2D
- 网络并不要求对称性,即 F(A, B) = F(B, A),只要近似相似就行了,所以并没有对网络增加这方面的限制
- 2x2x2是指卷积核的大小
- 128是指输出通道数
- 作者没具体说stride和padding,应该都是取默认
疑问点:
- C-Net的第一步concat的维度作者并没有给出(有可能是通道,也可以是Frame)
- 图片数不能太小,如果太小的话,卷到后面这一维度就成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
D⟨0⟩ 代表正常样本的集合,正常样本的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
DeltaScore0和DeltaScore1求平均(注意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=1∑n(yi−yi )
(作者这里公式应该写错了,少了个平方)
作者使用的优化器是Adam,超参如下表:
5.Evaluation
5.1 Datasets
作者使用的数据集:ISCX2012,CICIDS2017
作者设置的 M = 16 , N = 256 M=16,N=256 M=16,N=256 (这里好像也有点问题,因为要组成RGB彩色图,所以 M M M 应该需要是3的倍数,不知道作者在这里是怎么处理的)
数据预处理包含两步:
- Normalization:把bytes从[0,255]归一化到[0,1]
- 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
作者提出的网络不仅可以检测训练阶段见过的攻击,也可以检测没见过的攻击,效果也还不错。
深入思考(非论文内容)
在读完该论文后,思考下论文中可能还有待改进的地方:
- 作者在构建 task 时使用的随机选择,这样就可能会产生与bagging算法相同的问题,即有些样本被选了好多次,但有些样本一次都没被选中过
- 作者的模型只能应对 2-way 的方式,哪应该如何应对 N-way 问题呢?
- 该模型可能会被攻击,那如何对该模型进行攻击,该模型如何进行防御呢?(这个作者在future work中也提了)