Перейти к содержанию

Регулярные выражения могут вызвать 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. Подробнее.