20199131《网络攻防实践》综合实践

20199131《网络攻防实践》综合实践

1.论文复现

1.1 论文题目

Freezing the Web: A Study of ReDoS Vulnerabilities in JavaScript-based Web Servers

1.2 Abstract

正则表达式拒绝服务(ReDoS)是一类算法复杂性攻击,在这种攻击中,它的原理就是将正则表达式与攻击者提供的输入进行匹配需要的时间变得更长来达到拒绝服务。

  • 整体介绍
    (1)这篇论文对现实世界中的web站点中的ReDoS漏洞进行了大规模的研究
    (2)作者研究的基于是一种分析部署服务器可利用性的新方法
    (3)最后的结果是呼吁arms开发检测和缓解JavaScript中ReDos漏洞的技术

1.3 Introduce

  • 正则表达式介绍
    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。现在,正则表达式已经广泛应用于各种软件中。
    例如:/ [1-9 ] [0 -9 ] ? /
    这个正则表达式可以匹配1~99 的正整数
    其中:
    [1-9]表示可以匹配到1到9的数字
    “? “: 匹配前面的子表达式零次或一次。
    目前正则表达式引擎主要有两种:NFA和DFA
    JavaScript 采用的是NFA 引擎
    NFA是指Nondeterministic Finite Automaton,非确定有限状态自动机。
    DFA 是Deterministic Finite Automaton,确定有限状态自动机。

  • 有限状态机
    状态机中有这样一些要素,对照下图分别说下:
    •开始状态:圆圈表示状态,被一个“没有起点的箭头”指向的状态,是开始状态,例中是S1
    •最终状态:也叫接受状态,图中用双圆圈表示,这个例子中也是S1
    •输入:在一个状态下,向状态机输入的符号/信号,不同输入导致状态机产生不同的状态改变
    •转换:在一个状态下,根据特定输入,改变到特定状态的过程,就是转换
    所以有限状态机的工作过程,就是从开始状态,根据不同的输入,自动进行状态转换的过程。

    上图中的状态机的功能,是检测二进制数是否含有偶数个0。从图上可以看出,输入只有1和0两种。从S1状态开始,只有输入0才会转换到S2状态,同样S2状态下只有输入0才会转换到
    | S1。所以,二进制数输入完毕,如果满足最终状态,也就是最后停在S1状态,那么输入的二进制数就含有偶数个0。

  • NFA和DFA
    在这个图里,可以看到,在状态1 这里,如果输入a,其实有两种可能,如果后面的符号是b,那么可以匹配成功,后面符号是c 也能匹配成功。所以状态机在执行过程中,可能要尝试所有的可能性。在尝试一种可能路径匹配失败后,还要回到之前的状态再尝试其他的路径,这就是“回溯”。
    但是DFA 消除了这种不确定性,所以可以想到,DFA的执行性能应该要比NFA 更好,因为不需要回溯。

  • 正则表达式常见应用
    (1)验证用户名和密码:("[1]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
    (2)验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
    (3)验证手机号码:(包含虚拟号码和新号码段):"^1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}$";
    (4)验证身份证号:(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}(\d|X|x)";
    (5)验证Email地址:("^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$");

  • ReDos攻击
    这篇论文主要是探讨的正则表达式的性能方面,而性能又是主要体现在将字符串与正则表达式匹配所需的时间。给定一个精心设计的输入,与一个次优设计的正则表达式进行匹配很容易需要几分钟甚至几个小时。
    ReDos攻击
    例如,在一台标准计算机的Node.js JavaScript平台上,用看起来无害的正则表达式/(a +)+ b /去匹配30个“a”字符,大约需要15秒;但匹配35个“a”的序列字符已超过8分钟,即时间成倍爆炸。
    如果服务器实现遇到此类性能问题,则攻击者可以利用此漏洞以难以匹配的输入攻击服务器。此攻击称为正则表达式拒绝服务或简短的ReDos。

1.4 Background

  • ReDos漏洞
    基于回溯的搜索可能会导致算法回溯很多次。ReDos攻击就是利用这些特性。例如,对于正则表达式/a*a*b$/,图3.1是它的自动机,并且输入字符串为“aaa”。每个字符“a”可以使用两个转换进行匹配,即4→5和8→9。在每个步骤中,算法都需要决定使用这两个转换中的哪一个。最后,由于输入字符串中没有字符“b”,当到达状态11时,算法将最终走向失败。然而,在得出输入字符串与模式不匹配的结论之前,该算法尝试了所有可能的匹配“a”字符的方法。这个例子是一个超线性复杂度的正则表达式,因为匹配期间的转换次数是输入大小的二次方。其他正则表达式甚至具有指数复杂性,例如像这种嵌套重复的表达式:/(a)b$/

    在本文的研究中,已经识别了这两种类型的ReDos漏洞,并表明这两种漏洞对于服务器端JavaScript都很重要。
  • 服务端JavaScript
    服务器端Node.js节点平台提倡使用异步I/O调用的单线程、基于事件的执行模型。
    在Node.js节点,执行的主线程运行一个事件循环,称为主循环,用于处理由网络请求、I/O操作、计时器等触发的事件。缓慢的计算(例如,将字符串与正则表达式匹配)会减慢所有其他传入请求的速度。
    与多线程Web服务器(例如Apache)相比,单线程执行模型使JavaScript中的问题更加复杂。
    正则表达式: /(a+b)/

1.5 Methodology

  • 方法论

    图4.1显示了方法论的高级概述。作者通过在作者控制下的机器和现场网站上进行的实验来解决前面所提到的两个挑战。

(1)解决第一个挑战的主要思路是在流行的JavaScript库中使用以前未知的漏洞,并推测服务器如何使用这些库。更准确地说,我们通过分析第三方库一节点包管理器模块,以发现可通过HTTP请求利用的漏洞。然后我们假设服务器实现如何使用这些包并为这些场景创建漏洞。
(2)为了解决第二个挑战,我们提出了一种技术,测试一个站点是否易受攻击,但该测试不会在相当长的时间内阻塞该站点。基本思想是从很小的有效负载开始,这些负载不需要比正常的Web请求更多的计算时间,然后慢慢增加有效负载至足够长,足以使攻击者确信如果攻击者使用较大的有效负载,则可以利用该站点。

  • 发现库中的ReDos漏洞
    如果通过构造线性增长的输入,从而导致表达式的匹配时间超线性增长,那么我们认为存在有ReDos漏洞。
    为了识别以前未知的漏洞,论文使用自动和手动分析相结合的方法,提取易受攻击的正则表达式
    1.首先,我们下载10,000个最受欢迎的模块,并通过遍历JavaScript代码的抽象语法树来提取其正则表达式。
    2.接着,删除不包含重复项的正则表达式。
    3.最后,半自动搜索已知易受攻击的正则表达式,这样我们就提取出了易受攻击的正则表达式。

给定一组可能被利用的正则表达式,我们手动检查使用正则表达式的上下文。其目标是找到可以通过HTTP请求传递到web服务器的数据上的匹配操作(相应的正则表达式)。为此,我们重点关注(i)Express框架中包含的模块,(ii)扩展该框架的中间件模块,以及(iii)操作HTTP请求组件(如主体或特定头)的模块。对于这些模块中的正则表达式,我们只保留那些有可能从包接口或从HTTP头到正则表达式的数据流的正则表达式。

  • 利用漏洞
    也就是利用这些web服务器的npm模块的ReDos漏洞发起攻击,其主要思想是假设服务器端Web应用程序可能如何使用模块。
    在利用漏洞攻击时,我们假设最大头大小为81750个字符,如果我们成功地构建了一个需要5秒以上的输入,我们会认为该漏洞是可利用的,并在剩下的研究中考虑它。
    为了进一步评估漏洞攻击的影响,我们将测量处理精心编制的输入所需的时间,与相同长度的随机字符串相比。我们用两种方法来测量时间。首先,我们测量正则表达式的匹配时间,即检查字符串是否与正则表达式匹配所需的时间。其次,我们测量整个HTTP请求的时间,称为响应时间。
  • 缓解技术分析
    有些站点拒绝带有大标题的请求,而返回“400错误请求”错误。这种缓解可以限制ReDos攻击的伤害。
    为了度量站点是否使用这种缓解技术,作者创建不同大小的良性请求,并度量站点拒绝请求的频率。

1.6 Results

  • 漏洞和攻击
    下图显示了他们找到这些模块至少有一个易受攻击的正则表达式可以通过模块的接口进行攻击。
    作者在执行实验时,每个漏洞都在处理包的最新版本。这些包在依赖项和下载的数量上有所不同,但我们可以安全地得出结论,即使在非常流行的包中也存在ReDos漏洞。

    下图显示了我们可以为其创建攻击的模块和使用场景
    最后一列显示了使用场景的JavaScript的实现样例

  • 匹配时间
    使用这些漏洞来衡量输入对易受攻击表达式匹配时间的影响

  • 可用性
    显示了前25个“/echo”请求在受害者计算机上测量的响应

  • 响应时间与匹配时间
    响应时间与匹配时间两个时间测量值之间的关系,两次测量之间的相关性为0.99,即非常强

  • 尺寸利用
    显示了每个目标时间和易受攻击模块的值

  • 特定脆弱性的普遍性
    响应时间与匹配时间两个时间测量值之间的关系,两次测量之间的相关性为0.99,即非常强。

  • 受欢迎程度的影响
    显示了每个目标时间和易受攻击模块的值

  • 有效性威胁
    为每个漏洞绘制了有多少网站接受给定大小的负载

1.7 Discussion

与常规DoS攻击相比,ReDos漏洞使攻击者能够使用较少的资源发起攻击。如第4.3节所示,即使我们识别出的危害最小的漏洞在作为大规模DoS攻击的一部分使用时也可能是致命的武器,因为攻击者可以根据漏洞发送挂起循环数百毫秒、几秒甚至更多的有效负载。
只要8个标准攻击向量,我们就可以影响数百个网站。值得再次强调的是,在传统的基于线程的web服务器(如Apache)中,这个问题不会那么严重。这是因为匹配将在为单个客户机服务的线程中完成。总之,在基于事件的系统中,匹配是在主循环中完成的,花费几秒钟来匹配正则表达式相当于在这段时间内完全阻塞服务器。

1.他们讨论Node.js节点并将算法复杂度攻击确定为其主要威胁之一,进一步观察,发现ReDos会影响到真正的网站;
2.先前工作分析正则表达式的最坏匹配时间。这项工作的大部分假设是反向跟踪样式匹配,并单独分析正则表达式,忽略攻击者控制的输入是否到达正则表达式。考虑到这一点。他们将静态分析和漏洞生成结合起来,发现了Java软件中的41个漏洞;
3.正则表达式通常用于清理程序和XSS筛选器。贝茨等人。显示XSS筛选器通常速度慢、不正确,有时甚至会引入新的漏洞。他们分析了这个问题对现实世界网站的影响。为了避免正则表达式中的错误,开发人员可以综合而不是编写它们;
4.平均性能和最坏性能之间的差异是算法复杂度攻击的基础。Crosby和Wallach分析了由于哈希表和二进制树的性能而导致的漏洞,而Dietrich等人。研究与序列化相关的攻击。Wise、SlowFuzz和PerfSyn生成输入以触发意外的高复杂性;
5.SAFER静态检测涉及递归调用和循环的CPU和堆栈耗尽漏洞。Huang等人研究Android系统中的阻塞操作,这些操作可以在多次调用时强制操作系统重新启动。Shan等人考虑对n层web应用程序的攻击,并使用排队网络模型对其建模;
6.从软件测试的角度研究了生成正则表达式输入的问题;
7.现有的工作问题研究了Java脚本性能问题并提出了识别这些问题的分析技术;
8.劳英格等人。研究使用过时且存在已知漏洞的客户端JavaScript库;Richards等人的研究分析JavaScript的eval函数的使用,该函数易于代码注入。

3.实践总结

从看到这这篇论文开始,我是因为这篇论Web相关,所以很感兴趣选择的这篇论文作为我网络攻防大作业复现的论文,由于之前没有读过英文文献,所以看起英文文献来也很吃力,有很多专有名词也需要自己去另外在网上查找,最开始看的几遍花费了很久的时间,但是连论文都没有看懂,后面我尝试着从一个点去深入理解,然后以此类推,每个点都这样的去学习,最后这篇论文我也算是大概有了自己的理解,实属不易。总的来说,这篇论文的学习给了我很大的收获,不管是英文文献的阅读上还是论文所提到的专业知识像ReDos漏洞的产生、危害等,我都有了一个深入的学习。
随着总结的写完,这个网络攻防课程也就彻底结束了,这学期虽然在这门课上面花费的时间比较多,但同时也是学到的东西最多最广的一门课,也让我感受了自主学习的氛围以及好处,我认为确实应当如此,老师很负责任,周围同学也有很优秀的,这门课给了我太多体验。最后,感谢王老师!感谢给我学习上帮助的同学!


  1. a-z A-Z ↩︎

posted @ 2020-07-03 12:30  李磊20199131  阅读(338)  评论(0编辑  收藏  举报