SonarQube显示正则表达式拒绝服务(ReDoS)

问题描述 投票:0回答:1

我在JavaScript中使用regex验证日期,但当我运行SonarQube进行代码分析时,它显示regex为安全漏洞。它显示regex是一个安全漏洞。

例子1.下面是regex模式(链接到regex源)。

以下是regex模式(链接到regex源码) https:/stackoverflow.coma1550487713353721。):

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

例2:

对于浮动值,我使用了下面的regex

^\d{1,5}(?:\.\d{1,5})?$

SonarQube正在抛出相同的安全错误,我尝试了各种不同的regex模式,但它没有工作。

javascript regex sonarqube
1个回答
2
投票

热点与漏洞

首先要注意,SonarQube通知你的是一个安全热点,而不是一个漏洞。这意味着(引用自 文献):

安全热点会突出显示一个安全敏感的代码,开发者需要审查。在审查后,你会发现没有威胁,或者你需要应用一个修复程序来保护代码。

[...]

有了热点,安全敏感代码就会被突出显示,但整体的应用程序安全可能不会受到影响。这取决于开发人员审查代码,以确定是否需要修复以确保代码安全。

这里的重要启示是,SonarQube不是告诉你有什么问题。它是告诉你,你应该仔细查看代码,以确定 是否 有问题。

换句话说,它在告诉你,你的regex 是易受ReDoS攻击的,而不是说它实际上是易受攻击的。如果你审查了代码,确定没有漏洞,完全可以不改任何东西,直接否定这个问题。

那么SonarQube到底为什么要让你审查这段代码呢?

SonarQube实际上并不检测一个正则表达式是否对ReDoS有漏洞(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它标记了所有非平凡的正则表达式,并提醒你审查它们以确定它们是否脆弱。正如在 规则的文件它认为任何包含一个以上的字符的regex都是非平凡的。*+{.

由于你的两个正则表达式都是非平凡的那个标准,所以都被标记了。

那么你的代码是否存在漏洞?

不,你的两个正则表达式都不存在漏洞。事实上,这两个表达式中唯一使用的重复操作符是 {} 而且由于你在所有情况下都提供了一个上限,所以甚至没有任何无限制的重复。

然而,我想说你的第一个regex足够复杂,是一个可读性和维护的噩梦。所以,你应该考虑用另一种方法来代替它(比如将字符串分割成单个数字,并检查每个数字是否在所需范围内)。

那么你应该怎么做呢?

在确定正则表达式没有漏洞后,你应该驳回这个热点。

在评论中指出,如果你把regex字符串拆成多个并列的字符串,或者把它移到一个变量中,这个消息就会消失。这样做的原因很简单,就是欺骗SonarQube,让它找不到regex。所以,这种改变不会让你的代码变得更好或更安全,它只会让SonarQube感到困惑,绝不是比直接驳回消息更可取。一般来说,为了让你的静态分析工具闭嘴而混淆你的代码是不可取的。

© www.soinside.com 2019 - 2024. All rights reserved.