本发明涉及网络安全领域,具体涉及一种基于smote和bi-lstm的恶意域名检测方法。。
背景技术:
dga(域名生成算法)是一种利用随机字符来生成c&c域名以逃避域名黑名单检测的技术手段。为了阻止产生dga的c2(command&control)流量,安全组织必须首先通过逆向工程来发现dga算法,然后生成给定种子的域列表,才能对恶意域名进行及时处置。dga这项技术会大大增加打击和关闭中心结构僵尸网络(如conficker-a/b/c僵尸、krabenbotnet等)的难度:僵尸网络为了躲避域名黑名单,通过使用该项技术动态生产域名。面对这种情况,检测人员需要检测识别出僵尸网络的dga家族并掌握对应的域名生成算法和输入,以便对生成的域名及时进行处置;除此之外,在互联网上潜伏着许多恶意软件,一旦计算机受攻击遭到感染,恶意软件通常与命令和控制中心(command&control,c2)之间建立通信连接,从而使控制者通过c2服务器远程控制目标主机;然后,攻击者可以通过c2服务器联系受害者计算机上安装的恶意软件程序,通过dga算法自动生成海量域名,然后从中选择一个或多个有效域名解析出ip地址,实现与c2服务器的通信,并接收恶意软件要执行的更新、操作和长传收集到的情报,或追踪其他的恶意行为。恶意行为者只需要注册少量的这些域就可以获得成功,防御者需要抢先在攻击者之前对这些域进行消除,注册或者列入黑名单。传统恶意软件分析师必须对用于生成域名的算法进行反向工程,这需要很大的人力和物力,以防止恶意软件与c&c服务器进一步通信。
在恶意域名检测的工作中,为了提升检测效率和检测准确率,已经出现了很多方法。从最初的黑名单过滤、dns请求分析到传统机器学习以及神经网络构造分类器检测,基本上根据检测过程可以分为回归性检测和实时检测。
在全球网络信息化程度高速发展的大背景下,现有方法在面对数量巨大、来源多样的dga域名下大多存在效率低下,检测准确率不理想和被动防御等问题。同时面对每天生成和联系的方式,这些域名的检测难度很大。
技术实现要素:
有鉴于此,本发明的目的在于提供一种基于smote和bi-lstm的恶意域名检测方法,提升恶意域名检测的检测效率和检测准确率。
为实现上述目的,本发明采用如下技术方案:
一种基于smote和bi-lstm的恶意域名检测方法,包括以下步骤:
步骤a:采集若干正常域名和恶意域名,组成训练集;
步骤b:对训练集中的域名进行数据预处理,得到域名字符序列训练集d;
步骤c:利用改进的smote算法,对域名字符序列训练集d进行均衡化数据合成,得到增强均衡化的训练集d’;
步骤d:构造并初始化包含bi-lstm层和全连接层的神经网络模型;
步骤e:将训练集d’中的域名转换为固定长度的表征向量;
步骤f:将得到的域名的表征向量输入到神经网络模型的bi-lstm层,得到域名的上下文向量;
步骤g:将域名的上下文向量输入到神经网络模型的全连接层,使用分类器计算每个域名属于标注的各类别的概率来训练模型参数,当神经网络模型产生的损失值迭代变化小于设定阈值不再降低或者达到最大迭代次数,则终止神经网络模型的训练,得到训练好的神经网络模型;
步骤h:将待判定的域名转换为字符序列,输入训练好的神经网络模型,输出判定结果。
进一步的,所述步骤b具体为:
步骤b1:创建一个label数组用于存放域名的属性,并对训练集进行标注;
步骤b2:创建域名字符字典,将训练集中的域名转换为字符向量,得到域名字符序列训练集d。
进一步的,所述步骤b2具体为:
步骤b21:创建域名字符字典,并初始化为空,字典中每个元素为<c,f>形式,其中c为字符,f为字符的出现频次;
步骤b22:遍历训练集中的所有域名,对域名所包含的每个字符c,若字典中存在字符c,则更新域名字符字典中字符c的频次;若不存在,则添加<c,1>到域名字符字典中;
步骤b23:遍历域名字符字典,首先根据字符出现频次给每个不同的字符一个唯一的编号;若出现频次相同,则根据遍历到的顺序赋予不同的编号;遍历域名字符字典,将字符按照频次进行顺序排序,并根据其顺序分配编号,得到域名字符序列训练集d;
其中,字典包含占位字符’none’,用来将位置字符统一映射为占位字符,编号为0。
进一步的,所述步骤c具体为:
步骤c1:遍历域名字符序列训练集d,统计每个恶意域名生成算法dgaj的训练样本集pj;
其中
步骤c2:若恶意域名生成算法dgaj的训练样本集pj的样本数nj小于指定阈值,则对pj进行数据均衡化处理,将合成的数据添加到dga域名字符序列训练集,得到增强均衡化的训练集d’。
进一步的,所述步骤c2具体为:
步骤c21:遍历恶意域名生成算法dgaj的训练样本集pj,对训练样本集pj中的每个域名样本pj(i),i=1,2,...,nj,通过knn算法得到pj(i)的k个最近邻域名样本;k个最近邻样本中的多数类的数量由k'表示,其中这里的多数类是指正常域名;
步骤c22:若k=k',即pj(i)的所有k个最近邻居都是多数类,则认为pj(i)是噪声并跳过;若0≤k'<k/2,则认为pj(i)远离样本分布的边界并跳过该样本;若k/2≤k'<k,即pj(i)的多数类邻居的数量大于其少数类邻居的数量,则认为pj(i)容易被错误分类,并对pj(i)执行步骤c23;
步骤c23:通过pj(i)和pj(i)的k个最近邻域名样本选择s个最近的邻居,合成s个样本,并将第j个合成样本的标签标记为dgaj;具体公式如下:
syntheticj=pi+rj*diffj(j=1,2,…,s)
其中,syntheticj是对于pi合成的第j个域名样本;diffj是pi和其第j个邻居的差值,即diff=||pi-pj||;rj是一个在0和1之间的随机数,是一个差值对合成样本的影响程度的参数;s是1到k之间的随机整数,表示由pi合成的样本个数;
步骤c24:将合成的数据添加到dga域名字符序列训练集,得到增强均衡化的训练集d’。
进一步的,所述步骤e具体为:
对训练集d’中的域名m,使用字符嵌入工具将域名中的字符转化为序列向量形式,计算公式如下:
v=w*v'
其中,域名中每个字符根据步骤a3中创建的字符字典初始化为一个d’维的实数,v'是每个域名根据字符字典获得的实数向量;w为随机初始化的字符嵌入矩阵,w∈rd*d’,用于将d’维实数向量映射为d维序列向量;v∈rd,表示映射后的序列向量,d为字符序列的固定长度,该维度等于网络中lstm层的lstm单元个数。
进一步的,所述步骤f具体为:
将域名m看做字符序列,将序列向量按照字符次序依次输入到一个双向的长短期记忆网络中,对于长短期记忆网络的正向,依次输入x1,x2...,xl,对于长短期记忆网络的反向,则依次输入xl,xl-1,...,x1,其中,x={x1,x2...,xl},x表示域名,l为域名m中字符个数;计算每个字符在正向和反向的隐层状态值,将这些隐层状态值求平均,乘以权重矩阵,最后使用激活函数得到域名m的上下文向量,计算公式如下:
c=sigmoid(oiwc)
其中,xi为域名m中第i个字符的向量值,
进一步的,所述步骤g具体为:
步骤g1:将得到的域名的上下文向量输入到dropout层,并将dropout层的输出输入到全连接层,使用softmax归一化,计算域名序列所属类别的概率。
计算公式如下:
y=fdense(wdense*p+bdense)
其中,wdense为全连接层权重矩阵,bdense为偏置项,fdense为激活函数,本专利中使用sigmod函数,y为域名序列向量p经过全连接层非线性转换的特征向量,向量维度为l,yi为y的第i维,p(yi)为预测为类别i的概率,0<p(yi)<1,l为类别的总数;
步骤g2:用交叉熵作为损失函数计算损失值,通过均方根随机梯度下降优化方法rmsprop计算所有的梯度的平方的平均值,利用反向传播迭代更新模型参数,以最小化损失函数来训练模型。
进一步的,所述最小化损失函数计算公式如下:
其中,loss是损失函数值,p(yi)为域名序列xi通过深度学习模型lstm的输出结果的概率,
本发明与现有技术相比具有以下有益效果:
本发明基于smote和bi-lstm的恶意域名检测方法通过利用bi-lstm网络进行隐式提取特征,再利用逻辑回归分类器过滤出恶意域名,不仅解决了传统检测方法耗时长,开销大的弊端;同时避免了手工提取特征容易被规避的不足。同时,针对lstm在面对海量非平衡数据集中少数恶意域名检测率低的问题,利用改进的少数类过采样技术(smote)增加少数类恶意域名的样本数,从而产生均衡化数据。
附图说明
图1为本发明实施例的方法流程图。
图2是本发明实施例的步骤b的实现流程图。
图3是本发明实施例的步骤b2的实现流程图。
图4是本发明实施例的步骤c的实现流程图。
图5是本发明实施例的步骤g的实现流程图。
具体实施方式
下面结合附图及实施例对本发明做进一步说明。
本发明提供一种基于smote和bi-lstm的恶意域名检测方法,包括以下步骤:
步骤a:采集若干正常域名和恶意域名,组成训练集;
步骤b:对训练集中的域名进行数据预处理,得到域名字符序列训练集d;
步骤b1:创建一个label数组用于存放域名的属性,并对训练集进行标注;
步骤b2:创建域名字符字典,将训练集中的域名转换为字符向量,得到域名字符序列训练集d。
步骤b21:创建域名字符字典,并初始化为空,字典中每个元素为<c,f>形式,其中c为字符,f为字符的出现频次;
步骤b22:遍历训练集中的所有域名,对域名所包含的每个字符c,若字典中存在字符c,则更新域名字符字典中字符c的频次;若不存在,则添加<c,1>到域名字符字典中;
步骤b23:遍历域名字符字典,首先根据字符出现频次给每个不同的字符一个唯一的编号;若出现频次相同,则根据遍历到的顺序赋予不同的编号;遍历域名字符字典,将字符按照频次进行顺序排序,并根据其顺序分配编号,得到域名字符序列训练集d;
其中,字典包含占位字符’none’,用来将位置字符统一映射为占位字符,编号为0。
步骤c:利用改进的smote算法,对域名字符序列训练集d进行均衡化数据合成,得到增强均衡化的训练集d’;
步骤c1:遍历域名字符序列训练集d,统计每个恶意域名生成算法dgaj的训练样本集pj;
其中
步骤c2:若恶意域名生成算法dgaj的训练样本集pj的样本数nj小于指定阈值,则对pj进行数据均衡化处理,将合成的数据添加到dga域名字符序列训练集,得到增强均衡化的训练集d’。
步骤c21:遍历恶意域名生成算法dgaj的训练样本集pj,对训练样本集pj中的每个域名样本pj(i),i=1,2,...,nj,通过knn算法得到pj(i)的k个最近邻域名样本;k个最近邻样本中的多数类的数量由k'表示,其中这里的多数类是指正常域名;
步骤c22:若k=k',即pj(i)的所有k个最近邻居都是多数类,则认为pj(i)是噪声并跳过;若0≤k'<k/2,则认为pj(i)远离样本分布的边界并跳过该样本;若k/2≤k'<k,即pj(i)的多数类邻居的数量大于其少数类邻居的数量,则认为pj(i)容易被错误分类,并对pj(i)执行步骤c23;
步骤c23:通过pj(i)和pj(i)的k个最近邻域名样本选择s个最近的邻居,合成s个样本,并将第j个合成样本的标签标记为dgaj;具体公式如下:
syntheticj=pi+rj*diffj(j=1,2,…,s)
其中,syntheticj是对于pi合成的第j个域名样本;diffj是pi和其第j个邻居的差值,即diff=||pi-pj||;rj是一个在0和1之间的随机数,是一个差值对合成样本的影响程度的参数;s是1到k之间的随机整数,表示由pi合成的样本个数;
步骤c24:将合成的数据添加到dga域名字符序列训练集,得到增强均衡化的训练集d’。
步骤d:构造并初始化包含bi-lstm层和全连接层的神经网络模型;
步骤e:将训练集d’中的域名转换为固定长度的表征向量;
对训练集d’中的域名m,使用字符嵌入工具将域名中的字符转化为序列向量形式,计算公式如下:
v=w*v'
其中,域名中每个字符根据步骤a3中创建的字符字典初始化为一个d’维的实数,v'是每个域名根据字符字典获得的实数向量;w为随机初始化的字符嵌入矩阵,w∈rd*d’,用于将d’维实数向量映射为d维序列向量;v∈rd,表示映射后的序列向量,d为字符序列的固定长度,该维度等于网络中lstm层的lstm单元个数
步骤f:将得到的域名的表征向量输入到神经网络模型的bi-lstm层,得到域名的上下文向量;
将域名m看做字符序列,将序列向量按照字符次序依次输入到一个双向的长短期记忆网络中,对于长短期记忆网络的正向,依次输入x1,x2...,xl,对于长短期记忆网络的反向,则依次输入xl,xl-1,…,x1,其中,x={x1,x2...,xl},x表示域名,l为域名m中字符个数;计算每个字符在正向和反向的隐层状态值,将这些隐层状态值求平均,乘以权重矩阵,最后使用激活函数得到域名m的上下文向量,计算公式如下:
c=sigmoid(oiwc)
其中,xi为域名m中第i个字符的向量值,
步骤g:将域名的上下文向量输入到神经网络模型的全连接层,使用分类器计算每个域名属于标注的各类别的概率来训练模型参数,当神经网络模型产生的损失值迭代变化小于设定阈值不再降低或者达到最大迭代次数,则终止神经网络模型的训练,得到训练好的神经网络模型;
步骤g1:将得到的域名的上下文向量输入到dropout层,并将dropout层的输出输入到全连接层,使用softmax归一化,计算域名序列所属类别的概率。
计算公式如下:
y=fdense(wdense*p+bdense)
其中,wdense为全连接层权重矩阵,bdense为偏置项,fdense为激活函数,本专利中使用sigmod函数,y为域名序列向量p经过全连接层非线性转换的特征向量,向量维度为l,yi为y的第i维,p(yi)为预测为类别i的概率,0<p(yi)<1,l为类别的总数;
步骤g2:用交叉熵作为损失函数计算损失值,通过均方根随机梯度下降优化方法rmsprop计算所有的梯度的平方的平均值,利用反向传播迭代更新模型参数,以最小化损失函数来训练模型。
所述最小化损失函数计算公式如下:
其中,loss是损失函数值,p(yi)为域名序列xi通过深度学习模型lstm的输出结果的概率,
步骤h:将待判定的域名转换为字符序列,输入训练好的神经网络模型,输出判定结果。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。