基于PU-Learning的恶意URL检测——半监督学习的思路来进行正例和无标记样本学习
基于PU-Learning的恶意URL检测
Ya-Lin Zhang, Longfei Li, Jun Zhou, Xiaolong Li, Yujiang Liu, Yuanchao Zhang, Zhi-Hua Zhou
National Key Lab for Novel Software Technology, Nanjing University, China
Ant Financial Services Group, China
来源: CCS’17 https://dl.acm.org/citation.cfm?id=3138825
摘要
本文描述了一种基于PU-Learning(正例和无biao'zhu学习)的潜在恶意URL检测系统。以往的基于机器学习的解决方案是将它定义为有监督学习问题。然而在很多时候,我们所获得的数据总是包含少量已知的攻击URL以及大量的未标记样本,这使得有监督学习不可行。在这项工作中,我们将其定义为PU-Learning问题,并结合两种不同的策略(two-stage strategy and cost-sensitive strategy)。实验结果表明,我们所开发的系统能够有效地发现潜在的恶意URL攻击。该系统既可以作为现有系统的辅助部署,也可以用来帮助网络安全工程师有效地发现潜在的攻击模式,使他们能够快速更新现有的系统。
1 引言
随着互联网的迅速发展,出现了越来越多的恶意URL攻击,严重威胁着网络安全。传统的URL攻击检测系统主要通过使用黑名单或规则列表。而这些名单将变得越来越长,但是以这些方式防范所有的攻击是不现实的。更严重的是,这些方法难以检测潜在的威胁,这使得网络安全工程师很难有效地发现新出现的恶意URL攻击。
为了提高算法的泛化能力,很多研究人员采用基于机器学习的方法来完成这项任务。这些方法主要分为两类:大多数转化为有监督学习问题[6],则需要对数据进行标注,而其他的一些研究人员则试图以无监督的方式解决问题,例如通过异常检测技术[5],就不需要对数据进行标注。当可以得到标注数据时,有监督学习方法通常实现更强的泛化能力。然而在很多时候,我们很难获得精准的标注数据。在更多时候,我们可能只得到一小部分恶意URL和大量未标记的URL样本,缺乏足够可靠的负例样本,这也就意味着我们并不能直接使用上述的机器学习算法。另一方面,如果我们简单地以无监督的方式解决它,那么已知恶意URL的标注信息就难以充分利用,可能无法达到令人满意的性能。
在本文中,我们将上述问题抽象为PU-Learning(正例和未标记学习)问题[3],它可以更充分地利用所检测到的恶意URL以及未标记的URL,并实现了更强的性能。基于此,我们开发了一个基于PU-Learning的潜在恶意URL攻击检测系统。有许多策略可以用来处理PU学习问题,如two-stage strategy[4]、cost-sensitive strategy[2]等。在这项工作中,我们将two-stage strategy、cost-sensitive strategy结合起来构建我们的系统。最后,我们对所开发的系统进行了验证评估,结果表明该方法能有效地发现潜在的恶意URL攻击,大大降低了网络安全工程师的工作量,使其在实际的URL攻击检测中非常有用。
本文的其余部分组织如下。在第2节中,我们描述了所开发的系统。在第3节,我们基于蚂蚁金服的实际业务场景评估了我们所开发的系统。最后,在第4节中,我们总结了这项工作。
2 系统架构
在这一章中,我们介绍了所开发的系统架构。如图1所示,我们的系统主要包括3个模块:
- (i)特征提取,将原始URL转换成特征向量;
- (ii)模型训练,利用所提取的URL训练集的特征向量训练PU-Learning模型;
- (iii)预测,预测输入的URL以及输出可能的恶意URL集。
2.1 特征提取
首先将原始URL转换为特征向量表示,以便于应用到后续的机器学习算法中。下面,我们将简要地解释我们所开发的系统,并介绍我们在系统中使用的特征提取过程的细节。
一般来说,URL可以分成几个部分,包括协议部分、认证部分、路径部分、query部分和fragment部分,如图2所示。攻击者可能修改任意一个部分以发起攻击。在我们的场景中,由于前几个部分受到限制,攻击主要来自fragment部分,所以我们主要关注的是基于恶意修改fragment部分的攻击的执行情况。具体而言,fragment通常是形如“key1 = value1&…&keyn = valuen”的形式,攻击者可以通过任意修改value部分以发起攻击。因此,我们的系统主要处理这个部分,而特征提取过程直接从fragment的Key-Value对中提取特征。
更具体地说,给定一组URL,我们首先将它们分别划分为上述部分,并从每个URL的fragment中提取Key-Value对。其次,由于我们的目标是发现恶意网址的特质,因此我们过滤了Key-Value对,只保留恶意网址出现的前N个Key,并将剩余的Key-Value对合并为一个Key-Value对,从而每个URL将最多提取(N + 1)个Key-Value对。最后,我们试探性地提取8种不同的统计信息从每个过滤值,包括value中出现所有的字符、字母、数字、标点符号的次数和value中出现的不同的字符、字母、数字、标点符号的数目。因此每个URL将被描述为一个(N + 1)∗8维特征向量。
2.2 模型训练
值得注意的是,传统的有监督学习算法并不能直接应用于我们的场景。在这项工作中,我们将其转化为PU-Learning问题。
PU-Learning[3]是半监督学习的一种特殊情况[1,7],它用于解决只提供正例和未标注样本而不提供负例的问题。研究人员已经提出了许多策略来解决这个问题。为了绕过缺乏负标注的问题,two-stage策略首先试图挖掘出一些可靠的负例,然后将问题转化为一个传统的监督和半监督学习问题。另一方面,用于二分类的cost-sensitive策略由于具有不对称的误分类成本,因此非常适合用于解决PU-Learning问题[2]。在我们开发的系统中,这两种策略都被采用并进一步结合形成最终的预测模型。
two-stage strategy:在第一阶段从未标记实例中选择可靠的负例,算法1显示了相关的细节。在第二阶段,利用正例和第一阶段选择的负例,训练传统的监督模型,并进一步用于预测新样本。
在这项工作中,考虑到效率,我们采用Logistic回归来训练分类模型。
cost-sensitive strategy:我们假设在未标注样本只有少量正例。将所有未标注样本设定为负例,最小化以下目标函数:
其中C+和C-分别是正例和负例误分类的惩罚因子;l(yi,f(xi))表示损失函数,例如log损失函数或hinge损失函数;λ是归一化系数,R(w)是归一化范数,例如L1-范数、L2-范数。本文中,我们将损失函数设置为log损失函数,将L2-范数作为归一化范数。因此具体的函数如下:
其中LL(z)=log(1+exp(-z))就是log损失函数,在实际中,C+和C-是基于验证集选取的,并且C+总是大于C-,这表明正例误分类的惩罚因子要大于负例误分类的惩罚因子。这也就使得模型将更关注于对恶意URL的正确分类。
2.3 预测
在预测阶段,一个新输入的URL首先将在特征提取模块被转换为(n +
1)∗8维特征向量,然后所提取的特征向量将送入一个双策略模型,每个模型都将输出一个分数表示恶意URL的概率。得分越高,这个URL就越有可能是恶意的。我们把两个分数平均作为URL的最终得分,选择具有较高分数的URL构造为候选恶意URL集。
在工程实践中,我们会基于候选恶意URL集过滤K个URL,这些过滤的URL将由网络安全工程师进行人工验证。
3 实验验证
3.1 数据集与准备工作
该数据集来自于发送至蚂蚁金服的URL请求的采样。数据主要分为两部分:一大组未标记的URL和少数已经通过现有的系统标注的恶意网址,并出现了不同的攻击类型,包括XXE、XSS和SQL注入等。我们并没有把这些不同类型的恶意网址进行进一步细分。由于总数据集太大,我们从每天的请求中抽取1亿个URL,其中由现有系统检测到的恶意URL的数量从几万到数十万不等。该模型使用连续7天收集的数据进行训练,并用于预测每天新出现的未标记URL的分数。
当提取Key-Value对时,N被设置为99,因此每个URL将由一个800维的特征向量来描述,使用min-max归一化方法来处理不同量纲下的特征。在模型训练部分,我们采用基于logistic回归的方法来训练PU-Learning模型,C+、C−和λ等参数由验证集进行选取。
3.2 实验结果
由于我们并没有未标注URL的具体情况,我们借助网络安全工程师来帮助检查结果并验证我们系统的有效性。
由于检查结果非常耗时,因此我们将候选恶意URL集的大小K设置为至多150,并由网络安全工程师将手动检查所选URL是否是恶意URL。表1展示了实验结果的细节。从表中可以看出,过滤后的候选集的精度可以达到90%,表明该系统能有效地发现潜在的恶意URL,而现有的系统无法捕获这些恶意URL。应该特别提到的是,我们基于候选恶意URL集发现了新的攻击模式,而蚂蚁金服的网络安全工程师已经通过这个发现改进了现有系统。同时,开发的系统还可以与现有系统协同使用,提高整体的网络安全水平。
4 总结
在这项工作中,我们开发了一个基于PU-Learning的潜在恶意URL检测系统。与基于监督学习的方法相比,我们的方法只需要少量恶意URL以及未标注URL,而这正好适合我们遇到的实际情况。
该系统主要包括三个部分:首先,特征提取将原始URL转化为特征向量;然后,利用two-stage strategy、cost-sensitive strategy来训练分类模型;最后,新输入的URL将被首先转化为特征向量,再进行机器学习,输出的分数表明了该URL为恶意网址的概率。
实证结果表明,我们开发的系统能够有效地发现潜在的恶意URL。该系统既可以作为现有系统的辅助部署,也可以用来帮助网络安全工程师有效地发现潜在的攻击模式。
参考文献
[1] Olivier Chapelle, Bernhard Scholkopf, and Alexander Zien. 2009.
Semi-Supervised Learning. IEEE Transactions on Neural Networks 20, 3
(2009), 542–542.
[2] Marthinus C du Plessis, Gang Niu, and Masashi Sugiyama. 2014.
Analysis of Learning from Positive and Unlabeled Data. In Advances in
Neural Information Processing Systems 27. 703–711.
[3] Charles Elkan and Keith Noto. 2008. Learning Classifiers from Only
Positive and Unlabeled Data. In Proceedings of the 14th ACM SIGKDD
International Conference on Knowledge Discovery and Data Mining.
213–220.
[4] Bing Liu, Yang Dai, Xiaoli Li, Wee Sun Lee, and Philip S Yu. 2003.
Building Text Classifiers Using Positive and Unlabeled Examples. In
Proceeding of the 3rd IEEE International Conference on Data Mining.
179–186.
[5] Fei Tony Liu, Kai Ming Ting, and Zhi-Hua Zhou. 2008. Isolation
Forest. In Proceeding ot the 8th IEEE International Conference on Data
Mining. 413–422.
[6] Justin Ma, Lawrence K Saul, Stefan Savage, and Geoffrey M Voelker.
2009. Beyond Blacklists: Learning to Detect Malicious Web Sites from
Suspicious URLs. In Proceedings of the 15th ACM SIGKDD International
Conference on Knowledge Discovery and Data Mining. 1245–1254.
[7] Zhi-Hua Zhou and Ming Li. 2010. Semi-Supervised Learning by
Disagreement. Knowledge and Information Systems 24, 3 (2010), 415–439.
基于 PU-Learning 的分类方法
简介
正例和无标记样本学习(Learning from Positive and Unlabled Example)简称PU或LPU学习,是一种半监督的二元分类模型,通过标注过的正样本和大量未标注的样本训练出一个二元分类器。
与普通分类问题不同,PU问题中P的规模通常相当小,扩大正样本集合也比较困难;而U的规模通常很大,比如在网页分类中,未标识的网页资源可以非常廉价、方便的从网络中获取。引入U的目的就是降低人工分类的预备工作量,同时提高精度,尽可能达到自动分类的效果。
本文主要参考「Building Text Classifiers Using Positive and Unlabeled Examples」,对其中的PU学习方法进行简单的介绍。
PU 学习方法
PU学习主要有以下两个步骤:
- 根据已标注过的正样本P在未标注样本集U中找出可靠的负样本集合(Reliable Negative Examples,简称RN),将PU问题转化为二分类的问题;
- 利用正负样本通过迭代训练得到一个二元分类器。
理论上已经证明:如果最大化未标注样本集U中负样本的个数,同时保证正样本被正确分类,则会得到一个性能不错的分类器。
上述两个步骤中,找出RN以及训练二元分类器都有很多方法可以选择,下面对这些方法进行简单的介绍。
计算 RN
1. 朴素贝叶斯分类器
使用朴素贝叶斯(Naive Bayesian,NB)分类方法计算RN,可以简单参考以下步骤:
- 把P中的每个样本标记为类别1;
- 把U中的每个样本标记为类别-1;
- 使用P和U训练得到贝叶斯分类器;
- 对U中的每个样本使用上述分类器进行分类,如果分类结果为-1,则把该样本加入RN。
2. Rocchio 技术
Rocchio是一种早期的文档分类技术,其基本思想是:每个样本可以用一组特征向量来表示,特征值可以使用TF-IDF方式计算得到。
设全部样本集合为D,类别为 训练样本集合为 。通过对每个类别构造一个原型向量,可以得到Rocchio分类器:
对一个待分类的样本t,使用余弦相似度计算其与每个类别的原型向量的相似距离,取距离最小的类别作为该样本的类别。
使用Rocchio算法与上述NB分类器计算RN的步骤很类似,只要把上述算法中第3步的分类器替换为Rocchio分类器即可。
3. Spy 算法
Spy的基本思想是从P中划分出一个子集S,将S中的样本放到U中,从而得到新的正样本集P-S和未标识样本集U+S。使用P-S作为正样本,U+S作为负样本,利用迭代的EM算法进行分类,当分类结束后,利用对那些“间谍”样本的标识,确定一个参数阈值th,再对U中的文档进行划分得到可靠的反样本集合RN。其中,从P中划分子集S的数量比例一般为15%。算法步骤描述如下:
- RN集合置空;
- 从P中随机选取子集S,得到新的正样本集PS=P-S和未标识样本集US=U+S,记PS中各个样本类别为1,US各个样本类别为-1;
- PS和US作为训练集,用I-EM算法训练得到一个贝叶斯分类器;
- 使用子集S确定出一个概率阈值th;
- 对US中的每个样本d使用贝叶斯分类器计算其属于正类别的概率P(1|d),如果小于阈值概率th,则把其加入RN集合。
4. 1-DNF 算法
1-DNF算法基本思想是:对于每个特征,如果其在P集合中的出现频次大于N集合,记该特征为正特征(Positive Feature, PF),所有满足该条件的特征组成一个PF集合。对U中的每个样本,如果其完全不包含PF集合中的任意一个特征,则该样本应加入RN。算法步骤描述如下:
PF 置空,RN=U;
设 U∪P 的特征集为:{x1,x2,---,xn};
for i=1 to n:
if (freq(xi,P)/|P| > freq(xi,U)/|U|):
PF = PF ∪ {xi}
for each d∈U:
Ifョxj,freq(xj,d) > 0 and xj∈PF:
RN = RN - {d}
训练分类器
1. SVM
使用SVM直接对P和RN进行训练得到分类器。
2. S-EM
EM算法主要由Expectation和Maximization两个步骤组成。前者对缺失标签的数据打上标签;后者则用全部数据一起计算模型参数。算法步骤描述如下:
- 对 P 中的每个样本标记为类别 1;
- 对 RN 中的每个样本标记为类别-1;
- Q=U-RN 中的样本起初没有任何类别标签,在 EM 算法第一次迭代完成时,这些数据将会具有一个基于概率的类别标签。在后续的迭代中,都使用上一轮更新完类别标签的数据集 Q,直至 EM 算法收敛。
在上述流程中,每次迭代使用Naive Bayesian算法修正Q集合中的数据标签。
3. PEBL 算法
PEBL算法主要思想是使用SVM迭代地从U-RN中抽取出更多的负样本,并把它们放到RN集合中,直至U-RN中没有可以被分为负样本的数据为止。算法步骤如下:
- 对 P 中的每个样本标记为类别 1;
- 对 RN 中的每个样本标记为类别-1;
- 令 i=1,Q=U-RN,开始以下的循环:
- 使用 P 和 RN 训练一个 SVM 分类器 Si;
- 使用 Si 对 Q 中的样本进行分类,把其中所以分类为-1 的样本记为 W;
- 如果 W 为空,则结束循环;否则:Q = Q-W, RN = RN ∪ W, i = i + 1
4. Roc-SVM 算法
PEBL算法中得到的最后一个分类器不一定是最优分类器,为此,对该算法进行一些改进,得到了Roc-SVM算法。算法步骤如下:
- 使用 PEBL 算法直至收敛,记最后一个分类器为 S_last;
- 使用 S_last 对 P 进行分类;
- 如果 P 中超过 8%的样本被分为负样本,则选择 S1 作为最终的分类器;否则,选择 S_last 作为最终分类器。
由于SVM算法对噪声很敏感,如果在迭代过程中,把Q中的一些正样本错分为-1而划分到RN中,那么会导致最终的分类器S_last性能很差,这也是PEBL算法的一个缺陷。为此,需要对S_last的分类性能进行评估,看是否选择其作为最终分类器。选择8%作为判断阈值也是一个保守的做法,以防选择一个性能不好的分类器。
上述的选择S1或S_last的做法其实还是欠妥,因为这两个分类器可能性能都很差。S1性能差是因为初始的RN集合中可能包含很少的负样本,不能体现出负样本的整体分布情况;S_last性能差则是由于PEBL算法在某个迭代过程中把一些正样本错分到RN中。为此,我们可以选择使用Spy或Rocchio算法得到初始的RN,这样可以使S1、更加稳健。有一点要注意的是:多数情况下,最佳分类器可能并不是S1或S_last,而是在迭代过程中产生的某一个分类器,然而,这个最佳分类器却是很难被“catch”的。
有偏的 SVM 算法
由于正样本集合P中难免会有一些噪声,以及正负样本的数据倾斜,可使用一种有偏的SVM算法,使用C+和C-分别控制正负样本的误差(直观上看,对C+取一个较大的值,而C-取一个较小的值):
为了选择合适的C+和C-,通常用验证集来评估在不同取值下的分类器性能。性能指标可采用F值(F=2pr/(p+r),其中,p为准确率,r为召回率)。但又个问题:验证集中没有负样本,如何评估F值呢?
“Learning with positive and unlabeled examples using weighted logistic regression”中给出了一种直接使用不含负样本的验证集来评估分类器性能的方法。判断准则是采用:pr / Pr[Y=1](其中,Pr[Y=1]是正样本的实际概率),其等价于r2 / Pr[f(X)=1] (其中,Pr[f(X)=1]是一个样本被分为正样本的概率)。其中,r可以用验证集中的正样本来计算得到,Pr[f(X)=1]可以由整个验证集计算得到。这个判断指标随p和r的增加而增加,随p或r中任一个减小而减小,所以可以像F值一样来判断分类器的性能。
实验及结论
原文中给出了上述的方法在不同组合下的实验评估,结果表明,采用有偏的SVM方法性能最好(具体的实验及数据比较这里就不写了,可以参考原文)。
参考文献
Bing Liu, Yang Dai, Xiaoli Li, Wee Sun Lee and and Philip Yu. “Building Text Classifiers Using Positive and Unlabeled Examples”.
Proceedings of the Third IEEE International Conference on Data Mining (ICDM-03), Melbourne, Florida, November 19-22, 2003