邹 源 张 甲 江 滨
(清华大学网络科学与网络空间研究院 北京 100084)
加密流量已经成为互联网中的主要流量,根据思科统计,截至2018年,互联网中超过60%的网络流量使用了加密技术。Chrome等主流浏览器对于不加密的网站进行报警的做法也加速了Web服务中HTTPs技术的部署。与此同时,恶意软件与控制服务器的通信方法从传统的HTTP请求逐渐向加密流量转变,截至2018年,超过70%的恶意软件通信流量使用了TLS加密技术[10]。在这一背景下,对加密流量中的恶意流量检测有着迫切的需要。
TLS加密技术位于传输层和应用层之间,用于在两个通信应用程序之间提供保密性和数据完整性。一方面,它为主机之间的通信提供加密与安全保护,有效防止了中间人攻击,保证了数据的可靠性传输。另一方面,它让基于流量内容的检测方法变得困难,让一些恶意流量有了可乘之机。攻击者在成功入侵主机后,为了绕开防火墙的限制,通常会控制失陷主机主动连接攻击者建立的服务器(控制与命令服务器),接收攻击者发布的指令,这一类的流量称为命令与控制流量。由于服务端主机由攻击者搭建,攻击者为了搭建方便,使用与正常网络服务相似的网络协议和服务框架,比如HTTP和HTTPs,这使得区分恶意流量和正常流量变得困难。
在加密环境下检测方法依赖于识别流量的行为模式,从流量的传输包大小和时间序列中分析和寻找恶意流量的特征,然后建立机器学习的模型对正常流量进行区分。其中的特征提取是一个基于直觉和专业知识的手动过程,它比最终分类算法的选择更加重要。但是,在攻击者变更攻击代码后,流量的行为模式在特征集上会随之变化,检测方法需要人工分析新的流量特征检测恶意流量。
本文提出一种基于长短时记忆(LSTM)神经网络的恶意流量检测方法,它可以使用深度学习自动提取流传输模式的特征,在此基础上建立分类器对恶意流量进行检测。
恶意流量的检测是网络安全领域一个常见问题,包括攻击阶段的渗透测试流量检测、拒绝服务攻击检测、暴力破解攻击检测,以及控制主机后的隐蔽隧道通信检测、命令与控制流量(C&C)检测等。本文研究目标是检测C&C流量,现有的检测方法主要可以分为三类:(1) 依赖于对传输内容的检测,通过深度包解析的方法匹配传输流量中的恶意关键词,比如文献[10]提出的基于HTTP模板检测botnet通信的方法,这类方法在不对应用流量解密的情况下无法提取流量中的关键词,因此不能检测加密通信;(2) 基于上下文流量进行检测的方法,比如文献[9]和文献[11]提出的恶意域名检测,针对失陷主机在DNS请求中使用的DGA域名进行检测,这类方法无法检测直接使用IP地址或者以P2P形式构造的僵尸网络;(3) 基于TCP/IP层的传输信息提取统计特征,包括包长的均值、方差、峰值等,利用特征建立检测模型,包括文献[3]提出的基于包长统计信息检测视频流量中的隐蔽隧道、文献[12]提出的对移动APP流量类型进行分类的方法。
综上,在恶意加密流量检测的场景下,目前的方法中只有基于流量行为模式进行识别的方法依然可以全面地检测加密后的恶意通信流量。但是这一方法依赖人工特征提取,在攻击者更新代码后需要重新选择分类器的模型,否则检测的准确率会快速下降[5]。同时人工方式提取的特征并不能包含原始序列的所有信息,会丢失一些重要的信息,而且一些复杂的隐含特征可能和最终的结果具有很强的相关性很难通过特征工程提取。
深度学习除了在语音识别、计算机视觉领域应用成功外,在信息安全中也有成功的案例。文献[6]提出使用神经网络来发现系统事务日志中的安全问题,文献[2]提出使用循环神经网络来识别TOR的流量访问的具体的服务端网站指纹。
本文使用加密会话中的包长传输模式与包传输时间序列进行训练,不依赖人工提取传输特征,利用时间序列预测的LSTM模型自动进行特征提取,对恶意加密流量和正常流量进行分类,避免人工提取的特征不包含原始序列中一些重要信息。
循环神经网络(RNN)是基于时间序列的模型,与传统的前馈神经网络不同,它能够建立先前信息与当前环境的时间相关性,是一个对序列化数据进行特征提取和分类的有效方法。原始的RNN方法存在梯度爆炸和梯度弥散问题:随着网络层数的增加,后面节点对于前面节点的感知能力变弱,直到忘记前面的有效信息。
为了提高神经网络的长期记忆能力,Hochreiter等[1]在1997年提出了长短时记忆(LSTM)神经网络。LSTM是RNN的一个变种,主要应用在数据分类问题中,包括自然语言翻译、智能语音和文本分类等多个方面,由于可以完美模拟多个输入变量的问题,故还可以用于时间序列检测。
LSTM添加了记忆单元专门用于保存历史信息,记忆单元的结构如图1所示。每一个记忆单元含有三个输入:来自原始输入序列中当前时刻t传入模型的所有有用数据xt,到t-1时刻模型记录的历史状态Ct-1和所有有用信息的隐藏向量ht-1。每一个记忆单元的输出包括当前时刻记录的所有有用信息ht和当前状态ct。
图1 LSTM单元标准结构
为了历史信息中的有效内容,输入数据要通过三个门:遗忘门(f)、输入门(i)、输出门(o)。输入门负责判断是否丢弃历史信息,它的输入是历史隐藏信息ht-1以及当前序列节点信息xt-1,使用sigmoid函数输出一个0~1之间的值,表示是否遗忘历史流量传输模式的信息,1表示保留历史信息,0表示遗忘历史信息,遗忘门的计算公式如下:
ft=σ(Wfx·xt+Wfh·ht-1+bf)
(1)
式中:W表示神经单元中的权重矩阵,其第一下标表示运算门,第二下标表示运算参数,比如Wfx表示遗忘门对序列输入x的权重矩阵。b是对应的权重偏置,下标表示对应的门,比如bi表示对输入门的权重偏执。
同理,输入门和输出门对应的计算公式如下:
it=σ(Wix·xt+Wih·ht-1+bi)
(2)
ot=σ(Wox·xt+Woh·ht-1+bo)
(3)
最后,候选状态gt和当前状态st决定在传输包中可以保留哪些新的信息到下一个神经元。
gt=σ(Wox·xt+Woh·ht-1+bo)
(4)
st=gt·it+st-1·ft
(5)
最终根据传输包的状态确定输出值,以tanh函数处理当前单元状态,并与输出门相乘得到当前单元的隐藏向量ht,再传递给下一个单元。
ht=tanh(st)·ot
(6)
通过这样的方式将流量传输序列的前后信息进行学习,得到连接中的前后包之间的关联信息,实现流传输特征信息的提取。
本文针对网络流量进行检测,对于数据的处理如图2中的数据处理模块所示,流量通过流量探针转化成网络日志,再经过数据预处理与测试集合划分后输入到神经网络分类器中。
图2 数据探针和神经网络分类器的框架
探针系统负责采集出每一个加密流的传输日志,其日志信息包括:客户端IP、服务端IP、客户端端口、服务端端口、传输包到达时间、传输包大小,以及从TLS密钥协商过程中解析出的客户端密钥套件、服务端证书信息。
每一个加密连接序列由不同流量包的日志信息组成,在探针中使用了五元组(客户端IP、服务端IP、客户端端口、服务端端口、协议)与TCP层的ACK字段对包序列进行排序,从而避免由于网络环境不稳定造成包序列的混乱。序列中每一个传输包都保留了传输时间间隔、传输包大小、传输方向。传输时间间隔是当前包与上一个包到达时间之间的差值,统计单位是毫秒。由于网络环境的原因,可能出现先发包后到,因此时间间隔包括负值。传输包大小的统计单位是字节,传输方向用发送和接收两个变量表示,比如客户端发送表示为(0,1),服务端发送表示为(1,0)。
由于不同连接持续的时间不一致,外加探针缓存流量在性能上的限制,对于每一个加密流量只能存储有限长度的包序列。通过实验比较,最终选择保留连接中前50个包。对于长度不满的序列进行了填充,填充的内容是传输包中不会出现的异常值(比如0x0fffffff),最后在训练算法模型时过滤掉这些异常值。
一部分恶意流量在连接控制服务器时进行了大量的重复尝试,产生了大量重复流量,需要对这部分流量进行去重,避免训练数据不平衡造成训练过拟合;另一方面,在真实网络环境下,恶意流量相对正常流量占有的比例不高,通过沙箱采集的流量数量也远远少于现实环境采集到的白流量数量。为了在实验中验证模型的有效性,对恶意流量进行了样本过采样,使用8倍数量的原始数据加入到训练集合。
构建的神经网络分类器的整体框架如图2所示。数据处理输出的加密流序列将由LSTM网络中自动选取有效的特征。基于LSTM的预测模型由输入层、隐藏层、输出层组成,如图2所示。其核心设计是中间的隐藏层,通过实验比较,选择保留了20个神经元。训练过程中,通过向前操作,将LSTM上一时刻的信息以记忆流的形态不断向后传递,影响每个新输入数据的处理和每个阶段的输出。输入层的输入数据包含每一个流量包的大小、到达时间与上一个到达包的时间间隔绝对值以及传输方向。
LSTM提取完隐藏特征后发送到Softmax神经网络分类器。Softmax本质上是一种神经元输出的概率分布形式,最后一个输出层的节点个数与分类任务的目标数相等。对于每一条加密连接的行为特征,神经网络生成一个二维的数组作为输出结果,分别表示属于黑流量和白流量的概率。
实验基于CentOS7的操作系统,Python 3.6的环境,利用Pandas进行数据预处理,采用Keras和Tensorflow的深度学习框架构建恶意流量检测模型。作为对比的特征提取与监督学习方法使用Sklearn机器学习框架搭建。
在恶意流量分类领域公开的训练数据集很少,本文通过某个大型校园网络进行正常流量的数据采集,使用沙箱对恶意流量进行数据采集。本实验使用23 145个恶意程序在沙箱中收集了120万条恶意TLS流量;在清华的校园网边界收集了来自3 132个客户端设备的1 000万条正常TLS流量。为了保障白样本的可靠性,我们使用白名单证书与安全客户端列表对边界网络进行了过滤。为了保障黑样本的丰富性,我们收集了来自276个恶意家族的24 786个有效二进制样本。
为了保证验证算法的有效性,数据集使用随机划分法分为训练样本集和测试样本集,为了充分利用数据,采用十折交叉验证的方式来进行训练和验证。
实验以黑流量为正样本,正常流量为负样本。分类混淆矩阵如表1所示,评价指标包括准确率(AC)、召回率(Recall)、误报率(FA),其计算方法如下:
(7)
(8)
(9)
图3反映了训练过程中检测的准确率与训练迭代次数的关系。由实验结果可以看出,模型在迭代到10次以后基本收敛,训练集准确率最终达到了99.93%,验证集准确率达到了99.76%,说明模型能成功的从流量序列中提取行为特征区分恶意流量。
图3 准确率和迭代次数的关系曲线
为了比较LSTM的检测效果与人工提取特征的分类器的检测效果,本文根据文献[3]中提出的22个TCP层流量统计特征以及常见的机器学习构造了多个分类器用于对比。
由表2可以看出,本文提出的基于LSTM的恶意流量检测算法表现优于传统的决策树(DT)、支持向量机(SVM)和随机森林(RF)算法。尽管从准确率数值上看提升不多,但是LSTM的误报率只比传统的检测模型低了0.01左右。由于现实网络中流量数量非常庞大,这一点提升可以减少大量的误报。以清华的边界流量为例,每天三千万条加密流量在误报率降低0.01的情况下每天会减少30万条错误的报警。
表2 恶意流量检测结果 %
在图4中,不同检测模型的ROC曲线下方的面积(Area Under Curve,AUC)越大,模型的检测效果越好,可以看到LSTM具有最大的AUC值,检测效果最好。
图4 LSTM模型对恶意流量的检测效果
由于现实中网络流量很多的原因,对于恶意流量的检测通常会限制误报率,当所有模型的误报率都限制在1%以下时,从图4中可以看到,LSTM的检测准确率高出其他模型很多。
本文提出了一种基于LSTM的在加密环境下检测恶意网络流量方法。该方法首先利用网络探针从原始网络流量数据中提取流量日志,并通过TCP发送顺序还原了包序列。接着以日志中的包长、方向和传输时间间隔作为输入,使用LSTM分析流量传输模式的长距离依赖关系,在恶意加密流量检测中取得了比较好的效果。该算法以沙箱采集的恶意程序流量和现实网络中的正常Web流量作为研究对象,验证了LSTM方法对网络流量数据的非线性表示和分类能力。
在加密技术广泛应用的互联网环境下,如何有效地检测出失陷主机是对网管人员的一大挑战。本文提出的检测方法具有较低的误报率和自动提取特征的优势,可以更好地应用于现实网络环境。