类型: 安全缺陷

    正则表达式引擎分成两类:一类称为DFA(确定性有限状态自动机),另一类称为NFA(非确定性有限状态自动机)。Java使用的是NFA正则引擎,使用正则式和文本比较,每碰到一个字符,就把它跟正则式比较,匹配就记下来,然后接着往下比较。一旦不匹配,就会后退直到回到上一次匹配的地方。而不可信赖数据被传递至应用程序并作为正则表达式使用,可能导致线程过度使用 CPU 资源,从而导致拒绝服务攻击。

    例如:

    (e+)+
    ([a-zA-Z]+)*
    (a|aa)+
    (a|a?)+
    ^(a+)
    +$
    以^(a+)+$为例,该正则表达式对aaaax进行匹配时需要经历24次尝试失败才会确定这个字符串不符合要求,对aaaaaaaaax进行匹配时则需要经历210次尝试,随着长度的增加,尝试次数并不是线性增长而是指数型的增长,当长度达到20、30时就会大量消耗cpu导致拒绝服务。目前已知的正则表达式实现方法均无法避免这种漏洞,所有平台和语言都容易受到这种攻击。