什么是" RegExp DoS问题"?

时间:2016-10-17 10:36:11

标签: javascript node.js npm minimatch

我刚刚在服务器中安装了nodejs,基本npm install显示了很多这样的消息:

$ npm install
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated graceful-fs@2.0.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN prefer global node-gyp@3.4.0 should be installed with -g

请注意右侧显示的消息:

npm WARN ... or higher to avoid a RegExp DoS issue
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^

在我的本地服务器中,我已经在使用minimatch 3.0.3。但是,由于服务器没有使用最新版本的节点,这对我来说是新的,并开始调查:

此问题已在npm's github中报告,并在其他问题中提及。通常,它通过将minimatch的版本升级到至少3.0.2来解决。

但是,我想知道这个RegExp DoS问题是什么?是否有任何特定的正则表达式允许通过minimatch进行DoS攻击?我无法想象这会如何发生并且不想重现它,但我找不到更多文档,而minimatch's Github list of issues没有任何痕迹。

releases pages我看到the only commit for the 3.0.2 release,其中基本上正在封装正则表达式语法(我对JavaScript不够熟悉,无法完成最后一个细节)。

2 个答案:

答案 0 :(得分:6)

从您提交的链接到(https://github.com/isaacs/minimatch/commit/6944abf9e0694bd22fd9dad293faa40c2bc8a955):

提交中添加的测试正在制作这样的正则表达式:

var exploit = '!(' + genstr(1024 * 15, '\\') + 'A)'

即创建一个字符串,从'!('开始,然后创建1024 * 15个\副本,然后'A)'。这必须是DoS条件。

这一行

tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {

可能是令人窒息的。

答案 1 :(得分:4)

以下是OWASP的摘录:

  

正则表达式拒绝服务(ReDoS)是一种拒绝服务攻击,它利用了大多数正则表达式实现可能达到导致它们工作非常缓慢的极端情况的事实(指数级相关的输入大小)。然后,攻击者可以使用正则表达式导致程序进入这些极端情况,然后挂起很长时间......

完整来源:https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS