论JS的漏洞

Server-side JavaScript
JavaScript是最流行的编程语言之一,但主要用于客户端任务。而Node.js的广泛应用使JavaScript开始应用到服务端。但一个主循环的计算请求会减慢所有的入请求,比如匹配指数级复杂度的正则表达式的字符串匹配会减慢所有的请求处理。因为在基于JavaScript的服务器中,正则表达式是在主循环中匹配的,所以针对基于JavaScript的服务器的ReDoS攻击造成的危害要比对多线程的web服务器造成的危害大很多。

使用的方法

在这里插入图片描述

npm分析

研究人员认为如果正则表达式的输入线性增长,匹配时间超线性增长,那么这个正则表达式就是有漏洞的。研究人员发现主流的npm模块中存在ReDoS漏洞。
首先,下载主流的模块并用JS代码的AST来提取正则表达式;
然后,通过查询数据库来找出有漏洞的特定模式;
创建漏洞利用
基于npm模块的ReDoS 漏洞,研究人员创建了利用这些模块的攻击web服务器的漏洞利用。主要思想是假设服务端web应用可能使用该模块。最后,建立一个快速安装并实现使用该模块的web应用例子。然后,创建用户控制数据可以到达有漏洞的正则表达式的HTTP请求,构造可以触发长匹配时间的输入值。
有漏洞的正则表达式:
例: content
/^([^\/]+\/[^\ s ;]+) (?:(?:\ s *;\s* boundary =(?: " ([^"
]+)" |([^; "]+) )) |(?:\ s*;\ s *[^=]+=(?:(?: " (?:[^ "
]+)") |(?:[^; "]+) )))*$/i
HTTP级的Payload创建
对每个payload,创建应用场景:
var MobileDetect = require ("mobile - detect ");
var headers = req . headers ["user - agent "];
var md = new MobileDetect ( headers );
md. phone ();
分析网站ReDoS漏洞影响
研究人员发现通过模块接口,有漏洞的正则表达式可以利用这些模块发现ReDoS攻击。每个漏洞都至少出现在一个包中,而不同包的依赖和下载数是不同的。

在这里插入图片描述

预防措施
首先,为了限制通过HTTP header传播的payload的效果,header的大小应该做出限制。这种方法可以缓解一些潜在攻击的效果,但对于与HTTP header相关的漏洞的效果是有限的。因为从网络接收的输入也可以被利用来进行攻击。
第二种预防机制是使用更复杂的正则表达式引擎,这些引擎应该确保线性匹配的时间。问题是这些引擎并不支持高级正则表达式特征,比如先行断言(lookahead)和后行断言(lookbehind)。Davis等人提出一种只调用回溯引擎的混合解决方案,Rust等语言也已经采用了这种方案。但这并不能完全解决该问题,因为一些含有高级特征的正则表达式仍可能含有ReDoS漏洞。研究人员建议Node.js给正则表达式API加一个timeout参数,如果某个匹配花费时间太长,那么Node.js就停止匹配。这也是一种易于实现和应用的方法。

结论

本文分析了基于JavaScript的web服务器的ReDoS漏洞,并说明该漏洞是影响主流网站的重要问题。研究人员在实验中共发现8个漏洞,影响超过339个主流网站。攻击者可以阻塞有漏洞的网站几秒钟甚至更长的时间。

本文来源于:https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-staicu.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值