|
正则表达式拒绝服务(ReDoS)——邪恶字符串导致的CPU炸弹 摘要:正则表达式拒绝服务(ReDoS, Regular Expression Denial of Service)攻击利用某些低效正则表达式(具有“灾难性回溯”特性),通过精心构造的字符串使正则引擎CPU占用飙升,导致服务不可用。黑客利用此漏洞可瞬间拖垮应用。本文讲解易受攻击的正则模式,并提供替代引擎、输入长度限制和超时机制。 关键词:黑客网站攻击;ReDoS;渗透测试;拒绝服务;正则表达式安全 一、引言正则表达式是处理字符串的强大工具,但不当的写法可能导致指数级回溯。例如,正则^(a+)+$匹配字符串aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!时,需要进行2^N次回溯。黑客利用此特性发起ReDoS攻击,瘫痪服务器。 二、ReDoS原理2.1 危险模式2.2 攻击示例服务端代码: [size=12.573px]javascript
app.get('/search', (req, res) => { let pattern = req.query.pattern; let input = req.query.input; let re = new RegExp(pattern); if (re.test(input)) res.send("Match"); else res.send("No match");});
黑客提供pattern为(a+)+,input为一长串a加一个!,服务器CPU瞬间满载。 三、防御措施使用非回溯引擎:Google RE2、Rust的regex库等保证线性时间。 限制输入长度:例如最长100字符,极大降低回溯爆炸可能性。 设置正则执行超时:如Node.js的--regexp-timeout,Python的timeout装饰器。 避免动态构造用户提供的正则表达式;如果必须,使用安全子集或强制超时。 代码审计:扫描危险正则模式。
四、总结ReDoS是一种低带宽高杀伤力的DoS攻击。防御核心是杜绝用户控制的正则表达式 + 输入长度限制 + 超时机制。
|