ReDoS攻击

ReDoS(Regular Expression Denial of Service)是正则表达式拒绝服务攻击。利用特定正则表达式的性能问题,导致CPU资源耗尽,应用瘫痪。

攻击原理

正则表达式中的嵌套量词、重复选择分支等模式,在匹配失败时会导致大量回溯操作

例如正则 ^(a|aa)*$ 匹配 aaaaaaaaaaaaaaaaaaaaaaaaaa! 时,会指数级回溯。

path-to-regexp漏洞事件

path-to-regexp包的路由规则 /:a-:b 生成正则 /^\/([^\/]+?)-([^\/]+?)\/?$/

攻击路径示例:/a${'-a'.repeat(8000)}/a,末尾的 /a 确保永不匹配,但朴素回溯仍尝试每种组合。

修复方案

引入 restrictBacktrack 函数:

  • 简单情况:返回 [^delimiter]+?(惰性匹配)
  • 复杂情况:使用负向前瞻断言 (?!prevText) 限制回溯

防御措施

  1. 避免复杂正则(嵌套量词、重复分支)
  2. 设置匹配超时时间
  3. 严格验证和过滤用户输入
  4. 升级正则引擎库

关联