【问题标题】:SonarQube showing Regular expression Denial of Service (ReDoS)SonarQube 显示正则表达式拒绝服务 (ReDoS)
【发布时间】:2022-01-12 13:48:29
【问题描述】:

我在 JavaScript 中使用正则表达式验证日期,但是当我运行 SonarQube 进行代码分析时。它将正则表达式显示为安全漏洞。

示例 1:

下面是正则表达式模式(链接到正则表达式的来源https://stackoverflow.com/a/15504877/13353721):

^(?:(?: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:

对于浮动值,我使用了下面的正则表达式

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

SonarQube 抛出了同样的安全错误,我尝试了各种不同的正则表达式模式,但它不起作用。

【问题讨论】:

  • 根据this Sonarsource documenation此规则标记任何硬编码正则表达式的执行,该正则表达式具有至少 3 个字符和至少两个以下任何字符的实例:*+{.我>。因此,您必须确保您的模式符合规则。
  • @WiktorStribiżew 对于我使用momentjs的日期,它现在正在工作,但浮动不工作,我必须做些什么改变你能建议吗?
  • 好吧,从错误描述来看,尝试通过变量构建它,var d = "\\d{1,5}"; var float_rx = new RegExp("^" + d + "(?:\\." + d + ")?$")
  • @WiktorStribiżew 谢谢你的回复,如果我这样创建 var d = "^\d{1,5}(?:\.\d{1,5})?$"; var float_rx = new RegExp(d) 它也在工作我不知道它是如何工作的。

标签: javascript regex sonarqube


【解决方案1】:

热点与漏洞

首先请注意,SonarQube 通知您的是安全热点,而不是漏洞。这意味着(引自the docs):

安全热点突出显示开发人员需要审查的安全敏感代码段。经过审查,您会发现没有威胁,或者您需要应用修复程序来保护代码。

[...]

使用热点时,会突出显示对安全敏感的代码段,但可能不会影响整体应用程序的安全性。由开发人员检查代码以确定是否需要修复来保护代码。

这里重要的一点是,SonarQube 并没有告诉您有什么问题。它告诉您应该仔细查看代码以确定是否有问题。

换句话说,它告诉您您的正则表达式可能容易受到 ReDoS 攻击,但实际上并非如此。如果您查看代码并确定不存在漏洞,则无需更改任何内容即可忽略该问题。

那么,SonarQube 究竟为什么要告诉您检查此代码?

SonarQube 实际上并不检测正则表达式是否容易受到 ReDoS 攻击(这就是为什么它被标记为安全热点,而不是漏洞)。相反,它会标记所有重要的正则表达式,并提醒您检查它们以确定它们是否易受攻击。正如the documentation of the rule 中所解释的,它认为任何包含不止一次出现的任何字符*+{ 的正则表达式都是重要的。

由于您的两个正则表达式都符合该标准,因此都被标记。

更新:以上内容适用于编写此答案时的 ReDoS 规则。同时,该规则已被弃用,取而代之的是一条新规则,该规则只应抱怨实际上具有超线性运行时的正则表达式。新规则不会抱怨这个问题中的正则表达式。

那么您的代码是否容易受到攻击?

不,您的正则表达式都不容易受到攻击。事实上,在任一表达式中使用的唯一重复运算符是 {},由于您在所有情况下都提供了上限,因此甚至没有任何无限重复。

但是,我想说您的第一个正则表达式非常复杂,足以成为可读性和维护方面的噩梦。所以你应该考虑用另一种方法替换它(例如将字符串拆分为单独的数字并检查每个数字是否在所需的范围内)。

那你该怎么办?

确定正则表达式不易受到攻击后,您应该关闭热点。

在 cmets 中指出,如果您将正则表达式字符串拆分为多个连接字符串或将其移动到变量中,该消息将消失。起作用的原因很简单,就是它欺骗 SonarQube 找不到正则表达式。因此,该更改不会使您的代码更好或更安全,只会使 SonarQube 感到困惑,并且绝不比仅仅关闭消息更可取。通常不建议为了让您的静态分析工具闭嘴而混淆您的代码。

【讨论】:

    猜你喜欢
    • 2023-01-06
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2021-08-02
    相关资源
    最近更新 更多