正则表达式可能导致 ReDoS¶
Gixy Check ID: regex_redos
某些正则表达式会出现灾难性回溯。攻击者可以构造输入,令正则引擎消耗大量 CPU,导致拒绝服务。
不安全示例¶
# 对长串 "a" 发生灾难性回溯
location ~ ^/(a|aa|aaa|aaaa)+$ {
return 200 "ok";
}
像 /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab 这样的路径,可能长时间占用 CPU。
更安全的替代方案¶
快速分析仅在必需的分隔符不可能属于重复字符类时,才证明嵌套重复安全,
例如 ([^/]+/)+。可选分隔符和无法确定的字符类不会被当作安全证明。
- 锚定并简化模式;避免嵌套的“或”与含糊的重复
- 尽量使用线性时间的明确构造
- 在应用昂贵的正则前限制输入长度
# 更安全:加锚并简化
location ~ ^/a+$ {
return 200 "ok";
}
为什么重要¶
位置匹配及其他指令中的含糊正则可被远程利用。保持模式简单并加锚,避免已知会触发回溯爆炸的构造。
深度分析¶
在已启用 GetPageSpeed Extras 的 RPM 系统上:
sudo dnf install gixy-deep
gixy --deep /etc/nginx/nginx.conf
或者安装可选的 Python extra:
pip install 'gixy-ng[deep]'
gixy --deep /etc/nginx/nginx.conf
ReDoctor 是可选依赖;未安装它时,普通 Gixy 仍使用内置的快速启发式检查。
gixy-deep 元包添加与 Python extra gixy-ng[deep] 相同的深度分析依赖,
而基础 RPM 保持独立。--deep 模式把正则分析交给
ReDoctor:它结合自动机分析与安全自定义
正则 VM 中的受限模糊测试,可检测指数级和多项式级歧义,包括 .*a.*a
这类非局部模式。Gixy 仍负责 nginx 模式提取和报告;遇到 unknown 或错误
结果时会回退到默认结构检查。所有分析均在本地进行,并禁用 runtime recall,
因此不会用 Python 回溯引擎执行 nginx 正则。
在问题进入生产环境之前发现它
GetPageSpeed Amplify 按计划在每台 NGINX 主机上运行 Gixy,并在出现新问题和 CVE 时发出告警,同时展示运行时指标。 设置持续监控.