最近项目上在做Fortify安全漏洞扫描。其中有一项漏洞扫描规则为:Denial of Service: Regular Expression。是由于正则表达式带来的DOS攻击。
由于Fortify的扫描不够绝对的智能,因此,它将所有出现了正则表达式的代码,甚至String.split(regex)统统认为有正则表达式带来的DOS攻击风险。
项目上有很多同事来询问该扫描规则的含义以及修改方式。我也上网查询并且做了一些测试。实际上,该漏洞扫描规则主要需要了解的,是关于正则表达式的灾难性回溯(catastrophic backtracking)。
用如下一个简单的正则表达式来实际操作,会很简单明了的看到问题所在:
正则表达式1:(a+)*
正则表达式2:(a+)*s
这两个正则表达式看上去很相似,第二个仅仅是要求最后必须匹配为s。
我们再分别用两个不同的字符串来匹配。
input1:aaaaaaaaas
input2:aaaaaaaaab
匹配结果应该是显而易见的:
正则表达式1和input1匹配:true
正则表达式1和input2匹配:true
正则表达式2和input1匹配:true