精华内容
下载资源
问答
  • 基于深度学习的恶意 URL 识别

    千次阅读 2020-06-11 08:58:08
    基于深度学习的恶意 URL 识别 原文作者:陈康, 付华峥, 向勇 原文期刊:计算机系统应用,2018,27(6):27–33 原文链接:http://www.c-s-a.org.cn/1003-3254/6370.html 一、论文主要内容 在本文工作中,我们提出一种...

    基于深度学习的恶意 URL 识别

    原文作者:陈康, 付华峥, 向勇

    原文期刊:计算机系统应用,2018,27(6):27–33

    原文链接:http://www.c-s-a.org.cn/1003-3254/6370.html

    一、论文主要内容

    在本文工作中,我们提出一种基于深度学习的恶意 URL 识别模型。本文的模型基于 URL 词法特征进行检测。首先通过正常 URL 样本训练得到 URL 中的字符的分布表示。将 URL 转化成二维图像,然后通过训练 CNN 模型对二维图像进行特征抽取,最后使用全连接层进行分类。

    二、作者工作

    2.1 相关工作

    目前的恶意 URL 识别工作使用的主要是黑名单、启发式技术和机器学习技术。黑名单技术只能给与用户最低程度的保护,并不能及时检测出恶意网站,阻断用户对恶意网站的访问。启发式算法是对黑名单技术的一种补充算法,其主要原理是利用从恶意网址中发现的黑名单相似性规则来发现并识别恶意网页。但是启发式算法有误报率高以及规则更新难等缺点。

    机器学习算法通过分析网页 URL 以及网页信息,提取域名的重要特征表示,并训练出一个预测模型。有监督算法也叫分类算法,此算法的准确率较高而且误报率相对较低,但是却对标注数据以及特征工程比较敏感,标注数据的准确率以及选择使用的特征会严重影响算法的准确率和效率。无监督机器学习方法又称聚类方法。此类方法的具体分类过程主要由特征提取、聚类、簇标记和网页判别等步骤组成。主要做法是首先将 URL 数据集划分为若干簇,使得同一簇的数据对象之间相似度较高,而不同簇的数据对象之间的相似度较低。然后,通过构造和标记数据集中的簇来区分恶意网页和良性网页。

    深度学习通过学习深层非线性网络结构,逐层训练特征,将样本在原空间的特征表示逐步变换到新特征空间,最大好处是可以自动学习特征和抽象特征。

    2.2 模型设计

    设计思想

    根据 Anh 等人,正常和恶意 URL 具有不同的词法特征,即字符出现的频率、位置、和前后字符的关系具有可以区分的特征,我们提出一种完全基于 URL 字符串的词法特征,利用深度神经网络实现的恶意 URL 识别算法。

    具体实现

    算法分为 3 个阶段:

    首先,训练构成 URL 的字符表示为实数向量的形式;

    其次,基于第一步得到的映射表,将 URL 转换成特征图像;

    最后,将特征图像输入卷积神经网络 CNN 去学习特征,通过一个全连接层实现对 URL 的分类。

    image-20200607153438895

    本算法共有两个部分:训练部分和预测部分。

    训练流程:

    • 系统监控用户浏览行为过程并生成日志;
    • 使用深度学习对日志文件进行训练得到字符的嵌入式模型;
    • 利用上一步得到的模型对网页URL进行特征转化;
    • 使用CNN算法训练已标注的恶意/良性URL特征。

    预测/评估过程:

    • 使用字符的嵌入式表示对日志行为数据进行特征转化;
    • 使用训练后的CNN模型进行词法特征提取;
    • 再使用分类输出层进行恶意概率计算。

    使用语料训练 RNN 生成字符的嵌入式表示

    主要工作是将字符映射到 K 维向量空间,将其转为连续值的向量表示。

    1. 首先从 0 开始对 URL 中出现的所有字符进行编码。设定一个词汇表大小 v,将所有出现的字符按出现的频率从 1 到 v–2 进行编码。0 作为填充字符的编码,v–1 作为未知 (未出现在字符表中) 字符的编码 1;

    2. 训练一个两层的神经网络模型。构建一个[v,k]的二维向量,将正常的 URL 作为训练样本输入。例如 www.baidu.com,转换为训练序列 (w, w), (w, w), (w,w), …, (a, b), (a, i), …, (m, o),然后计算输出预测和它实际值的损失函数,训练过程中更新二维向量的值;

    3. 训练结束后,得到维度为[v, k]的映射表。

    将 URL 转化为特征图像

    确定一个 URL 最大长度 n,构建一个[n, k]大小的图像。如果 URL 长度小于 n 的,使用 0 作为填充,对于长度大于 n 的 URL 做截断。转换后图像的每一行即是 URL 中的一个字符的向量表示。如图 3 所示。

    CNN 提取特征并进行分类

    构建一个 CNN 分类模型,将上述得到的特征图像作为输入,通过卷积层对进行特征提取,最后通过一个全连接层进行分类,得到输出变量-即分类结果。CNN 模型如图 4 所示。

    三、实验

    3.1 实验数据

    本次研究筛选出某个月的用户浏览记录前 50 000 的 url 作为正常的 URL;同时采用爬虫从网站 https://www.malwaredomainlist.com/mdl.php、http://www.phishtank.com/等网站中收集了 3 万多条URL 数据作为恶意网站数据。

    3.2 实验结果

    本次实验使用一台服务器进行, 安装了 python3.6.2,TensorFlow1.2.0, sklearn 等。服务器操作系统是 Centos 7.2 版本,内存为 512 G,核数为 40。

    本研究采用十折交叉验证对 80 000 多个 URL 进行分类验证。图 5 和图 6 为算法精度和损失函数曲线
    和 ROC 曲线图。

    在我们的实验数据集上,模型的准确率为 0.962、召回率为 0.879、F1 值为 0.918,模型整体达到了很好的预测效果。

    在本次试验数据的过程中,目前测试的样本集下,全连接层的个数会严重影响模型结果。如果在算法的最后再增加一层全连接层,模型效果精度将会降低 50% 左右,因此对类似数据量的模型训练来说,全连接层的个数至关重要。

    我们使用 grid search 进行参数选择,发现卷积核分别设置为 128 和 256,批处理数量分别设置为 128 或者 256,学习率设置为 0.001 时,算法较好。

    四、总结

    本文提出了一种基于URL字符串转化为二维图片,利用CNN进行分类的深度学习方法。是一种学习了URL词法特征的方法,但处理的URL需要限制长度,然而攻击者常常使用很长的URL来试图掩盖可以部分。而且只考虑了单个字符出现的频率,没有考虑字符出现的位置、和前后字符的关系,或许会出现一些偏差。

    展开全文
  • 恶意url_预测URL的恶意

    千次阅读 2020-08-01 03:53:59
    恶意urlIn this article, we walk through developing a simple feature set representation for identifying malicious URLs. We will create feature vectors for URLs and use these to develop a classification...

    恶意url

    In this article, we walk through developing a simple feature set representation for identifying malicious URLs. We will create feature vectors for URLs and use these to develop a classification model for identifying malicious URLs. To evaluate how good the features are in separating malicious URLs from benign URLs, we build a Decision-Tree based machine learning model to predict the maliciousness of a given URL.

    在本文中,我们将逐步开发一种用于识别恶意URL的简单功能集表示形式。 我们将为URL创建特征向量,并使用它们来开发用于识别恶意URL的分类模型。 为了评估功能在将恶意URL与良性URL分离方面的优势,我们构建了基于决策树的机器学习模型来预测给定URL的恶意性。

    Malicious websites are well-known threats in cybersecurity. They act as an efficient tool for propagating viruses, worms, and other types of malicious codes online and are responsible for over 60% of most cyber attacks. Malicious URLs can be delivered via email links, text messages, browser pop-ups, page advertisements, etc. These URLs may be links to dodgy websites or most likely have embedded ‘downloadables’. These embedded downloads can be spy-wares, key-loggers, viruses, worms, etc. As such it has become a priority for cyber defenders to detect and mitigate the spread of malicious codes within their networks promptly. Various techniques for malicious URL detectors have previously relied mainly on URL blacklisting or signature blacklisting. Most of these techniques offer ‘after-the-fact’ solutions. To improve the timeliness and abstraction of malicious URL detection methods, machine learning techniques are increasingly being accepted.

    恶意网站是网络安全中众所周知的威胁。 它们是在线传播病毒,蠕虫和其他类型的恶意代码的有效工具,并负责大多数网络攻击的60%以上。 恶意URL可以通过电子邮件链接,文本消息,浏览器弹出窗口,页面广告等进行传递。这些URL可能是指向不可靠网站的链接,或者最有可能嵌入了“可下载内容”。 这些嵌入式下载可以是间谍软件,按键记录程序,病毒,蠕虫等。因此,网络防御者应优先考虑立即检测并缓解恶意代码在网络中的传播。 恶意URL检测器的各种技术以前主要依靠URL黑名单或签名黑名单。 这些技术大多数都提供“事后”解决方案。 为了提高恶意URL检测方法的及时性和抽象性,越来越多地接受机器学习技术。

    To develop a machine learning model, we need a feature extraction framework for featurizing URLs or converting URLs into feature vectors. In this article, We will collect samples of known malicious URLs and known benign URLs. We then develop a fingerprinting framework and extract a given set of M features for all URLs in the sample. We test the usefulness of these features in separating malicious URLs from benign URLs by developing a simple predictive model with these features. Finally, we measure the model’s ability to predict the maliciousness of URLs as the effectiveness of the features in separating malicious URLs from benign URLs.

    要开发机器学习模型,我们需要一个特征提取框架,用于特征化URL或将URL转换为特征向量。 在本文中,我们将收集已知恶意URL和已知良性URL的样本。 然后,我们开发一个指纹识别框架,并为示例中的所有URL提取给定的M个功能集。 通过开发具有这些功能的简单预测模型,我们测试了这些功能在区分恶意URL和良性URL方面的有用性。 最后,我们测量模型预测URL恶意性的能力,作为功能将恶意URL与良性URL分离的功能的有效性。

    The image below is an overview of the methodological process in this article.

    下图是本文方法论过程的概述。

    数据 (The Data)

    We collected data from two sources: Alexa Top 1000 sites and phishtank.com. 1000 assumed benign URLs were crawled from Alexa top 1000 websites and 1000 suspected malicious URLs were crawled from phishtank.com. Due to virustotal API limit rates, we randomly sample 500 assumed benign URLs and 500 assumed malicious URLs. The URLs were then scanned through virustotal. URLs with 0 malicious detections were labeled as benign (b_urlX) and URLs with at least 8 detections were labeled as malicious (m_urlX). we dumped the JSON results of each scan in corresponding files ‘b_urlX.json’, ‘m_urlX.json’. You can find these files here.

    我们从两个来源收集数据:Alexa前1000个网站和phishtank.com。 从Alexa排名前1000的网站中爬取了1000个假定的良性URL,并从phishtank.com中爬取了1000个可疑恶意URL。 由于API的病毒总数限制率,我们随机抽取了500个假定的良性URL和500个假定的恶意URL。 然后通过virustotal扫描URL。 具有0次恶意检测的URL被标记为良性(b_urlX),具有至少8次检测的URL被标记为恶意(m_urlX)。 我们将每次扫描的JSON结果转储到相应的文件“ b_urlX.json”,“ m_urlX.json”中。 您可以在这里找到这些文件。

    from requests import get
    from os import listdir
    import pandas as pd
    import numpy as np
    from pandas.io.json import json_normalize
    import seaborn as sns
    import matplotlib.pyplot as plt
    import math
    from datetime import datetime
    plt.rcParams["figure.figsize"] = (20,20)

    处理API速率限制和IP阻止 (Handling API Rate Limits and IP Blocking)

    To confirm that malicious URLs in the sample are malicious, we need to send multiple requests to VirusTotal. VirustTotal provides aggregated results from multiple virus scan engines. Also, we pass URLs through (Shodan)[shodan.io]. Shodan is a search engine for all devices connected to the internet providing service-based features of the URL’s server. VirusTotal and Shodan currently have API rate limits of 4 requests per minute and at least 10,000 requests per month respectively per API key. While the number of URL requests for the data fell within the Shodan API request limits, VirusTotal proved a little more difficult. This is addressed by creating several VT API Keys (be kind, 4 at most) and randomly sampling them in each request. In addition to limits on the number of API requests, sending multiple requests within a short period will lead to IP blocking from VT and Shodan servers. We write a small crawler to get the latest set of elite IP addresses from https://free-proxy-list.net/ and create a new proxy-list on each request given the very short lifespan of free proxies. In addition to IP pooling, we use Python’s FakeUserAgent library to switch User-Agents on each request.

    为了确认样本中的恶意URL是恶意的,我们需要向VirusTotal发送多个请求。 VirustTotal提供来自多个病毒扫描引擎的汇总结果。 另外,我们通过(Shodan)[shodan.io]传递URL。 Shodan是一个搜索引擎,它用于连接到Internet的所有设备,提供URL服务器的基于服务的功能。 VirusTotal和Shodan目前对API速率的限制是每分钟每分钟4个请求,每个API密钥每月分别至少有10,000个请求。 尽管对数据的URL请求数量在Shodan API请求限制之内,但VirusTotal却被证明有点困难。 通过创建几个VT API密钥(最多为4个)并在每个请求中随机采样它们,可以解决此问题。 除了限制API请求的数量外,在短时间内发送多个请求还会导致VT和Shodan服务器的IP阻塞。 我们编写了一个小型搜寻器,以从https://free-proxy-list.net/获取最新的精英IP地址集,并在给定免费代理的使用寿命非常短的情况下,针对每个请求创建一个新的代理列表。 除了IP池外,我们还使用Python的FakeUserAgent库在每个请求上切换User-Agent。

    Finally, For each request, we can send 16 requests per minute as opposed to the previous 4, with a new proxy and user agent. Each request has the following request parameters:

    最后,对于每个请求,我们可以使用新的代理和用户代理,每分钟发送16个请求,而之前的请求为4个。 每个请求具有以下请求参数:

    • 1 VirusTotal Key: Sample from VT API keys pool.

      1 VirusTotal Key:VT API密钥池中的样本。
    • 1 Shodan Key: Sample from Shodan API keys pool.

      1 Shodan密钥:Shodan API密钥池中的示例。
    • 1 IP: Send a request to https://free-proxy-list.net/ to get the latest free elite proxy.

      1个IP:向https://free-proxy-list.net/发送请求以获取最新的免费精英代理。

    • 1 User-Agent: Sample useable user agents from Python’s (Fake User-Agent)[https://pypi.org/project/fake-useragent/]

      1个User-Agent:来自Python的示例用户代理(虚假User-Agent)[https://pypi.org/project/fake-useragent/]

    The scanning from Shodan and VT produced the following dataset. From shodan, we extract the following features:

    Shodan和VT的扫描产生了以下数据集 。 从shodan中,我们提取了以下功能:

    • numServices: Total number of services (open ports) running on the host

      numServices:主机上运行的服务总数(开放端口)
    • robotstxt: Is the site has robots txt enabled

      robotstxt:网站是否启用了robots txt
    ## This gets elite proxy from https://pypi.org/project/fake-useragent/ on every requestclass Pooling(object):
    def __init__(self):
    self.proxies_url = ''
    '''returns a list of currently available elite proxies'''
    def proxy_pool(self, url = 'https://free-proxy-list.net/'):
    pq, proxies = get_page(url), []
    tr = pq('table#proxylisttable.table tbody tr')
    rows = [j.text() for j in [PyQuery(i)('td') for i in tr]]
    rows = [i for i in rows if 'elite' in i]
    for row in rows:
    row = row.split()
    data = {}
    data['ip'] = row[0]
    data['port'] = row[1]
    data['country'] = row[3]
    data['proxy'] = {
    'http' :'http://{}:{}'.format(data['ip'], data['port']),
    'https' :'https://{}:{}'.format(data['ip'], data['port'])
    }
    proxies.append(data)
    return choice(proxies)
    '''return a random list of user agents'''
    def ua_pool(self):
    ua = UserAgent()
    chromes = ua.data['browsers']['chrome'][5:40]
    shuffle(chromes)
    return choice(chromes)

    The final dataset after scanning is available here. You can download this data and run your analysis.

    扫描后的最终数据集可在此处获得 。 您可以下载此数据并运行分析。

    指纹URL(用于恶意软件URL检测的特征URL) (Fingerprinting URLS (Featurizing URLs for Malware URL Detection))

    The goal is to extract URL characteristics that are important in separating malicious URLs from good URLs. First, let’s look at the relevant parts in the structure of a URL.

    目的是提取URL特征,这些特征对于将恶意URL与良好URL分开至关重要。 首先,让我们看一下URL结构中的相关部分。

    Image for post
    A Typical URL
    典型网址

    A URL (short for Uniform Resource Locator) is a reference that specifies the location of a web resource on a computer network and a mechanism for retrieving it. The URL is made up of different components as shown in the figure below. The protocol or scheme specifies how (or what is needed for) information is to be transferred. The hostname is a human-readable unique reference of the computer’s IP address on the computer network. The Domain Name Service (DNS) naming hierarchy maps an IP address to a hostname. Compromised URLs are used to perpetrate cyber-attacks online. These attacks may be in any or more forms of phishing emails, spam emails, and drive-by downloads.

    URL(统一资源定位符的缩写)是一个引用,用于指定Web资源在计算机网络上的位置以及用于检索该资源的机制。 URL由不同的组件组成,如下图所示。 该协议或方案指定如何(或需要什么)信息进行传输。 主机名是计算机网络上计算机IP地址的人类可读的唯一引用。 域名服务(DNS)命名层次结构将IP地址映射到主机名。 受损的URL用于在线进行网络攻击。 这些攻击可能以网络钓鱼电子邮件,垃圾邮件和偷渡式下载的任何或更多形式出现。

    Regarding domains, owners buy domains that people find easier to remember. Owners would normally want names that are specific to a brand, product, or service which they are delivering. This part (the domain)of the URL cannot be changed once set. Malicious domain owners may opt for multiple cheap domain names for example ‘xsertyh.com’.

    关于域名,所有者购买人们容易记住的域名。 所有者通常希望使用特定于他们所提供的品牌,产品或服务的名称。 网址的此部分(域)一旦设置就无法更改。 恶意域名所有者可能会选择多个廉价域名,例如“ xsertyh.com”。

    The free URL parameters are parts of a URL that can be changed to create new URLs. These include directory names, file paths, and URL parameters. These free URL parameters are usually manipulated by attackers to create new URLs, embed malicious codes and propagate them.

    可用的URL参数是URL的一部分,可以更改以创建新的URL。 其中包括目录名称,文件路径和URL参数。 这些免费的URL参数通常由攻击者操纵以创建新的URL,嵌入恶意代码并传播它们。

    There are many techniques for malicious URL detection, two main techniques being a) Blacklisting Techniques, and b) Machine Learning Techniques. Blacklisting involves maintaining a database of known malicious domains and comparing the hostname of a new URL to hostnames in that database. This has an ‘after-the-fact’ problem. It will be unable to detect new and unseen malicious URL, which will only be added to the blacklist after it has been observed as malicious from a victim. Machine learning approaches, on the other hand, provide a predictive approach that is generalizable across platforms and independent of prior knowledge of known signatures. Given a sample of malicious and benign malware samples, ML techniques will extract features of known good and bad URLs and generalize these features to identify new and unseen good or bad URLs.

    有许多用于恶意URL检测的技术,其中两项主要技术是a)黑名单技术和b)机器学习技术。 黑名单包括维护已知恶意域的数据库,并将新URL的主机名与该数据库中的主机名进行比较。 这有一个“事后”问题。 它将无法检测到新的和看不见的恶意URL,只有在被受害者视为恶意URL后,该URL才会添加到黑名单中。 另一方面,机器学习方法提供了一种预测性方法,该方法可跨平台通用并且独立于已知签名的先验知识。 给定一个恶意和良性恶意软件样本示例,机器学习技术将提取已知的好和坏URL的功能,并将这些功能概括化以识别新的和看不见的好或坏URL。

    The URL fingerprinting process targets 3 types of URL features:

    URL指纹识别过程针对3种类型的URL功能:

    • URL String Characteristics: Features derived from the URL string itself.

      URL字符串特征:从URL字符串本身派生的功能。
    • URL Domain Characteristics: Domain characteristics of the URLs domain. These include whois information and shodan information.

      URL域特征:URL域的域特征。 这些信息包括Whois信息和Shodan信息。
    • Page Content Characteristics: Features extracted from the URL’s page (if any)

      页面内容特征:从URL页面提取的特征(如果有)

    A summary of all features extracted are shown in the table below:

    下表中列出了提取的所有功能的摘要:

    Image for post
    Summary of a URL’s Feature Vectors
    URL的特征向量摘要
    # This creates a feature vector from a URLclass UrlFeaturizer(object):
    def __init__(self, url):
    self.url = url
    self.domain = url.split('//')[-1].split('/')[0]
    self.today = datetime.now()

    try:
    self.whois = whois.query(self.domain).__dict__
    except:
    self.whois = None

    try:
    self.response = get(self.url)
    self.pq = PyQuery(self.response.text)
    except:
    self.response = None
    self.pq = None

    ## URL string Features
    def entropy(self):
    string = self.url.strip()
    prob = [float(string.count(c)) / len(string) for c in dict.fromkeys(list(string))]
    entropy = sum([(p * math.log(p) / math.log(2.0)) for p in prob])
    return entropy

    def numDigits(self):
    digits = [i for i in self.url if i.isdigit()]
    return len(digits)

    def urlLength(self):
    return len(self.url)

    def numParameters(self):
    params = self.url.split('&')
    return len(params) - 1

    def numFragments(self):
    fragments = self.url.split('#')
    return len(fragments) - 1

    def numSubDomains(self):
    subdomains = self.url.split('http')[-1].split('//')[-1].split('/')
    return len(subdomains)-1

    def domainExtension(self):
    ext = self.url.split('.')[-1].split('/')[0]
    return ext

    ## URL domain features
    def hasHttp(self):
    return 'http:' in self.url
    def hasHttps(self):
    return 'https:' in self.url
    def urlIsLive(self):
    return self.response == 200

    def daysSinceRegistration(self):
    if self.whois and self.whois['creation_date']:
    diff = self.today - self.whois['creation_date']
    diff = str(diff).split(' days')[0]
    return diff
    else:
    return 0
    def daysSinceExpiration(self):
    if self.whois and self.whois['expiration_date']:
    diff = self.whois['expiration_date'] - self.today
    diff = str(diff).split(' days')[0]
    return diff
    else:
    return 0

    ## URL Page Features
    def bodyLength(self):
    if self.pq is not None:
    return len(self.pq('html').text()) if self.urlIsLive else 0
    else:
    return 0
    def numTitles(self):
    if self.pq is not None:
    titles = ['h{}'.format(i) for i in range(7)]
    titles = [self.pq(i).items() for i in titles]
    return len([item for s in titles for item in s])
    else:
    return 0
    def numImages(self):
    if self.pq is not None:
    return len([i for i in self.pq('img').items()])
    else:
    return 0
    def numLinks(self):
    if self.pq is not None:
    return len([i for i in self.pq('a').items()])
    else:
    return 0

    def scriptLength(self):
    if self.pq is not None:
    return len(self.pq('script').text())
    else:
    return 0

    def specialCharacters(self):
    if self.pq is not None:
    bodyText = self.pq('html').text()
    schars = [i for i in bodyText if not i.isdigit() and not i.isalpha()]
    return len(schars)
    else:
    return 0

    def scriptToSpecialCharsRatio(self):
    if self.pq is not None:
    sscr = self.scriptLength()/self.specialCharacters
    else:
    sscr = 0
    return sscr

    def scriptTobodyRatio(self):
    if self.pq is not None:
    sbr = self.scriptLength()/self.bodyLength
    else:
    sbr = 0
    return sbr

    def bodyToSpecialCharRatio(self):
    if self.pq is not None:
    bscr = self.specialCharacters()/self.bodyLength
    else:
    bscr = 0
    return bscr

    def run(self):
    data = {}
    data['entropy'] = self.entropy()
    data['numDigits'] = self.numDigits()
    data['urlLength'] = self.urlLength()
    data['numParams'] = self.numParameters()
    data['hasHttp'] = self.hasHttp()
    data['hasHttps'] = self.hasHttps()
    data['urlIsLive'] = self.urlIsLive()
    data['bodyLength'] = self.bodyLength()
    data['numTitles'] = self.numTitles()
    data['numImages'] = self.numImages()
    data['numLinks'] = self.numLinks()
    data['scriptLength'] = self.scriptLength()
    data['specialChars'] = self.specialCharacters()
    data['ext'] = self.domainExtension()
    data['dsr'] = self.daysSinceRegistration()
    data['dse'] = self.daysSinceExpiration()
    data['sscr'] = self.scriptToSpecialCharsRatio()
    data['sbr'] = self.scriptTobodyRatio()
    data['bscr'] = self.bodyToSpecialCharRatio()
    return data

    Running the script above produces the following data with 23 features. We will separate integers, booleans, and object column names into separate lists for easier data access.

    运行上面的脚本会生成具有23个功能的以下数据。 我们将整数,布尔值和对象列名称分成单独的列表,以简化数据访问。

    objects = [i for i in data.columns if 'object' in str(data.dtypes[i])]
    booleans = [i for i in data.columns if 'bool' in str(data.dtypes[i])]
    ints = [i for i in data.columns if 'int' in str(data.dtypes[i]) or 'float' in str(data.dtypes[i])]

    删除高度相关的功能 (Removing Highly Correlated Features)

    The most linear analysis assumes non-multicollinearity between predictor variables i.e pairs of predictor features must not be correlated. The intuition behind this assumption is that there is no additional information added to a model with multiple correlated features as the same information is captured by one of the features.

    最线性的分析假定了预测变量之间的非多重共线性,即,预测特征对之间必须不相关。 该假设背后的直觉是,没有将附加信息添加到具有多个相关特征的模型中,因为其中一个特征捕获了相同的信息。

    Multi-correlated features are also indicative of redundant features in the data and dropping them is a good first step for data dimension reduction. By removing correlated features (and only keeping, one of the groups of observed correlated features), we can address the issues of feature redundancy and collinearity between predictors.

    多重关联的特征还指示数据中的冗余特征,将其删除是减少数据维度的良好第一步。 通过删除相关特征(并且仅保留观察到的相关特征组之一),我们可以解决预测变量之间的特征冗余和共线性问题。

    Let’s create a simple correlation grid to observe the correlation between the derived features for malicious and benign URL and remove one or more of highly correlated features.

    让我们创建一个简单的关联网格,以观察恶意和良性URL的衍生功能之间的关联,并删除一个或多个高度关联的功能。

    corr = data[ints+booleans].corr()# Generate a mask for the upper trianglemask = np.triu(np.ones_like(corr, dtype=np.bool))# Set up the matplotlib figuref, ax = plt.subplots(figsize=(20, 15))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
    square=True, linewidths=.5, cbar_kws={"shrink": .5}, annot=True)
    Image for post
    Cross-Correlation Coefficients
    互相关系数

    However, we do not want to remove all correlated variables-only those with a very strong correlation that do not add extra information to the model. For this, we define a certain ‘threshold’ (0.7) for positive and negative correlation observed.

    但是,我们不希望删除所有相关变量,而只删除那些具有很强相关性且不会向模型添加额外信息的变量。 为此,我们为观察到的正相关和负相关定义了某个“阈值”(0.7)。

    We see that most of the highly correlated features are negatively correlated. For example, there is a 0.56 negative correlation coefficient between the number of characters in a URL and the entropy of the URL which suggests that shorter URLs have

    我们看到大多数高度相关的特征是负相关的。 例如,URL中的字符数与URL的熵之间存在0.56的负相关系数,这表明较短的URL具有

    Here we will create a function to identify and drop one of multiple correlated features.

    在这里,我们将创建一个函数来识别和删除多个相关特征之一。

    def dropMultiCorrelated(cormat, threshold):
    ## Define threshold to remove pairs of features with correlation coefficient greater than 0.7 or -0.7
    threshold = 0.7
    # Select upper triangle of correlation matrix
    upper = cormat.abs().where(np.triu(np.ones(cormat.shape), k=1).astype(np.bool))
    # Find index of feature columns with correlation greater than threshold
    to_drop = [column for column in upper.columns if any(upper[column] > threshold)]
    for d in to_drop:
    print("Dropping {}....".format(d))
    return to_drop
    data2 = data[corr.columns].drop(dropMultiCorrelated(corr, 0.7), axis=1)Dropping urlLength....
    Dropping scriptLength....
    Dropping specialChars....
    Dropping bscr....
    Dropping hasHttps....

    预测URL的恶意(决策树) (Predicting Maliciousness of URLs (Decision Trees))

    Modeling builds a blueprint for explaining data, from previously observed patterns in the data. Modeling is often predictive in that it tries to use this developed ‘blueprint’ in predicting the values of future or new observations based on what it has observed in the past.

    建模会根据数据中先前观察到的模式构建用于解释数据的蓝图。 建模通常是可预测的,因为它会尝试使用已开发的“蓝图”根据过去的观测结果预测未来或新观测值。

    Based on the extracted features, we want the best predictive model that tells us if an unseen URL is malicious or benign. Therefore, we seek a unique combination of useful features to accurately separate malicious from benign URLs. We will go through two stages, feature selection, where we select only features useful in predicting the target variable and modeling with decision trees to develop a predictive model for malicious and benign URLs.

    基于提取的功能,我们需要最佳的预测模型,该模型可以告诉我们看不见的URL是恶意的还是良性的。 因此,我们寻求有用功能的独特组合,以准确区分恶意URL和良性URL。 我们将经历两个阶段,即特征选择,在此阶段中,我们仅选择对预测目标变量有用的特征以及使用决策树建模以开发恶意和良性URL的预测模型。

    功能选择 (Feature Selection)

    What variables are most useful in identifying a URL as ‘malicious’ or ‘benign’? Computationally, we can automatically select what variables are most useful by testing which ones ‘improves’ or ‘fails to improve’ the overall performance of the prediction model. This process is called ‘Feature Selection’. Feature selection also serves the purpose of reducing the dimension of data, addressing issues of computational complexity and model performance. The goal of feature selection is to obtain a useful subset of the original data that is predictive of the target feature in such a way that useful information is not lost (considering all predictors together). Although feature selection goes beyond simple correlation elimination, for this article, we limit our feature selection method simply retaining these features. Let’s create a subset of the original data that contain only uncorrelated features.

    哪些变量在将URL标识为“恶意”或“良性”时最有用? 通过计算,我们可以通过测试哪些变量“改善”或“未能改善”预测模型的整体性能来自动选择最有用的变量。 此过程称为“功能选择”。 特征选择还用于减小数据量,解决计算复杂性和模型性能的问题。 特征选择的目的是以不丢失有用信息(将所有预测变量都考虑在内)的方式获得可预测目标特征的原始数据的有用子集。 尽管特征选择超出了简单的相关性消除,但在本文中,我们限制了仅保留这些特征的特征选择方法。 让我们创建仅包含不相关功能的原始数据的子集。

    predictor_columns = data2.columns
    d = data2[predictor_columns]
    x, y = d[predictor_columns], data['vt_class']

    We keep only features that are unique in their contribution to the model. We can now start developing the model with 70% of the original sample and these 14 features. We will keep 30% of the sample to evaluate the model’s performance on new data.

    我们仅保留对模型的贡献独特的特征。 现在,我们可以使用原始样本的70%和这14个功能来开发模型。 我们将保留30%的样本,以根据新数据评估模型的性能。

    • numServices

      numServices
    • entropy

    • numDigits

      numDigits
    • numParams

      numParams
    • bodyLength

      体长
    • numTitles

      numTitles
    • numImages

      numImages
    • numLinks

      numLinks
    • dsr

      数码单反相机
    • dse

      dse
    • sscr

      sscr
    • sbr

      sbr
    • robots

      机器人
    • hasHttp

      hasHttp
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 100)

    决策树 (Decision Trees)

    from sklearn import tree
    from sklearn.metrics import accuracy_scorefrom sklearn.externals.six import StringIO
    from IPython.display import Image
    from sklearn.tree import export_graphviz
    import pydotplus

    There are multiple machine learning algorithms (classification) algorithms that can be applied to identifying malicious URLs. After converting URLs to a representative feature vector, we model the ‘malicious URL identification problem’ as a binary classification problem. A binary classification model trains a predictive model for a class with only two outcomes ‘Malicious’ and ‘Benign’. Batch learning algorithms are machine learning algorithms that work under the following assumptions:

    有多种机器学习算法(分类)算法可用于识别恶意URL。 将URL转换为代表性特征向量后,我们将“恶意URL识别问题”建模为二进制分类问题。 二进制分类模型为只有两个结果“恶意”和“良性”的班级训练预测模型。 批处理学习算法是在以下假设下工作的机器学习算法:

    - the entire training data is available before model development and

    - the entire training data is available before model development and

    - the target variable is known before the model training task.

    - the target variable is known before the model training task.

    Batch algorithms are ideal and effective in that they are explainable discriminative learning models that use simple loss minimization between training data points. Decision trees are one such batch learning algorithms in machine learning.

    批处理算法是理想且有效的方法,因为它们是可解释的判别性学习模型,该模型使用训练数据点之间的简单损失最小化。 决策树就是这样一种机器学习中的批量学习算法。

    In decision analysis, a decision tree is a visual representation of a model’s decision-making process to arrive at certain conclusions. The basic idea behind decision trees is an attempt to understand what factors influence class membership or why a data point belongs to a class label. A decision tree explicitly shows the conditions on which class members are made. Therefore they are a visual representation of the decision-making process.

    在决策分析中,决策树是模型决策过程的直观表示,可以得出某些结论。 决策树背后的基本思想是试图了解哪些因素影响类成员资格或数据点为何属于类标签。 决策树明确显示了创建类成员的条件。 因此,它们是决策过程的直观表示。

    Decision tree builds predictive models by breaking down the data set into smaller and smaller parts. The decision to split a subset is based on maximizing the information gain or minimizing information loss from splitting. Starting with the root node (the purest feature with no uncertainty), the tree is formed by creating various leaf nodes based on the purity of the subset.

    决策树通过将数据集分解为越来越小的部分来构建预测模型。 分割子集的决定基于最大化信息增益或最小化来自分割的信息损失。 从根节点(没有不确定性的最纯特征)开始,通过基于子集的纯度创建各种叶节点来形成树。

    In this case, the decision tree will explain class boundaries for each feature to classify a URL as malicious or benign. There are two main factors to consider when building a decision tree:

    在这种情况下,决策树将解释每个功能的类边界,以将URL分类为恶意或良性。 构建决策树时,需要考虑两个主要因素:

    - a) What criteria to use in splitting or creating leaf nodes and- b) tree pruning to control how long a tree is allowed to grow to control the risk of over-fitting.

    - a) What criteria to use in splitting or creating leaf nodes and- b) tree pruning to control how long a tree is allowed to grow to control the risk of over-fitting.

    The criterion parameter of the decision tree algorithm specifies what criteria (Gini or entropy) to control for while the max_depth parameter controls how far the tree is allowed to grow. Gini measurement is the probability of a random sample being classified incorrectly if we randomly pick a label according to the distribution in a branch. Entropy is a measurement of information (or rather lack thereof).

    决策树算法的标准参数指定要控制的标准(Gini或熵),而max_depth参数则控制允许树增长多远。 基尼系数测量是如果我们根据分支中的分布随机选择标签,则随机样本被错误分类的概率。 熵是信息(或缺乏信息)的度量。

    Unfortunately, since there is no prior knowledge of the right combination of criteria and tree depth, we would have to iteratively test for the optimal values of these two parameters. We test a max_depth for 50 iterations for both criteria and visualize the model accuracy scores.

    不幸的是,由于没有关于标准和树深度的正确组合的先验知识,我们将不得不迭代测试这两个参数的最佳值。 我们针对两个标准测试了50次迭代的max_depth,并可视化了模型的准确性得分。

    maxd, gini, entropy = [], [], []for i in range(1,50):
    ###
    dtree = tree.DecisionTreeClassifier(criterion='gini', max_depth=i)
    dtree.fit(X_train, y_train)
    pred = dtree.predict(X_test)
    gini.append(accuracy_score(y_test, pred))

    ####
    dtree = tree.DecisionTreeClassifier(criterion='entropy', max_depth=i)
    dtree.fit(X_train, y_train)
    pred = dtree.predict(X_test)
    entropy.append(accuracy_score(y_test, pred))

    ####
    maxd.append(i)
    ####
    d = pd.DataFrame({'gini':pd.Series(gini), 'entropy':pd.Series(entropy), 'max_depth':pd.Series(maxd)})# visualizing changes in parameters
    plt.plot('max_depth','gini', data=d, label='Gini Index')
    plt.plot('max_depth','entropy', data=d, label='Entropy')
    plt.xlabel('Max Depth')
    plt.ylabel('Accuracy')
    plt.legend()
    Image for post
    Parameter Tuning
    参数调整

    It seems the best model is the simplest one with the Gini index and a max depth of 4 with 84% out of sample accuracy. Also, maximizing the entropy does not seem to produce good results suggesting that new parameters added to the model do not necessarily give new information but may produce improved node probability purity. So we can fit and visualize the tree with max_depth = 4 and Gini criteria to identify which features are most important in separating malicious and benign URLs.

    似乎最好的模型是最简单的模型,具有基尼系数,最大深度为4,样本精度为84%。 同样,最大化熵似乎并不会产生好的结果,这表明添加到模型中的新参数不一定提供新信息,而是可以提高节点概率纯度。 因此,我们可以使用max_depth = 4和基尼标准来拟合和可视化树,以识别哪些功能在分离恶意URL和良性URL中最重要。

    Build the model….

    建立模型…。

    ###create decision tree classifier objectDT = tree.DecisionTreeClassifier(criterion="gini", max_depth=4)##fit decision tree model with training dataDT.fit(X_train, y_train)##test data predictionDT_expost_preds = DT.predict(X_test)

    Visualize the tree …

    可视化树…

    dot_data = StringIO()
    export_graphviz(DT, out_file=dot_data,
    filled=True, rounded=True,
    special_characters=True,feature_names=X_train.columns, class_names=DT.classes_)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    Image(graph.create_png())
    Image for post
    Tree

    The accuracy of prediction models is very sensitive to parameter tuning of the max_depth (tree pruning) and split quality criteria (node splitting). This also helps in achieving the simplest parsimonious model that prevents over-fitting and performs just as well on unseen data. These parameters are specific to different data problems and it is good practice to test a combination of different parameter values.

    预测模型的准确性对max_depth的参数调整(树修剪)和分割质量标准(节点分割)非常敏感。 这也有助于实现最简单的简约模型,该模型可以防止过度拟合并在看不见的数据上表现出色。 这些参数特定于不同的数据问题,并且优良作法是测试不同参数值的组合。

    The model shows that malicious URLs have a lower script to special character ratio (sscr) and URL characters that are relatively more ‘ordered’ or more monotonous. Additionally, malicious URLs may have domains that have expired somewhere between 5–9 months ago. We also know of issues of ‘malvertising’ where scammers take ownership of expired legitimate domains to distribute downloadable malicious codes. Finally, probably the most distinguishing feature of benign URLs is longevity. They seem to moderate script to special character ratio in HTML body content with longer domain lifetime of 4–8 years.

    该模型表明,恶意URL的脚本与特殊字符比率(sscr)较低,而URL字符则相对“有序”或更单调。 此外,恶意URL可能具有5-9个月前过期的域名。 我们还知道“恶意”问题,骗子会骗取过期合法域的所有权来分发可下载的恶意代码。 最后,良性URL的最大特色可能是寿命。 他们似乎在HTML正文内容中适度地调整了脚本与特殊字符的比例,具有更长的4-8年的域生存期。

    翻译自: https://towardsdatascience.com/predicting-the-maliciousness-of-urls-24e12067be5

    恶意url

    展开全文
  • 基于PU-Learning的恶意URL检测 原文作者:Ya-Lin Zhang, Longfei Li, Jun Zhou, Xiaolong Li, Yujiang Liu, Yuanchao Zhang, Zhi-Hua Zhou 原文会议:The ACM Conference on Computer and Communications Security ...

    基于PU-Learning的恶意URL检测

    原文作者:Ya-Lin Zhang, Longfei Li, Jun Zhou, Xiaolong Li, Yujiang Liu, Yuanchao Zhang, Zhi-Hua Zhou
    原文会议:The ACM Conference on Computer and Communications Security (CCS)
    原文链接: CCS’17 https://dl.acm.org/citation.cfm?id=3138825

    一、论文主要内容

    本文描述了一种基于PU-Learning(正例和无标注学习)的潜在恶意URL检测系统。以往的基于机器学习的解决方案是将它定义为有监督学习问题。然而在很多时候,我们所获得的数据总是包含少量已知的攻击URL以及大量的未标记样本,这使得有监督学习不可行。在这项工作中,我们将其定义为PU-Learning问题,并结合两种不同的策略(two-stage strategy and cost-sensitive strategy)。

    实验结果表明,我们所开发的系统能够有效地发现潜在的恶意URL攻击。该系统既可以作为现有系统的辅助部署,也可以用来帮助网络安全工程师有效地发现潜在的攻击模式,使他们能够快速更新现有的系统。

    二、作者工作

    2.1 相关工作

    传统的URL攻击检测系统主要通过使用黑名单或规则列表。而这些名单将变得越来越长,但是以这些方式防范所有的攻击是不现实的。更严重的是,这些方法难以检测潜在的威胁,这使得网络安全工程师很难有效地发现新出现的恶意URL攻击。

    为了提高算法的泛化能力,很多研究人员采用基于机器学习的方法来完成这项任务。这些方法主要分为两类:大多数转化为有监督学习问题,则需要对数据进行标注,而其他的一些研究人员则试图以无监督的方式解决问题,例如通过异常检测技术,就不需要对数据进行标注。

    在更多时候,我们可能只得到一小部分恶意URL和大量未标记的URL样本,缺乏足够可靠的负例样本,这也就意味着我们并不能直接使用上述的机器学习算法。另一方面,如果我们简单地以无监督的方式解决它,那么已知恶意URL的标注信息就难以充分利用,可能无法达到令人满意的性能。

    2.2 模型设计

    设计思想

    在本文中,我们将上述问题抽象为PU-Learning(正例和未标记学习)问题,它可以更充分地利用所检测到的恶意URL以及未标记的URL,并实现了更强的性能。

    基于此,我们开发了一个基于PU-Learning的潜在恶意URL攻击检测系统。有许多策略可以用来处理PU学习问题,如two-stage strategy、cost-sensitive strategy等。在这项工作中,我们将two-stage strategy、cost-sensitive strategy结合起来构建我们的系统。最后,我们对所开发的系统进行了验证评估,结果表明该方法能有效地发现潜在的恶意URL攻击,大大降低了网络安全工程师的工作量,使其在实际的URL攻击检测中非常有用。

    具体实现

    系统主要包括3个模块:

    • 特征提取,将原始URL转换成特征向量;
    • 模型训练,利用所提取的URL训练集的特征向量,采用基于logistic回归的方法来训练PU-Learning模型;
    • 预测,预测输入的URL以及输出可能的恶意URL集。

    特征提取

    首先将原始URL转换为特征向量表示,以便于应用到后续的机器学习算法中。下面,简要地解释我们所开发的系统,并介绍我们在系统中使用的特征提取过程的细节。

    img

    img

    一般来说,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维特征向量。

    模型训练

    PU-Learning是半监督学习的一种特殊情况,它用于解决只提供正例和未标注样本而不提供负例的问题。研究人员已经提出了许多策略来解决这个问题。

    为了绕过缺乏负标注的问题,two-stage策略首先试图挖掘出一些可靠的负例,然后将问题转化为一个传统的监督和半监督学习问题。另一方面,用于二分类的cost-sensitive策略由于具有不对称的误分类成本,因此非常适合用于解决PU-Learning问题。在我们开发的系统中,这两种策略都被采用并进一步结合形成最终的预测模型。

    • two-stage strategy:在第一阶段从未标记实例中选择可靠的负例,算法1显示了相关的细节。在第二阶段,利用正例和第一阶段选择的负例,训练传统的监督模型,并进一步用于预测新样本。

      考虑到效率,我们采用Logistic回归来训练分类模型。

    img

    • cost-sensitive strategy:我们假设在未标注样本只有少量正例。将所有未标注样本设定为负例,最小化以下目标函数:

      img

      其中C+和C-分别是正例和负例误分类的惩罚因子;l(yi,f(xi))表示损失函数,例如log损失函数或hinge损失函数;λ是归一化系数,R(w)是归一化范数,例如L1-范数、L2-范数。

      本文中,我们将损失函数设置为log损失函数,将L2-范数作为归一化范数。因此具体的函数如下:

      img

      其中LL(z)=log(1+exp(-z))就是log损失函数,在实际中,C+和C-是基于验证集选取的,并且C+总是大于C-,这表明正例误分类的惩罚因子要大于负例误分类的惩罚因子。这也就使得模型将更关注于对恶意URL的正确分类。

    预测

    在预测阶段,一个新输入的URL首先将在特征提取模块被转换为(n + 1)∗8维特征向量,然后所提取的特征向量将送入一个双策略模型,每个模型都将输出一个分数表示恶意URL的概率。得分越高,这个URL就越有可能是恶意的。我们把两个分数平均作为URL的最终得分,选择具有较高分数的URL构造为候选恶意URL集。

    在工程实践中,我们会基于候选恶意URL集过滤K个URL,这些过滤的URL将由网络安全工程师进行人工验证。

    三、实验

    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集发现了新的攻击模式,而蚂蚁金服的网络安全工程师已经通过这个发现改进了现有系统。同时,开发的系统还可以与现有系统协同使用,提高整体的网络安全水平。

    img

    四、总结

    在这项工作中,我们开发了一个基于PU-Learning的潜在恶意URL检测系统。与基于监督学习的方法相比,我们的方法只需要少量恶意URL以及未标注URL,而这正好适合我们遇到的实际情况。

    该系统的优点利用了两种策略来辅助训练分类模型,并且实验数据量大,保证了模型的有效训练,而模型采用的逻辑回归算法是一种较为简单的机器学习模型,也许可以用其它机器学习算法实验对比,不过可能面对大量数据需要更多训练时间。

    展开全文
  • 基于机器学习的恶意URL识别 原文作者:李泽宇,施勇,薛质 原文期刊:信息安全与通信保密杂志社 选自《通信技术》2020年第二期 2020-03-10 原文链接:https://www.secrss.com/articles/17764 一、论文主要内容 对...

    基于机器学习的恶意URL识别

    原文作者:李泽宇,施勇,薛质

    原文期刊:信息安全与通信保密杂志社 选自《通信技术》2020年第二期 2020-03-10

    原文链接:https://www.secrss.com/articles/17764

    一、论文主要内容

    对多种机器学习模型特别是集成学习模型在恶意URL识别问题上的效果进行研究,结果表明,集成学习方法在召回率、准确率、正确率、F1值、AUC值等多项指标上整体优于传统机器学习模型,其中随机森林算法表现最优。可见,集成学习模型在恶意URL识别问题上具有应用价值。

    本文提出了一种特征选取方法,尝试多种机器学习模型,特别是几种近年来较为流行的集成学习模型,比较不同模型在同一测试集上的效果。

    二、作者工作

    2.1 相关工作

    恶意URL识别最传统的方法是黑名单方法,即将已知的恶意URLs建立黑名单,并通过多种手段进行维护,从而根据黑名单直接判断待检测URL是否为恶意。该方法简单直接,查准率高,但只能识别已有的恶意URL,查全率低,时效性差。在此基础上,一些启发式算法和基于网页内容的方法被提出,是黑名单方法的改进,但依然存在准确率低、规则制定难等问题。

    近年来,随着人工智能的发展,机器学习方法被应用于恶意URL检测,包括逻辑回归、支持向量机等。机器学习的特征提取和模型选择,很大程度上决定了最终检测效果的好坏。

    2.2 模型设计

    设计思想

    本文提出了一种特征选取方法,尝试多种机器学习模型,特别是几种近年来较为流行的集成学习模型,比较不同模型在同一测试集上的效果。第1章介绍实验的整体流程,包括数据集的获取、特征选择、模型选择和训练;第2章给出不同模型的实验结果,并进行对比分析;第3章对实验作出总结。

    具体实现

    本实验由数据获取、特征选取、特征计算、模型训练以及结果分析等环节构成,流程下图所示。

    img

    特征提取:

    通过分析1.2中所述恶意URL数据集,可以发现恶意URL往往具有某些共性。基于这些共性可以提取相关的特征,进而用于机器学习模型的训练。这里以URL长度这一特征为例,说明数据分析和特征选取的方法。

    观察大量恶意URL数据可以发现,攻击者常常使用很长的URL,试图掩盖URL中可疑的部分。例如:

    https://greatertuckertonfoodpantry.org/wp-users/?id=EgjC8KkaZh&email=renaud.chambolle。

    为从数据角度证实这一观点,分别画出恶意/良性URL的长度分布曲线,见下图。从下图可以较为直观地看出,恶意URL的平均长度更大,两类URL的长度分布存在明显差异。因此,URL的长度可以作为构建分类模型的一个重要特征。

    img

    经试验,最终总结出的重要特征如下表所示。

    img

    模型训练:

    集成学习的基本思想是先训练若干个弱分类器,再通过某种串行或并行方式将这些弱分类器组合起来,从而达到提高预测准确率的效果。基于组合方法和弱分类器的不同,有多种不同的集成学习模型。实验中选取几种最具代表性的集成学习算法进行研究,包括梯度提升算法(Gradient Boosting)、AdaBoost、随机森林(Random Forest)和XGBoost。

    在集成学习算法以外,实验还选取了几种经典的机器学习算法,包括决策树(Decision Tree)、朴素贝叶斯(Gaussian NB)和逻辑回归(Logistic Regression),以进行对比研究。

    三、实验

    3.1 实验数据

    • 对恶意URL,实验从知名反钓鱼网站PhishTank使用爬虫获取经认证的恶意URL共计20 954条。

    • 对良性URL,实验从流量统计网站Alexa获取访问量排行前100万的所有网址,保留其中排名前1 000的网址,1 000至100万名的网址按一定比例进行抽样,共计获得18 900条良性URL。

    • 考虑到PhishTank提供的恶意URL仅包含钓鱼网站,实验还参考了开源数据集ISCX-URL-2016获取包括钓鱼、垃圾邮件、病毒等多种类型的恶意URL作为补充。

    将上述渠道获得的URL进行汇总、去重,得到实验最终使用的数据集,共包含76 446条数据。其中,恶意URL共计22 808条,占比29.8%;良性URL共计53 638条,占比70.2%,数据示例如下表所示。

    img

    其中,标签为“1”表示该URL为恶意URL,标签为“0”表示该URL为良性。

    3.2 实验结果

    评估方法

    实验将1.2中所述数据集进行划分,随机抽取其中20%作为测试集,其余作为训练集和交叉检验集。测试集共包含15 290条训练数据,将恶意URL作为正样本,良性URL作为负样本。

    评价分类模型好坏的常见指标有准确率(Precision)、召回率(Recall)、正确率(Accuracy)和F1值(F1-score)。由于恶意URL往往具有严重威胁,在对比各模型好坏的过程中,优先考虑召回率,其余指标作为参考。各常见指标的含义或计算方法如下表所示。

    img

    此外,为了更直观地对比各模型的好坏,绘制各模型的受试者工作特征曲线(Receiver Operating Characteristic Curve,ROC)并进行对比。

    ROC曲线的横坐标为假阳性率(False Positive Rate,FPR),纵坐标为真阳性率(True Positive Rate,TPR),描述了在一定制约下模型所能达到的预测准确率。真/假阳性率的定义为:

    img

    ROC曲线下面积(Area under ROC Curve,AUC)是指ROC曲线与横坐标轴围成的面积大小。AUC值越大,代表模型的分类效果越好。

    AUC值受正负样本分布变化的影响较小。实验使用的数据集与真实情景下正负样本的分布可能差异较大,因此AUC值是一项重要的评估指标。

    结果分析

    为控制无关变量,各模型训练时的迭代次数均采用默认参数,其余训练参数简单调优或使用默认值。

    各模型的实验指标由下表列出,其中每一项的最优值用*标明。

    img

    实验结果表明,集成学习算法的整体表现优于传统机器学习算法。其中,梯度提升算法(Gradient Boosting)有最高的预测准确率,而XGBoost算法有最高的正确率,随机森林算法(Random Forest)在召回率、F1值、AUC值3项指标上均为最优。综合来看,随机森林算法是研究算法中解决恶意URL识别问题的最优模型。

    在传统机器学习算法方面,决策树算法(Decision Tree)表现尚可,而朴素贝叶斯算法(GNB)和逻辑回归算法(Logistic Regression)则表现不佳。此外,不同机器学习模型的ROC曲线如下图所示。

    img

    由ROC曲线得到的结论类似,即在解决恶意URL识别问题上,集成学习方法的整体表现优于传统机器学习方法。

    四、总结

    实验结果表明,集成学习方法在恶意URL识别问题上的效果优于传统机器学习模型。其中,随机森林算法综合表现最优,能够达到76.26%的召回率和95.88%的准确率,表明集成学习方法在恶意URL的识别领域具有应用价值。

    本文使用的数据集规模偏小(76 446条数据),在训练集成学习模型时会出现过拟合等问题。预期随着训练数据的扩充和硬件水平的提高,集成学习方法在恶意URL识别问题上能够取得更好的效果。

    参考文章:
    安全内参 https://www.secrss.com/articles/17764

    展开全文
  • 恶意URL数据集

    2021-04-20 16:42:25
    一些URL数据集的收集来源 1、https://openphish.com/feed.txt 2、https://ransomwaretracker.abuse.ch/blocklist/ 3、https://www.phishtank.com/ 4、 4、...
  • APUS 成立于2014年6月,其系统及产品集群全球总用户数突破14亿,是全球高速发展的互联网公司之一。...因此,在APUS浏览器中增加恶意URL检测功能显得格外重要。不仅如此,APUS浏览器应用团队表示“为了能够长期、持
  • 通过机器学习识别恶意url

    万次阅读 2017-08-11 12:06:16
    利用机器学习【逻辑回归,svm】判断url是否为恶意 环境:Python3
  • 恶意URL检测

    千次阅读 2014-02-25 17:28:01
    https://www.virustotal.com
  • tomcat如何拦截恶意url

    2015-11-16 06:34:58
    http://localhost:8080/ddd/&(aaa)((%27%5c043context%5b%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27%5d%5c075%5c043foo%27)(%27%5c043foo%5c075false%27))&(%27%5c043_memberAccess%5b%5c%27...
  • 基于机器学习算法识别恶意url

    千次阅读 2018-12-10 13:27:56
    然而在现实环境中,由于攻击方式的多样性,很难获得覆盖全面的恶意攻击url数据集,导致在面对零日攻击这类比较新的攻击url具有一定的脆弱性。 此外本次课题由于硬件的限制,样本数据集还没有到达百万集,准确度会受...
  • 山石网科技术团队受邀在Blackhat Asia 2017上发表演讲,以下为论文简介: ...在这里,我们提出一个新颖的基于URL恶意软件检测方法行为建模。该方法利用实践中常见的恶意软件代码重用的现象。基于大数据...
  • from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf import numpy as np import pandas as pd import keras ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,257
精华内容 24,902
关键字:

恶意url