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

Регулярные выражения могут вызвать ReDoS

Gixy Check ID: regex_redos

Некоторые регэкспы вызывают катастрофический перебор. Злоумышленник может подобрать входные данные, из‑за которых движок регэкспов потребит много CPU и вызовет отказ в обслуживании.

Небезопасный пример

# Катастрофический перебор на длинных цепочках "a"
location ~ ^/(a|aa|aaa|aaaa)+$ {
    return 200 "ok";
}

Путь вроде /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab способен надолго загрузить CPU.

Более безопасные альтернативы

  • Ставьте якоря и упрощайте шаблоны; избегайте вложенных альтернатив и неоднозначных повторов
  • Предпочитайте конструкции с линейной сложностью
  • Ограничивайте длину входа до применения дорогостоящих регэкспов
# Безопаснее: заякорено и упрощено
location ~ ^/a+$ {
    return 200 "ok";
}

Зачем это важно

Неудачные регэкспы в location и других директивах могут эксплуатироваться удалённо. Держите шаблоны простыми и заякоренными, избегайте конструкций, известных взрывом перебора.

Укрепляйте NGINX с поддерживаемыми RPM

Используйте NGINX Extras от GetPageSpeed для постоянно обновляемого NGINX и модулей на RHEL/CentOS/Alma/Rocky. Подробнее.