【问题标题】:Is Java ReDos vulnerable?Java ReDos 是否易受攻击?
【发布时间】:2018-10-29 15:31:45
【问题描述】:

我尝试使用 jshell 重新创建 regular expression denial of service attack 使用 (a+)+ 正则表达式和 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!(带有大量 a)输入:

Pattern.compile("(a+)+")
    .matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!")
    .matches()

但是每次我尝试时都会很快完成。 Java中的正则表达式实现与其他实现不同吗?或者链接的维基百科页面有误?

(顺便说一句。我使用的是 Java 11,如果相关的话)

编辑:看起来它与 Java 版本相关,当我在 Java 8 上尝试它时,它挂起,但在 Java 9 和 11 中它可以立即工作。这些版本之间有什么变化可能会影响到这一点?现在所有的正则表达式在 Java 中都是安全的吗?

是否有特定的 Java JEP 改变了正则表达式的实现?我想知道哪种正则表达式对于较新的 Java 来说仍然是个问题。

【问题讨论】:

  • @PM77-1 我尝试了该页面中的代码,它也运行得很快,并按照那里的描述打印结果。
  • 您的模式适用于大多数正则表达式引擎。这种模式的唯一问题是当它被其他一些模式遵循时。
  • @WiktorStribiżew 不是真的。 Java 的引擎可能会变得更好一些,但只需将其更改为 ((a+)+)+ 就会使其再次挂起。并且可以证明,每个额外的嵌套,即(((a+)+)+)+((((a+)+)+)+)+ 都会增加复杂度,因此 Java 的引擎还没有学会处理这种模式,它只是在嵌套迭代方面变得更好了一点。
  • @Holger 试试(a)(\1*)+x。我怀疑许多引擎是否具有防止反向引用重复模式的保护。虽然这不是一种常见的模式。

标签: java regex security java-11


【解决方案1】:

根据RSPEC-2631的文章,Java 9 及更高版本已经处理了 ReDoS 问题:

像 OpenJDK 9+ 这样的 Java 运行时通过在正则表达式求值的实现中提供额外的保护来缓解这个问题。在这些运行时,上面的示例不会受到攻击。

【讨论】:

    【解决方案2】:

    我目前正在运行 Java 8,但以下代码挂起:

    Pattern.compile("(a|aa)+")
           .matcher("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab")
           .matches()
    

    看到您如何使用 Java 11(并且还使用 Java 9/10 对其进行了测试)并看到它需要很短的时间才能完成,显然这些版本之间发生了变化。

    通过查看 Java 11 中 Matcher 的源代码,我们发现 Java 8 中不存在以下添加:

    /**
     * Storage used by top greedy Loop node to store a specific hash set to
     * keep the beginning index of the failed repetition match. The nodes
     * themselves are stateless, so they rely on this field to hold state
     * during a match.
     */
    IntHashSet[] localsPos;
    

    这种本地存储以及添加的大量其他代码似乎是 Java 9+ 中的正则表达式状态机完成速度比 Java 8 及更低版本快得多的主要原因之一。

    【讨论】:

    • 再次,它在一秒钟内完成(并返回false
    • @KrzysztofKrasoń 如果不使用 JShell 运行会怎样?
    • 它在 Java 11 上表现相同,执行速度很快,但在 Java 8 上它像上面描述的那样挂起。
    • IMO,这目前无法回答问题。它也没有添加任何额外的信息。 :|
    • @nullpointer 似乎是这样,因为在我回答问题是特定于版本的问题后,OP 编辑​​了问题。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2023-01-06
    • 2016-04-04
    • 2016-04-29
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多