陈解元
(国家计算机网络与信息安全管理中心,北京100032)
域名系统(Domain Name System,DNS)是把域名和IP 地址相互映射的一种层次化分布式数据库系统,是互联网上进行域名解析的核心基础设施。 互联网访问不可避免地需要进行域名解析服务,正由于DNS 协议的必要性,大部分网络中的防火墙不会拦截 53 端口上的数据包[1]。 随着 DNSCat2、Iodine 等工具的开源,越来越多的黑客开始利用DNS 协议创建隐蔽信道[2],实现木马控制、数据窃取、高级可持续 威 胁 攻 击(Advanced Persistent Threat,APT)等 , 严重危害信息系统运营者权益和用户个人隐私。
DNS 隐蔽信道[3]是指将其他协议的内容封装在DNS 数据包的可定义字段中,然后以DNS 请求和响应包完成数据传输的通道。 常见的可利用字段有QNAME 字 段 、RDATA 字 段 等[4]。
近年来,针对DNS 隐蔽信道的检测方法不断被提出,按照分析对象可以分为两类:基于域名字符串的检测方法和基于通信特征的检测方法[5]。 在基于域名字符串分析方面,Born 等[6]通过分析 DNS 查询和响应中域的一字图、二字图和三字图的字符频率,提出遵循齐普夫定律的模式与自然语言相似,而隧道通信的字符频率分布更均匀,并以此识别异常流量。Bilge 等[7]通过计算请求域名中最长有意义的字符串所占比例,分段统计字符分布,发现用于隐蔽通信的域名。Qi 等[8]提出一种基于二元词频统计特征的隐蔽通道检测算法。 Farnham 等[9]利用正则表达式提取特征字段,通过阈值对比发现隐蔽通信行为。 随着机器学习技术的发展,类文本数据特征挖掘逐渐应用于DNS 隐蔽信道研究。 章思宇等[10]使用朴素贝叶斯、逻辑回归、决策树等分类器对提取的 12 维数据进行分类。 Buczak 等[11]使用随机森林算法,训练了16 维数据特征模型用于隐蔽信道检测。 Nadler 等[12]使用熵、请求类型、子域长度、请求长度等作为模型输入特征,并使用主成分分析算法对特征进行降维,使用合法DNS 数据进行训练,将超出正常行为的请求归类为可疑隧道。 Sheridan 等[13]收集了常见DNS 隐蔽信道通信流量,提取指纹特征,并搭建隐蔽信道实验环境进行匹配计算。 上述方法多以DNS 请求流量为研究对象, 忽略了响应流量中时间戳、生存时间值(Time to Live,TTL)等重要的隐蔽信道特征, 在误报率方面仍有提升空间。其次,卷积神经网络较传统机器学习算法,能够更全面地感知隐蔽信道行为模式, 提升多类型DNS隐蔽信道检测识别率。
基于以上分析,本文提出一种基于LSTM 的DNS隐蔽信道检测方法,加入时间戳、TTL 等作为表征DNS 隐蔽信道的关键因素,最终提取 13 维特征,利用LSTM 算法分别学习正常流量、隐蔽信道流量特征,并在真实流量环境中开展对比实验,实验结果表明,本文提出的特征元素能够很好地表征异常流量,模型可识别多种类型DNS 隐蔽信道流量,并且在准确率、精确率等机器学习指标中均表现最好。
DNS 隐蔽信道依靠递归查询过程中的数据转发,将数据嵌入DNS 数据包,建立受控设备与攻击者间隐蔽的通信桥梁。 DNS 协议定义了两种报文,一种是由客户端发起的查询报文,另一种是服务器端对查询报文的响应,称为响应报文。 DNS 协议的特性决定了在查询报文中,一般以QNAME 字段为最佳数据载体字段,在响应报文中,RDATA 为最佳数据载体字段。 根据 DNS 隐蔽信道原理,其数据报文特征与正常数据包有所差别。 例如,QNAME 字段最大长度为253 字符,承载数据量较小,通过该字段传输隐蔽信道数据,势必造成QNAME 子域名存储的数据量较正常报文更大。 因此,分析提取异常点可以有效表征DNS 隐蔽信道。
为了收集和构建包含黑白样本的高质量数据集,正常 DNS 流量样本采集自某数据出口,提取 10天时间内全域名请求和应答数据,请求域名去重后,以人工确认与威胁情报API 查询相结合的方式筛选出 10 万行作为白样本。 DNS 隐蔽信道流量样本采用5 种流行的隐蔽信道工具模拟生成,分别为Iodine、DNS2TCP、DNSCat2、DNSteal、TCP -over -DNS,通过 wireshark 工具捕获。 在模拟网络环境中,使用5 台客户端同步运行5 种隐蔽信道工具。
对 CNCERT/CC 抽样监测的远控木马、APT 攻击行为进行统计分析显示,C&C 通信因其具有一对多的主控特征,具有较明显的时间聚集特性,如图1所示。因此,在隐蔽信道模拟流量产生时,对应白样本相同的时间段内,人工选择10 个小时段,产生较为密集的数据传输状态DNS 隐蔽信道流量样本,其他时间段随机产生数据传输和空闲状态混合的DNS 隐蔽信道流量样本。 由正常 DNS 流量样本和DNS 隐蔽信道流量样本组成的数据集分布如表1所示。
图1 恶意木马C&C 通信时间分布
表1 实验数据集分布
对于 DNS 查询报文,由于 DNS 隐蔽信道需承载额外数据,最明显的特征是请求报文负载长度、请求域名长度、QNAME 二级域名部分的字符串长度等明显大于正常 DNS 数据。 而承载数据越多,在域名长度有限制的情况下,想要提升传输效率,子域名的级数也会随之增多。 此外,经过编码的数据字符混乱,熵值较高。
对大量DNS 查询报文统计特征来说,单一源IP每天DNS 请求的数量能够反映受感染的僵尸主机请求数量往往高于正常主机特征。 单一源IP 每小时最多请求数能够反映是否存在使用短暂的DNS请求与多个URL 与 C&C 服务器进行通信。
对于DNS 响应报文,正常流量承载的数据为IP地址,最大长度为固定值,由于控制端需向受控端发送指令,导致DNS 隐蔽信道响应报文负载的长度超过正常响应报文。
DNS TTL 表示 DNS 记录在 DNS 服务器上缓存时间,越长的TTL 可以缓存更长的时间,提高缓存命中的速度,减少收到的查询数量,从而使到达C&C服务器的DNS 流量降低。 相反的,DNS 隐蔽信道为提升数据传输效率,TTL 值一般只有几分钟,与正常TTL 一小时以上的数值存在较大差距。
此外,检测DNS 隐蔽信道的重要特征还包括上文提到的时间戳。 通过对比分析,本文采用 13 维特征描述DNS 隐蔽信道流量与正常流量的区别,具体表征元素如表2 所示。
表2 DNS 报文特征
本文构建的DNS 隐蔽信道检测算法,提取计算每条通信流量的表征元素,通过数据清洗,将数据转化为二维矩阵。 使用LSTM 算法对输入矩阵进行训练获得分类器模型,最终输出测试集预测结果。 算法流程如图2 所示。
图2 总体算法流程
数据预处理阶段的目标是将pcap 格式的网络流量数据,生成带有标记数据的输出csv 文件,转化为卷积神经网络可运算的二维灰度图像,过程主要包括数据清洗、符号数据转换两个步骤。
数据清洗过程包含大小写字符统一、无效字符替换、缺失数据填充。 DNS 协议规定每一个域名都是 一 个 标 号 序 列 labels, 用 字 母(A ~Z,a ~z,大 小 写等价)、数字(0~9)和连接符(-)组成,标号序列总长度不能超过255 个字符,由点号分割成一个层次的域名,单层域名长度应该在 63 个字符之内。 由于大小写字符等价,而计算熵值时会判定为不同的字符,需要将请求域转化为小写字母集。 其他不合规字符(如!?& 等)可视为干扰项,使用统一标记替换。空值或缺失值可以用其他对应值的中值或零来代替,为了减少计算开销和训练时间,本文采用补零方式处理。
符号数据转换阶段,计算每条DNS 流量的13个表征元素值转化为图像灰度值,作为x 维向量,将每一组特征取值表示为y 维向量,转化为q 个x×y大小的二维灰度图像,作为算法输入数据进行学习,训练 LSTM 分类器。 公式表示为:
其中,T 为一组流量特征矩阵,Bi为表征元素列向量为向下取整的图像灰度值为输入矩阵。
LSTM 是一种时间循环神经网络,属于深度学习的代表性算法之一,其基本思路是通过提取图像中相邻像素之间相似的表达和特征,对输入向量进行卷积操作,以提取局部特征作为下一层的输入,通过逐层提取与组合,转化为抽象且全面的信息。 并且由1.2 节分析,选取的表征元素之间存在一定的强关联,如响应报文负载长度较长时,响应报文平均记录长度、UDP 载荷长度一般也较长,选择 LSTM可以通过Sigmoid 保留更多的局部特征。
LSTM 和传统的循环神经网络一样,模型结构分为三层,分别为输入层、输出层和隐藏层,不同的是LSTM 有 2 个 传 输 状 态 Ct(cell state)和 ht(hidden state),每个门控单元包含一个Sigmoid 激活函数。
遗忘门控制模型将从一组单元中丢弃哪些信息,公式表示为:
其中,xt和 ht分别表示输入和输出,遗忘门读取 ht-1和 xt,向 Ct-1输出 0 到 1 之间的状态值,其中 0 表示完全丢弃,1 表示完全保留。 W 和 b 分别为权值和偏置量。
输入门 it计算哪些信息需要更新,由式(6)中tanh层生成一个向量作为更新的替代项,将这两部分组合起来,通过式(7)对Ct的状态值进行刷新。
式(8)中输出门决定单元格状态 Ct的哪些部分被导出,通过式(9)中tanh 函数获得对应值,输出最终结果。
如图 3 所示,本文 LSTM 模型嵌入层的输出尺寸为 16,由嵌入层提供 64 个单元组成 LSTM 层的输入,这一层的激活函数为tanh。 以下的全连接层由64 层组成,具有 ReLU 激活函数。 下一层同样是全连接层,具有激活函数 ReLU 和 6 个单位。 最后一层是一个全连接层,有 1 个单位和 1 层激活函数。
图3 本文 LSTM 模型
为训练测试模型,本文搭建的软硬件环境为:Ubuntu64 位操作 系 统,基 于 Python 的 TensorFlow 和PyTorch 软件框架;Xeon Siliver 4210 CPU,主频 2.0 GHz,128 GB 内存,NVIDIA Tesla P100 GPU。
为准确评估模型对DNS 隐蔽信道识别有效性,选择 4 个评价参数,分别为准确率(Accuracy)、精确率(Precision)、召回率(Recall)和分类器精度得分(F1-score),并与 CNN、RNN、GRU 算法进行了对比。 指标公式为:
其中,TP 表示归类正确的目标样本数量,即 DNS 隐蔽信道流量被识别为异常流量;TN 为归类正确的其他样本数量,即良性流量被识别为正常流量;FP为识别错误的目标样本数量,即良性流量被识别为异常流量;FN 为被遗漏识别的目标样本数量,即DNS 隐蔽信道流量被识别为正常流量。
对本文算法与选取的3 种对比算法在相同训练数据集上进行10 轮训练,准确率曲线如图4 所示。
图4 本文算法与其他算法训练过程对比
可以看出,训练准确率随着完整训练次数的增加而不断增加,LSTM 算法较对比算法有较高的稳定性,随周期增加的波动几乎可以忽略,最终的准确率达到99.8%。
在评价指标方面,表 3 列出了LSTM 算法与同类神经网络模型对比。 CNN、RNN、GRU 模型均采用与本文 LSTM 算法相同的 3 个全连接层结构,结果表明在混合了真实DNS 流量和仿真DNS 隐蔽信道流量的数据集上,LSTM 算法的4 项指标均表现最好,其次为 GRU 模型。
表3 神经网络算法对比
针对不同类型的DNS 隐蔽信道识别准确率如表4 所示,可以看出,本文选取的特征元素能够很好地表征异常流量,各类型DNS 隐蔽信道流量均可被识别检测。 且 LSTM 算法对各类 DNS 隐蔽信道流量识别的准确率均高于99.7%,有较高的识别准确率和广泛的适用范围。
表4 各类DNS 隐蔽信道识别准确率对比
本文采用长短期记忆人工神经网络模型,提出了一种基于DNS 流量分析检测隐蔽信道的算法。与以往的研究相比,本文提出的算法通过分析请求流量和响应流量的特征,将时间戳、TTL、响应报文负载长度等因素提取为DNS 隐蔽信道特征,在仿真流量环境中开展实验,取得了良好的效果。 实验结果表明,本文算法总体准确率达到99.8%,对各类DNS 隐蔽信道流量识别的准确率均高于99.7%,在准确率、精确率等机器学习指标中均表现最好,有效提高了基于流量的DNS 隐蔽信道检测算法准确度。