Регулярные выражения могут вызвать ReDoS¶
Gixy Check ID: regex_redos
Некоторые регэкспы вызывают катастрофический перебор. Злоумышленник может подобрать входные данные, из‑за которых движок регэкспов потребит много CPU и вызовет отказ в обслуживании.
Небезопасный пример¶
# Катастрофический перебор на длинных цепочках "a"
location ~ ^/(a|aa|aaa|aaaa)+$ {
return 200 "ok";
}
Путь вроде /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab способен надолго загрузить CPU.
Более безопасные альтернативы¶
- Ставьте якоря и упрощайте шаблоны; избегайте вложенных альтернатив и неоднозначных повторов
- Предпочитайте конструкции с линейной сложностью
- Ограничивайте длину входа до применения дорогостоящих регэкспов
# Безопаснее: заякорено и упрощено
location ~ ^/a+$ {
return 200 "ok";
}
Зачем это важно¶
Неудачные регэкспы в location и других директивах могут эксплуатироваться удалённо. Держите шаблоны простыми и заякоренными, избегайте конструкций, известных взрывом перебора.
Глубокий анализ¶
pip install 'gixy-ng[deep]'
gixy --deep /etc/nginx/nginx.conf
ReDoctor является необязательной зависимостью; обычная установка Gixy и RPM без него продолжают использовать быстрый встроенный анализ. В режиме --deep Gixy передаёт анализ библиотеке ReDoctor, которая сочетает автоматы с ограниченным фаззингом в собственной безопасной regex-VM. Это выявляет экспоненциальную и полиномиальную неоднозначность, включая нелокальные случаи вроде .*a.*a. Gixy сохраняет извлечение шаблонов и отчёты для nginx, а при результате unknown или ошибке использует обычный структурный анализ. Всё выполняется локально; runtime recall отключён, поэтому nginx-шаблоны не исполняются backtracking-движком Python.
Укрепляйте NGINX с поддерживаемыми RPM
Используйте NGINX Extras от GetPageSpeed для постоянно обновляемого NGINX и модулей на RHEL/CentOS/Alma/Rocky. Подробнее.