我如何以编程方式识别邪恶的正则表达式?

时间:2015-12-02 12:17:09

标签: javascript regex security denial-of-service automaton

是否有算法来确定给定的JavaScript正则表达式是否容易受ReDoS攻击?该算法不一定非常完美 - 一些误报和漏报是可以接受的。 (我对ECMA-262正则表达式特别感兴趣。)

2 个答案:

答案 0 :(得分:2)

如果没有实际运行它,很难验证正则表达式是否是邪恶的。您可以尝试检测Wiki中详述的一些模式并概括它们:

e.g。对于

  • (A +)+
  • ([A-ZA-Z] +)*
  • (A | AA)+
  • (A |?一个)+
  • (。* a){x}表示x> 10

您可以检查)+)*){序列并对其进行验证。但是,我保证攻击者会找到他们的方式。

本质上它是minefield to allow user set regexps。但是,如果您可以超时正则表达式搜索,则终止该线程,然后将该正则表达式标记为" bad"你可以稍微减轻威胁。如果以后使用regexp,也许你可以通过在入口点的预期输入上运行它来验证它吗?

稍后,如果在后期评估的文本与正则表达式具有不同的效果并将其标记为坏,则仍需要能够终止它,以便在没有用户干预的情况下不再使用它。

答案 1 :(得分:0)

TL; DR 排序,但不完全

In [9]: re.compile("(a+)+", re.DEBUG)
max_repeat 1 4294967295
  subpattern 1
    max_repeat 1 4294967295
      literal 97

请注意那些嵌套的重复1..N ,对于大N来说,那是坏事。

除了(a|aa)+a*b?a*x之外,它还会处理所有Wikipedia示例。

同样,如果您的引擎支持反向引用,则难以考虑反向引用。

IMO邪恶的正则表达式是两个因素的结合:组合爆炸和发动机实施中的疏忽。因此,最坏的情况还取决于正则表达式引擎和有时标志。回溯并不总是很容易识别。

然而,可以确定简单的案例。