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

图片

几十年来,攻击检测已成为信息安全的一部分。 第一个已知的入侵检测系统(IDS)的实现可以追溯到1980年代初。

如今,整个攻击检测行业都存在。 有许多种产品(例如IDS,IPS,WAF和防火墙解决方案),其中大多数提供基于规则的攻击检测。 使用某种统计异常检测来识别生产中的攻击的想法似乎并不像过去那样现实。 但是这个假设是合理的吗?

Web应用程序中异常的检测


1990年代初,市场上出现了第一批专门用于检测Web应用程序攻击的防火墙。 从那时起,攻击技术和保护机制都发生了巨大的变化,攻击者争先一步。

当前,大多数Web应用程序防火墙(WAF)都试图以相似的方式检测攻击,并在某种类型的反向代理中嵌入了基于规则的引擎。 最突出的示例是mod_security,它是2002年创建的Apache Web服务器的WAF模块。基于规则的检测有一些缺点:例如,即使这些相同的攻击,它也无法检测到新颖的攻击(零时差)。可能很容易被人类专家检测到。 这个事实不足为奇,因为人脑的工作方式不同于一组正则表达式。

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

  • SQL注入
  • 跨站点脚本
  • XML外部实体注入
  • 路径遍历
  • 操作系统命令
  • 对象注入

但是首先让我们问自己:一个人会怎么做?

人们在看到一个请求时会做什么?


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

图片

如果必须检测发送到应用程序的恶意请求,则很可能需要观察一段时间的良性请求。 在查看了许多应用程序执行端点的请求之后,您将对安全请求的结构及其包含的内容有一个大致的了解。

现在,向您显示以下请求:

图片

您立即发现有些问题。 这需要花费更多时间来了解确切的含义,并且一旦找到异常的请求的确切部分,就可以开始考虑它是什么类型的攻击。 本质上,我们的目标是使攻击检测AI以类似于人类推理的方式解决问题。

使我们的任务复杂化的是,即使乍一看似乎有些恶意,但某些流量对于特定网站实际上可能是正常的。

例如,让我们看一下以下请求:

图片

这是异常吗? 实际上,此请求是良性的:这是与Jira错误跟踪器上的错误发布相关的典型请求。

现在让我们看一下另一种情况:

图片

最初,请求看起来像是在由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注入”标签-现在呢? 您,最重要的是,您的客户(第一个看到警报的人,通常不是Web攻击专家)必须猜测该模型认为请求的哪一部分是恶意的。

牢记这一点,我们还是决定尝试分类。

由于HTTP协议基于文本,因此很明显,我们不得不研究现代文本分类器。 众所周知的示例之一是IMDB电影评论数据集的情感分析。 一些解决方案使用递归神经网络(RNN)对这些评论进行分类。 我们决定使用类似的RNN分类模型,但有一些细微差异。 例如,自然语言分类RNN使用单词嵌入,但是不清楚像HTTP这样的非自然语言中存在哪些单词。 这就是为什么我们决定在模型中使用字符嵌入的原因。

现成的嵌入与解决该问题无关,这就是为什么我们使用带有几个内部标记(例如GOEOS)的简单字符映射到数字代码的原因。
在完成模型的开发和测试后,先前预测的所有问题都过去了,但是至少我们的团队已经从闲置的沉思变成了富有成效的事情。

我们如何进行


从那里开始,我们决定尝试使模型的结果更易于解释。 在某些时候,我们遇到了“注意力”机制,并开始将其整合到我们的模型中。 这产生了一些令人鼓舞的结果:最终,一切都融合在一起,我们得到了一些人类可以解释的结果。 现在我们的模型不仅开始输出标签,而且还输出输入的每个字符的注意力系数。

如果可以将其可视化,例如,在Web界面中,我们可以为发现“ SQL Injection”攻击的确切位置着色。 这是一个令人鼓舞的结果,但是其他问题仍然没有解决。

我们开始发现,朝着注意力机制的方向发展,而不是远离分类,我们可以从中受益。 在阅读了有关序列模型的大量相关研究(例如,“注意力全是您需要的”,Word2Vec和编码器-解码器体系结构)之后,通过对我们的数据进行实验,我们能够创建一个能够在以下情况下工作的异常检测模型:与人类专家大致相同。

自动编码器


在某个时候,很明显,序列到序列的自动编码器最适合我们的目的。
序列到序列模型由两个多层的长短期记忆(LSTM)模型组成:编码器和解码器。 编码器将输入序列映射到固定维数的向量。 解码器使用编码器的此输出解码目标向量。

因此,自动编码器是一个序列到序列模型,将其目标值设置为等于其输入值。 这个想法是要教网络重新创建它所看到的东西,或者换句话说,近似一个身份函数。 如果给训练有素的自动编码器提供了异常样本,则由于以前从未见过这样的样本,很可能会以很高的误差重新创建它。

图片

代码


我们的解决方案由以下几部分组成:模型初始化,训练,预测和验证。
存储库中的大多数代码都是不言自明的,我们将仅关注重要部分。

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

图片

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

图片

然后解码器:

图片

由于我们试图解决异常检测,因此目标和输入是相同的。 因此,我们的feed_dict如下所示:

图片

在每个时期之后,将最佳模型保存为检查点,以后可以将其加载以进行预测。 为了测试目的,建立了一个实时Web应用程序并受该模型保护,以便可以测试实际攻击是否成功。

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

图片

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

图片

结果


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

图片

该模型的行为类似于人类:它仅学习发送到Web应用程序的“正常”用户请求。 它检测请求中的异常,并突出显示异常中请求中的确切位置。 我们针对测试应用程序的攻击评估了此模型,结果似乎很有希望。 例如,上一个屏幕快照描述了我们的模型如何检测到SQL注入跨两个Web表单参数的情况。 由于攻击有效载荷是通过几个HTTP参数传递的,因此此类SQL注入是分散的。 基于经典规则的WAF在检测零碎的SQL注入尝试方面做得很差,因为它们通常自己检查每个参数。

模型的代码和火车/测试数据已作为Jupyter笔记本发布,因此任何人都可以重现我们的结果并提出改进建议。

结论


我们认为我们的任务非常艰巨:提出一种以最小的努力检测攻击的方法。 一方面,我们力求避免使解决方案过于复杂,并创建一种检测攻击的方法,就像通过魔术来学习,该攻击可以学会自己确定什么是好是坏。 同时,当(错误的)专家决定什么表示攻击而什么不表示攻击时,我们希望避免人为因素带来的问题。 因此,总体而言,具有Seq2Seq架构的自动编码器似乎可以很好地解决我们检测异常的问题。

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

请务必注意,此方法不是可用于生产的版本。 我们无法透露如何在实际产品中实施此方法的详细信息。 但是,我们会警告您,不可能仅接受这项工作并“插入”。 我们作出此警告是因为在GitHub上发布后,我们开始看到一些用户试图在自己的项目中简单地批量实现我们当前的解决方案,但结果却不成功(且不足为奇)。

概念证明可在此处 (github.com)获得。

作者:Alexandra Murzina( murzina_a ),Irina Stepanyuk( GitHub ),Fedor Sakharov( GitHub ),Arseny Reutov( Raz0r

进一步阅读


  1. 了解LSTM网络
  2. 注意和增强递归神经网络
  3. 注意就是您所需要的
  4. 注意就是您所需要的(带注释)
  5. 神经机器翻译(seq2seq)教程
  6. 自动编码器
  7. 神经网络的序列到序列学习
  8. 在Keras中构建自动编码器

Source: https://habr.com/ru/post/zh-CN441030/


All Articles