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)限制回溯
防御措施
- 避免复杂正则(嵌套量词、重复分支)
- 设置匹配超时时间
- 严格验证和过滤用户输入
- 升级正则引擎库