使用Seq2Seq自动编码器检测Web攻击 | xxx使用Seq2Seq自动编码器检测Web攻击 – xxx
菜单

使用Seq2Seq自动编码器检测Web攻击

三月 5, 2019 - MottoIN

攻击检测一直是信息安全的一部分。已知的首个入侵检测系统(IDS)可追溯到20世纪80年代初,而如今其存在于整个攻击检测行业。

检测产品有许多类型,如IDS、IPS、WAF和防火墙等,其中大多数都提供基于规则的攻击检测。使用统计异常检测在生产中识别攻击的想法已然不够现实,但这个假设是否合理?

Web应用异常检测

20世纪90年代初,市场上出现了第一批用于检测Web应用程序攻击的防火墙。从那时起,攻击技术和保护机制都发生了巨大演变,而攻击者总是力争领先一步。

当前大多数Web应用程序防火墙(WAF)都试图以在反向代理中嵌入在某种基于规则的引擎或类似方式来检测攻击,典型的例子如2002年创建的Apache Web服务器的WAF模块“mod_security”。基于规则的检测有一些劣势:无法检测到新型攻击(0day),即使这些攻击可能很容易被人类专家检测到,但这也可以理解,因为人类大脑与一组正则表达式的工作方式完全不同。

从WAF的角度来看,攻击可以分为基于顺序的(时间序列)和由单个HTTP请求或响应组成的攻击。本文的研究重点是检测后一类攻击,包括:

SQL注入

跨站脚本

XML外部实体注入

路径遍历

操作系统指挥

对象注入

首先要考虑的是,我们人类会怎样做到这一点?

看到单一请求时,人类会做什么?

看一下对某应用程序的常规HTTP请求示例:

如果必须检测向应用程序发送的恶意请求,极有可能你会希望暂时观察良性请求。在查看了许多应用程序执行端点的请求后,你大致就能了解安全请求结构及其包含的内容。

现在你会看到以下请求:

你马上就会知道出了什么问题,需要更多的时间来了解究竟是什么,一旦锁定了异常请求的确切部分,就可以开始考虑是什么类型的攻击。本质上讲,我们的目标是让我们的攻击检测AI以类似于人类推理的方式解决问题。

但有些流量看上去恶意、但对特定网站来说可能是正常的,这又让任务变得复杂。如以下请求:

实际上,该为良性请求:这是与Jira bug跟踪器上bug发布有关的典型请求。

另一个案例:

乍一看像由Joomla CMS网站的典型用户注册请求,然而请求操作是“user.register”而非正常的“registration.register”。前个选项已弃用的、包含一个允许任何人以管理员身份注册的漏洞。

此漏洞被称为“Joomla <3.6.4帐户创建/权限提升”(CVE-2016-8869,CVE-2016-8870)。

如何开始

首先看一下以前的研究,因过去几十年已经进行了许多尝试来创建不同统计或机器学习算法、检测攻击,最常用的方法之一是解决分配给类的任务(良性请求、SQL注入、XSS、CSRF等)。虽然通过对给定数据集分类,可获得相当高的准确度,但该方法无法解决一些非常重要的问题:

1.类集的选择。如果在学习期间的模型有三个类(良性、SQLi、XSS),但在生产中遇到CSRF攻击甚至是全新的攻击技术会怎么样?

2.这些类别的含义。假设需要保护10个客户,每个客户都运行完全不同的Web应用程序。大多数人来根本不知道针对他们应用程序的单一“SQL注入”攻击是怎样的,这意味着必须以某种方式人为地构建学习数据集-最终将从与实际数据完全不同的分布数据中学习。

3.模型结果的可解释性。带“SQL注入”标签模型-非网络攻击专家客户第一个看到警报,但对哪部分为模型视为恶意的请求必须自行猜测。

了解这些后,我们还是决定要尝试一下分类。

鉴于HTTP是基于文本的协议,所以需要看现代文本分类器。典型的例子如对IMDB电影评论数据集的情绪分析。一些解决方案使用递归神经网络(RNN)来对这些评论进行分类。我们决定使用类似的RNN分类模型,如自然语言分类RNN使用单词嵌入,但并不知道HTTP这样的非自然语言有哪些词,故而我们决定在模型中嵌入字符;现成的嵌入与要解决的问题无关,我们使用简单的字符映射到具有几个内部标记(如GO 和 EOS)的数字代码。完成模型的开发和测试后,之前预测的所有问题不一定都能实现,但至少从“想”转到了“做”上。

如何进行

我们想让模型结果更容易解释。有些时候我们会遇到了“关注”机制并开始将其整合到模型中,产生了一些可喜的结果:将一切都汇集、得到可解释的结果。之后我们的模型不仅开始输出标签,还输出所输入字符的注意系数。

如果可以在Web界面中将其可视化,我们可为找到“SQL注入”攻击的确切位置着色。这是一个很可喜的结果,而其他问题依然悬而未决。
我们可从注意机制的方向受益而不用进行分类。阅读了大量的序列模型相关研究(如:“注意就是你所需要的”,Word2Vec和编码器-解码器架构)、试验数据后,我们能创建一个或多或少与人类专家相同的异常检测模型。

自动编码

某些时候,序列到序列自动编码器最符合我们的目的。该模型由两个多层长短期记忆(LSTM)模型组成:一个编码器和一个解码器。编码器将输入序列映射到固定维度矢量上,解码器用编码器输出对目标矢量进行解码。

因此,自动编码器是一种序列到序列的模型,它将目标值设置为等于输入值。这一想法是教网络重新创建它已经看到的东西,换句话说,就是近似一个身份函数。如果所训练的自动编码器被给予异常样本,则很可能因未见过这种样本而以高度误差对其重新创建。

代码

我们的解决方案由几个部分组成:模型初始化、培训、预测和验证。

存储库中的大多数代码都一目了然,所以本文只关注重要的部分。

该模型初始化为Seq2Seq类的实例,该类具有以下构造函数参数:

之后,初始化自动编码器层。首先,编码器:

然后是解码器:

由于我们正尝试解决异常检测,因此目标和输入是相同的。因此,我们的feed_dict看起来如下:

在每个纪元之后,最佳模型被保存为检查点,稍后可以加载该检查点以进行预测。出于测试目的,由模型建立了实时Web应用程序且该程序受模型保护,这样便可测试攻击的成功与否。

受到注意机制的启发,我们尝试将其应用于自动编码器,但注意到从最后一层输出的概率在标记请求的异常部分时效果更好。

测试阶段,样品得到了非常好的结果:精度和召回率接近0.99。ROC曲线大约是1。

结果

我们描述的Seq2Seq自动编码器模型经证明能高精度检测HTTP请求中的异常。

这个模型像人一样:它只学习发送给Web应用程序的“正常”用户请求,检测请求中的异常并突出显示被视为异常请求的确切位置。针对测试应用程序的攻击对此模型评估,结果很有希望。如前面的屏幕截图描述了我们的模型检测到SQL注入如何跨两个Web表单参数分割。此类SQL注入是碎片化的,因攻击有效负载是在多个HTTP参数中提供的。基于规则的经典WAF在检测碎片SQL注入尝试方面表现不佳,因为它们通常会自行检查每个参数。

结论

一方面,我们试图避免以过度复杂的解决方案,并创建一种检测攻击的方法,学会自己决定什么是好、什么是坏。同时我们希望避免人为因素的问题。总体来说,采用Seq2Seq架构的自动编码器解决了检测异常的问题。

此外,我们还想解决数据可解释性的问题。在使用复杂神经网络架构时,很难解释特定结果。进行一系列转换时,确定决策背后的最重要数据几乎不太可能;而在模型重新思考对数据解释的方法之后,我们能够从最后一层获得每个字符的概率。


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51